<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
単語と発音情報のすばらしいファイルが にあります。カーネギーメロン大学.10万以上の単語とバリエーション。彼らのウェブサイトから: "そのエントリは、英語の発音の標準であるARPAbet音素セットの単語から発音へのマッピングを備えているため、音声認識と合成に特に役立ちます。 現在の音素セットには 39 の音素が含まれており、母音には語彙強調マーカーが付いています"。ファイルの典型的な行は次のようになります
ルナラウンド R AH1 N AH0 R AW2 ND
ファイルは簡単に操作できます。各行は 1 つの改行文字で終わり、単語は 2 つのスペースでデータから区切られ、各データ項目は 1 つのスペースで区切られます。データ項目は、このようなエントリを持つ別のファイルに記述されています
Phoneme Example Translation ------- ------- ----------- AA odd AA D AE at AE T AH hut HH AH T AO ought AO Tfor 39 phonemes.
100K 以上の単語を連想配列にロードする JSL を次に示します。
source = Load Text File( "$DESKTOP/grammar/cmudict-0.7b",charset("windows-1252") );symbols = Load Text File( "$DESKTOP/grammar/cmudict-0.7b.symbols" );symlist = Words( symbols, "\!n" );symPat = symlist; // make a copySubstitute Into( symPat, Expr( {} ), Expr( Pat Altern() ) ); // convert list to alternation patternsympat = Eval( sympat ); // build the pattern, oncelineEnding = "\!n";commentLine = ";" + Pat Break( lineEnding ) + lineEnding;dataLine = Pat Break( " " ) >> word + " " + Pat Repeat( " " + symPat ) >> pronounce[word] + lineEnding;pronounce = Associative Array();rc = Pat Match( source, Pat Pos( 0 ) + Pat Repeat( (dataLine | commentLine) + Pat Fence() ) + Pat R Pos( 0 ) );if( rc, Show( pronounce["ELEPHANTS"] ), print("failed"));発音["象"] = " EH1 L AH0 F AH0 NT S";
1 行目と 2 行目では、ダウンロードしたファイルをデスクトップ上のフォルダーから JSL 文字列に読み込みます。巨大なファイルには、上記の RUNAROUND の例のようなエントリがあります。小さなファイルには、各行に 1 つの音素があります。これらのシンボルは、3 行目のリストにロードされます。words() 関数は、改行を使用してテキストを個々の単語のリストに分割します。symlist は単語を保持し、4 行目でコピーが sympat で作成されます。
5 行目の SubstituteInto() は、コンマ区切り文字列の JSL リスト式を操作し、コンマ区切り文字列のリストを使用して Pat Altern() への JSL 関数呼び出しに変換します。6 行目は Pat Altern() 関数を評価し、実際のパターン値を生成します。これは、この JSL を構築して評価することとほぼ同じです。
sympat = "AA" | "AA0" | ... | "Z" | "ZH"; // 39 phonemes in all
式の操作は高度なトピックであり、非常に便利です。
7 行目では、単純な改行文字列を JSL 変数に割り当てています。エスケープシーケンスよりも変数名の方が読みやすいです。行 8 は、巨大なファイルでコメント行がどのように表示されるかを示しています。行 8 がスキップするコメントのブロックは次のとおりです。
;;; # CMUdict -- Major Version: 0.07;;; # ========================================================================;;; # Copyright (C) 1993-2015 Carnegie Mellon University. All rights reserved.;;; # Redistribution and use in source and binary forms, with or without;;; # modification, are permitted provided that the following conditions;;; # are met:;;; # 1. Redistributions of source code must retain the above copyright;;; # notice, this list of conditions and the following disclaimer.;;; # The contents of this file are deemed to be source code.;;; # 2. Redistributions in binary form must reproduce the above copyright;;; # notice, this list of conditions and the following disclaimer in;;; # the documentation and/or other materials provided with the;;; # distribution.;;; # This work was supported in part by funding from the Defense Advanced;;; # Research Projects Agency, the Office of Naval Research and the National;;; # Science Foundation of the United States of America, and by member;;; # companies of the Carnegie Mellon Sphinx Speech Consortium. We acknowledge;;; # the contributions of many volunteers to the expansion and improvement of;;; # this dictionary.;;; # THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND;;; # ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,;;; # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR;;; # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY;;; # NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,;;; # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT;;; # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,;;; # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY;;; # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT;;; # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE;;; # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
行 9 は、ヒュージ ファイル内のデータ行を記述します。ライン 9 は多くの作業を行います。
dataLine = Pat Break( " " ) >> word + " " + Pat Repeat( " " + symPat ) >> 発音[単語] + lineEnding;
PatBreak() はテキストを空白まで一致させ、テキストを言葉.単語の後に 2 つの空白があります。そのうちの 1 つは patRepeat の前に一致し、そのうちの 1 つは最初に patRepeat がそのパターンを実行するまでに一致します。patRepeat パターンは、symPat を使用してすべての音素を検証します。不適切な音素が存在する場合、PatMatch は失敗し、連想配列辞書の一部のみが読み込まれます。
patRepeat は GREEDY であり、可能な限り、空白と symPats を飲み込みます。lineEnding に達すると、それ以上先に進むことができず、>> 即時代入演算子が繰り返された一致を発音 [単語] に格納します。魔法!インデックス発音に使用される単語の値は、ちょうど一致した値です!辞書エントリが作成されました。
10 行目は、連想配列であるディクショナリを作成します。9 行目でパターンを定義した後に作成しても問題ありません。パターンは次の行まで実行されません。
発音=連想配列();
11行目:
rc = Pat Match( source, Pat Pos( 0 ) + Pat Repeat( (dataLine | commentLine) + Pat Fence() ) + Pat R Pos( 0 ) );
PatPos と PatRpos を使用して、文字列全体が一致していることを確認します。その間に、データ行またはコメント行のいずれかを 10 万回以上解析する別の PatRepeat があります。PatFence は、バックトラッキング情報を保存しないようにパターン マッチャーに指示する最適化です。パターンが最後近くで失敗した場合、バックトラックにより、マッチャーはバックアップして別の選択肢を試すことができます。このファイルの場合、それは無意味であり、すべてのバックトラッキング情報を保持するために必要なメモリは大きくなります。PatFence ヒントはそれを高速化します。
発音[「ゼブラ」]
「 Z IY1 BR AH0」
発音[「ツチブタ」]
「AA1 RDV AA2 R K」
発音[「SUPERCALIFRAGILISTICEXPEALIDOSHUS」]
" S UW2 PER0 K AE2 L AH0 FR AE1 JH AH0 L IH2 ST IH0 K EH2 KSP IY0 AE2 L AH0 D OW1 SH AH0 S"
CMU データをダウンロードする場所によっては、行末と間隔が乱雑になる場合があります。 以下は、それをより適切に処理する必要があります。
source = Load Text File( "z:/cmudict-0.7b.txt",charset("windows-1252") );
symbols = Load Text File( "z:/cmudict-0.7b.symbols.txt" );
symlist = Words( symbols, "\!n" );
symPat = symlist; // make a copy
Substitute Into( symPat, Expr( {} ), Expr( Pat Altern() ) ); // convert list to alternation pattern
sympat = Eval( sympat ); // build the pattern, once
lineEnding = "\!n\!r";
commentLine = ";;;" + Pat Break( lineEnding ) + patspan(lineEnding);
dataLine = Pat Break( " " ) >> word + " " + Pat Repeat( patspan(" ") + symPat ) >> pronounce[word] + patspan(lineEnding);
pronounce = Associative Array();
rc = Pat Match( source, Pat Pos( 0 ) + Pat Repeat( (dataLine | commentLine ) + Pat Fence() ) + Pat R Pos( 0 ) );
if( rc, Show( pronounce["ELEPHANTS"] ), print("failed"));これは、(LF だけでなく) 行末の CR と LF の多くの組み合わせを処理し、単語と発音の間の時折発生する 3 つ以上のスペースを処理するため、もう少し堅牢である必要があります。