Allosaurusは、前提条件のユニバーサル電話認定者です。 2000以上の言語で電話を認識するために使用できます。
このツールは、多言語アロフォンシステムを使用したICASSP 2020作業のユニバーサル電話認識に基づいています
AllosaurusはPIPから入手できます
pip install allosaurus
このリポジトリとインストールをクローンすることもできます
python setup.py install
基本的な使用法は非常に簡単です。入力はWAVオーディオファイルであり、出力は一連の電話です。
python -m allosaurus.run -i < audio >
たとえば、このリポジトリで添付のサンプルファイルを使用してみてください。このオーディオファイルに何が含まれているかを推測してください:)
python -m allosaurus.run -i sample.wav
æ l u s ɔ ɹ s
Pythonで直接Allosaurusを使用することもできます
from allosaurus . app import read_recognizer
# load your model
model = read_recognizer ()
# run inference -> æ l u s ɔ ɹ s
model . recognize ( 'sample.wav' )
完全な機能と詳細については、次のセクションを参照してください。
コマンドラインインターフェイスは次のとおりです。
python -m allosaurus.run [--lang < language name > ] [--model < model name > ] [--device_id < gpu_id > ] [--output < output_file > ] [--topk < int > ] -i < audio file/directory >
オーディオファイル内の狭い電話が認識されます。入力引数のみが必須であり、他のオプションは無視できます。詳細については、次のセクションを参照してください。
次のように、単純なPythonインターフェイスもあります。
from allosaurus . app import read_recognizer
# load your model by the <model name>, will use 'latest' if left empty
model = read_recognizer ( model )
# run inference on <audio_file> with <lang>, lang will be 'ipa' if left empty
model . recognize ( audio_file , lang )
両方のインターフェースの引数の詳細は次のとおりです。
入力は、単一のファイルまたは複数のオーディオファイルを含むディレクトリにすることができます。
入力が単一のファイルの場合、電話シーケンスのみが出力されます。入力がディレクトリである場合、ファイル名と電話シーケンスの両方が出力され、結果はファイル名でソートされます。
オーディオファイルは、次の形式である必要があります。
WAVファイルである必要があります。オーディオがWAV形式でない場合は、SoxまたはFFMPEGを使用してオーディオをWAV形式に変換してください。
サンプリングレートは任意である可能性があります。モデルの要件に基づいて自動的にリサンプします。
オーディオはモノチャネルオーディオであると仮定します。
出力はデフォルトでstdoutです(つまり、すべての結果を端末に印刷します)。
ファイルを出力として指定すると、すべての出力がそのファイルに向けられます。
lang
オプションは言語IDです。使用する電話インベントリを指定することです。デフォルトのオプションはipa
で、在庫全体(約230電話)を使用するように認識者に指示します。
一般に、言語在庫を指定すると、認識の正確性が向上する可能性があります。
次のコマンドで完全な言語リストを確認できます。利用可能な言語の数は約2000です。
python -m allosaurus.bin.list_lang
言語のインベントリを確認するには、次のコマンドを使用できます
python -m allosaurus.bin.list_phone [--lang < language name > ]
例えば、
# to get English phone inventory
# ['a', 'aː', 'b', 'd', 'd̠', 'e', 'eː', 'e̞', 'f', 'h', 'i', 'iː', 'j', 'k', 'kʰ', 'l', 'm', 'n', 'o', 'oː', 'p', 'pʰ', 'r', 's', 't', 'tʰ', 't̠', 'u', 'uː', 'v', 'w', 'x', 'z', 'æ', 'ð', 'øː', 'ŋ', 'ɐ', 'ɐː', 'ɑ', 'ɑː', 'ɒ', 'ɒː', 'ɔ', 'ɔː', 'ɘ', 'ə', 'əː', 'ɛ', 'ɛː', 'ɜː', 'ɡ', 'ɪ', 'ɪ̯', 'ɯ', 'ɵː', 'ɹ', 'ɻ', 'ʃ', 'ʉ', 'ʉː', 'ʊ', 'ʌ', 'ʍ', 'ʒ', 'ʔ', 'θ']
python -m allosaurus.bin.list_phone --lang eng
# you can also skip lang option to get all inventory
#['I', 'a', 'aː', 'ã', 'ă', 'b', 'bʲ', 'bʲj', 'bʷ', 'bʼ', 'bː', 'b̞', 'b̤', 'b̥', 'c', 'd', 'dʒ', 'dʲ', 'dː', 'd̚', 'd̥', 'd̪', 'd̯', 'd͡z', 'd͡ʑ', 'd͡ʒ', 'd͡ʒː', 'd͡ʒ̤', 'e', 'eː', 'e̞', 'f', 'fʲ', 'fʷ', 'fː', 'g', 'gʲ', 'gʲj', 'gʷ', 'gː', 'h', 'hʷ', 'i', 'ij', 'iː', 'i̞', 'i̥', 'i̯', 'j', 'k', 'kx', 'kʰ', 'kʲ', 'kʲj', 'kʷ', 'kʷʼ', 'kʼ', 'kː', 'k̟ʲ', 'k̟̚', 'k͡p̚', 'l', 'lʲ', 'lː', 'l̪', 'm', 'mʲ', 'mʲj', 'mʷ', 'mː', 'n', 'nj', 'nʲ', 'nː', 'n̪', 'n̺', 'o', 'oː', 'o̞', 'o̥', 'p', 'pf', 'pʰ', 'pʲ', 'pʲj', 'pʷ', 'pʷʼ', 'pʼ', 'pː', 'p̚', 'q', 'r', 'rː', 's', 'sʲ', 'sʼ', 'sː', 's̪', 't', 'ts', 'tsʰ', 'tɕ', 'tɕʰ', 'tʂ', 'tʂʰ', 'tʃ', 'tʰ', 'tʲ', 'tʷʼ', 'tʼ', 'tː', 't̚', 't̪', 't̪ʰ', 't̪̚', 't͡s', 't͡sʼ', 't͡ɕ', 't͡ɬ', 't͡ʃ', 't͡ʃʲ', 't͡ʃʼ', 't͡ʃː', 'u', 'uə', 'uː', 'u͡w', 'v', 'vʲ', 'vʷ', 'vː', 'v̞', 'v̞ʲ', 'w', 'x', 'x̟ʲ', 'y', 'z', 'zj', 'zʲ', 'z̪', 'ä', 'æ', 'ç', 'çj', 'ð', 'ø', 'ŋ', 'ŋ̟', 'ŋ͡m', 'œ', 'œ̃', 'ɐ', 'ɐ̞', 'ɑ', 'ɑ̱', 'ɒ', 'ɓ', 'ɔ', 'ɔ̃', 'ɕ', 'ɕː', 'ɖ̤', 'ɗ', 'ə', 'ɛ', 'ɛ̃', 'ɟ', 'ɡ', 'ɡʲ', 'ɡ̤', 'ɡ̥', 'ɣ', 'ɣj', 'ɤ', 'ɤɐ̞', 'ɤ̆', 'ɥ', 'ɦ', 'ɨ', 'ɪ', 'ɫ', 'ɯ', 'ɯ̟', 'ɯ̥', 'ɰ', 'ɱ', 'ɲ', 'ɳ', 'ɴ', 'ɵ', 'ɸ', 'ɹ', 'ɹ̩', 'ɻ', 'ɻ̩', 'ɽ', 'ɾ', 'ɾj', 'ɾʲ', 'ɾ̠', 'ʀ', 'ʁ', 'ʁ̝', 'ʂ', 'ʃ', 'ʃʲː', 'ʃ͡ɣ', 'ʈ', 'ʉ̞', 'ʊ', 'ʋ', 'ʋʲ', 'ʌ', 'ʎ', 'ʏ', 'ʐ', 'ʑ', 'ʒ', 'ʒ͡ɣ', 'ʔ', 'ʝ', 'ː', 'β', 'β̞', 'θ', 'χ', 'ә', 'ḁ']
python -m allosaurus.bin.list_phone
model
オプションは、推論のモデルを選択することです。デフォルトのオプションはlatest
、ダウンロードした最新モデルを指しています。ローカルモデルがない場合は、最初の推論中に最新モデルを自動的にダウンロードします。
新しいモデルをトレーニングし、継続的にリリースする予定です。更新には、アコースティックモデルのバイナリファイルと電話インベントリの両方が含まれる場合があります。通常、モデルの名前はトレーニングの日付を示しているため、通常、より高いモデルIDのパフォーマンスが向上することが予想されるはずです。
新しいモデルをダウンロードするには、次のコマンドを実行できます。
python -m allosaurus.bin.download_model -m < model >
モデル名がわからない場合は、 latest
モデル名を使用するだけで、最新のモデルを自動的にダウンロードできます。
新しいモデルに更新しても、元のモデルは削除されないことに注意してください。すべてのモデルは、Allosaurusをインストールしたpretrained
ディレクトリの下に保存されます。モデルを修正して、1つの実験中に一貫した結果を得ることをお勧めします。
ローカル環境でどのモデルが利用可能かを確認するには、次のコマンドを確認できます
python -m allosaurus.bin.list_model
モデルを削除するには、次のコマンドを使用できます。これは、後で言及したモデルを微調整している場合に役立つ場合があります。
python -m allosaurus.bin.remove_model
現在利用可能なモデルは次のものです
ユニバーサルモデルは、言語に依存しない携帯電話を予測し、多くの言語をカバーしています。これは、Allosaurusがダウンロードして使用しようとするデフォルトのモデルです。言語依存モデルで言語を見つけることができない場合は、代わりにこのユニバーサルモデルを使用してください。
モデル | ターゲット言語 | 説明 |
---|---|---|
uni2005 | ユニバーサル | これはlatest モデルです(以前は200529 と名付けられました) |
いくつかの広く使用されている言語の言語依存モデルを提供することを計画しています。ここのモデルは、特にターゲット言語でトレーニングされています。ターゲット言語のユニバーサルモデルよりもはるかに優れたパフォーマンスを発揮する必要があります。これらのモデルは自動的にダウンロードされません。上記のdownload_model
コマンドを使用してダウンロードし、推論中に--model
フラグを使用してください。
モデル | ターゲット言語 | 説明 |
---|---|---|
eng2102 | 英語(ENG) | 英語のみのモデル |
device_id
推論を実行するデバイスを制御します。
デフォルトでは、device_idは-1であり、モデルがCPUのみを使用することを示します。
ただし、GPUがある場合は、Device_IDを単一のGPU IDに指定することにより、推論に使用できます。 (複数のGPU推論はサポートされていないことに注意してください)
timestamp
引数を使用して、認識された各電話の近似タイムスタンプを取得できます。
python -m allosaurus.run --timestamp=True -i sample.wav
0.210 0.045 æ
0.390 0.045 l
0.450 0.045 u
0.540 0.045 s
0.630 0.045 ɔ
0.720 0.045 ɹ
0.870 0.045 s
ここの各行のフォーマットは、 start_timestamp duration phone
で、 start_timestamp
とduration
が秒単位で表示されます。
現在のタイムスタンプは近似にすぎないことに注意してください。これは、CTCモデルによって提供されています。これは、その性質上、場合によっては正確ではない場合があります。
同じインターフェイスも次のようにPythonで利用できます。
model = read_recognizer ()
model . recognize ( './sample.wav' , timestamp = True )
より多くの電話を生成することが役立つ場合があります。 TOP-K ARGを指定すると、各エミッティングフレームでK電話が生成されます。デフォルトは1です。
# default topk is 1
python -m allosaurus.run -i sample.wav
æ l u s ɔ ɹ s
# output top 5 probable phones at emitting frame, "|" is used to delimit frames (no delimiter when topk=1)
# probability is attached for each phone, the left most phone is the most probable phone
# <blk> is blank which can be ignored.
python -m allosaurus.run -i sample.wav --topk=5
æ (0.577) ɛ (0.128) ɒ (0.103) a (0.045) ə (0.021) | l (0.754) l̪ (0.196) lː (0.018) ʁ (0.007) ʀ (0.006) | u (0.233) ɨ (0.218) uː (0.104) ɤ (0.070) ɪ (0.066) | s (0.301) < blk > (0.298) z (0.118) s̪ (0.084) sː (0.046) | ɔ (0.454) ɑ (0.251) < blk > (0.105) ɹ̩ (0.062) uə (0.035) | ɹ (0.867) ɾ (0.067) < blk > (0.024) l̪ (0.018) r (0.015) | s (0.740) z (0.191) s̪ (0.039) zʲ (0.009) sː (0.003)
--emit
または-e
引数を変更することにより、より多くの電話以下の電話をエミストするようにモデルに指示できます。
# default emit is 1.0
python -m allosaurus.run -i sample.wav
æ l u s ɔ ɹ s
# emit more phones when emit > 1
python -m allosaurus.run -e 1.2 -i sample.wav
æ l u s f h ɔ ɹ s
# emit less phones when emit < 1
python -m allosaurus.run -e 0.8 -i sample.wav
æ l u ɹ s
デフォルトの電話インベントリは、使用したいインベントリではない場合があるため、ここでは独自のインベントリをカスタマイズするためにいくつかのコマンドを提供します。
次のコマンドで現在の(デフォルト)インベントリを確認できると述べました。
python -m allosaurus.bin.list_phone --lang < language name >
現在の電話インベントリファイルはファイルにダンプできます
# dump the phone file
python -m allosaurus.bin.write_phone --lang < language name > --output < a path to save this file >
ファイルを見ると、各行が単一の携帯電話を表す単純な形式です。たとえば、次のものは英語ファイルです
a
aː
b
d
...
このファイルをカスタマイズして、必要なIPAを追加または削除できます。各行は、スペースのない1つのIPA電話のみを含める必要があります。 IPAがソートされている場合は、後でデバッグする方が簡単かもしれませんが、必須ではありません。
次に、次のコマンドでモデルのインベントリを更新します
python -m allosaurus.bin.update_phone --lang < language name > --input < the file you customized)
その後、ファイルはモデルに登録され、List_Phoneコマンドを再度実行すると、更新されたインベントリを使用していることがわかります。
python -m allosaurus.bin.list_phone --lang < language name >
推論を再度実行すると、結果が更新されたインベントリも反映していることも確認できます。
更新後も、元のインベントリに簡単に切り替えることができます。この場合、更新されたファイルが削除されます。
python -m allosaurus.bin.restore_phone --lang < language name >
また、各電話の以前の確率を調整することにより、結果を変更することもできます。これにより、不要な携帯電話を削減したり、募集電話を増やしたりすることができます。
たとえば、サンプルファイルでは、出力を取得します
æ l u s ɔ ɹ s
最初の携帯電話が間違っていると思われ、この電話の確率を減らしたいとしたら、次のように新しいファイルを作成できますprior.txt
æ -10.0
ファイルには複数の行を含めることができ、各行には各電話の情報があります。最初のフィールドはターゲット電話で、2番目のフィールドは、確率を調整するログベースのスコアです。正のスコアとは、その予測を高めたいということを意味し、負のスコアはその予測を抑制します。この場合、新しい結果を得ることができます
python -m allosaurus.run -i=sample.wav --lang=eng --prior=prior.txt
ɛ l u s ɔ ɹ s
あなたが見ることができる場所æ
が抑制され、別の母音ɛ
それを置き換えました。
以前の別のアプリケーションは、総出力電話の数を変更することです。より多くの電話出力以下の電話出力が必要になる場合があります。この場合、Silence電話に対応する<blk>
のスコアを変更できます。
正の<blk>
スコアは沈黙を増やすため、出力の数を減らします。同様に、負の<blk>
出力を増加させます。次の例はこれを示しています。
# <blk> 1.0
python -m allosaurus.run -i=sample.wav --lang=eng --prior=prior.txt
æ l u ɔ ɹ s
# <blk> -1.0
$ python -m allosaurus.run -i=sample.wav --lang=eng --prior=prior.txt
æ l u s f ɔ ɹ s
最初の例では1つの携帯電話を減らし、2番目の例では新しい携帯電話が追加されます。
前提条件のモデルは、一部の言語に対して十分に正確ではない可能性があることに気付くため、ここではユーザーがデータに適応することでモデルをさらに改善できるようにするための微調整ツールも提供します。現在、それは1つの言語で微調整されることに限定されています。
データを微調整するには、オーディオファイルとその転写を準備する必要があります。まず、データディレクトリ内で1つのデータディレクトリ(名前は任意になる可能性があります)を作成し、 train
ディレクトリとvalidate
ディレクトリを作成してください。明らかに、 train
ディレクトリにはトレーニングセットが含まれ、 validate
ディレクトリは検証セットになります。
各ディレクトリには、次の2つのファイルを含める必要があります。
wave
:これは、対応するオーディオに関連するファイルですtext
:これは、携帯電話に発話を関連付けるファイルです。 wave
各発話をWAVファイルにマッピングするTXTファイルです。各行は次のように準備する必要があります。
utt_id /path/to/your/audio.wav
ここで、 utt_id
発話IDを示します。データセットで一意である限り、任意の文字列になる可能性があります。 audio.wav
は上記のようにWAVファイルであり、モノチャネルWAV形式である必要がありますが、サンプリングレートは任意の場合があります(必要に応じてツールは自動的にリサンプします)ここで使用される区切り文字はスペースです。
最高の微調整結果を得るために、各オーディオファイルはそれほど長くないはずです。各発話を10秒未満に保つことをお勧めします。
text
各発話を転写にマッピングする別のTXTファイルです。各ラインは次のように準備する必要があります
utt_id phone1 phone2 ...
ここで、 utt_id
再び発話IDであり、対応するWAVファイルと一致する必要があります。電話シーケンスは、発言IDがWAVファイルの音声転写である後に発生しました。ここの電話は、ターゲット言語の電話インベントリに制限される必要があります。 list_phone
コマンドによってすべての電話が既にターゲット言語に登録されていることを確認してください
次に、 wave
ファイルとtext
ファイルの両方から機能を抽出します。 train
ディレクトリの両方でwave
ファイルとtext
ファイルをすでに準備し、ディレクトリをvalidate
仮定します
オーディオ機能を準備するには、 train
ディレクトリの両方で次のコマンドを実行し、ディレクトリをvalidate
。
# command to prepare audio features
python -m allosaurus.bin.prep_feat --model=some_pretrained_model --path=/path/to/your/directory (train or validate)
path
列車または検証ディレクトリを指している必要があります。 model
Traget Tretrained Modelを指している必要があります。不特定の場合、最新のモデルを使用します。 3つのファイルfeat.scp
、 feat.ark
、およびshape
生成します。
最初のものは、各発言を2番目のファイルのオフセットにインデックスするファイルです。
2番目のファイルは、すべてのオーディオ機能を含むバイナリファイルです。
3番目には、機能ディメンション情報が含まれています
興味がある場合、 scp
およびark
形式はKaldiで使用される標準のファイル形式です。
テキスト機能を準備するには、 train
ディレクトリの両方で次のコマンドを再度実行し、ディレクトリをvalidate
。
# command to prepare token
python -m allosaurus.bin.prep_token --model= < some_pretrained_model > --lang= < your_target_language_id > --path=/path/to/your/directory (train or validate)
path
とmodel
前のコマンドと同じでなければなりません。 lang
このデータセットの3文字ISO言語IDです。この言語IDの電話インベントリには、電話のすべての転写が含まれていることを確認する必要があることに注意してください。それ以外の場合、ここでの抽出は失敗する可能性があります。
このコマンドの後、各発言を電話IDシーケンスにマッピングするtoken
というファイルが生成されます。
次に、準備したばかりのデータセットでモデルの微調整を開始できます。微調整コマンドは非常に簡単です。
# command to fine_tune your data
python -m allosaurus.bin.adapt_model --pretrained_model= < pretrained_model > --new_model= < your_new_model > --path=/path/to/your/data/directory --lang= < your_target_language_id > --device_id= < device_id > --epoch= < epoch >
ここにはいくつかのオプションの引数がありますが、必要な引数について説明します。
prep_token
and prep_feat
で以前に指定したモデルと同じモデルでpretrained_model
必要があります。
new_model
任意のモデル名にすることができます(実際、各モデルに前提型モデルと同じ形式(すなわちyymmdd)を与えると管理が簡単かもしれません)
path
train
の親ディレクトリを指してディレクトリをvalidate
必要があります。
lang
prep_token
で指定した言語IDです
device_id
、GPUをお持ちでない場合は、微調整のGPU IDです。-1をDevice_idとして使用します。複数のGPUはサポートされていません。
epoch
あなたのトレーニングエポックの数です
トレーニング中に、トレーニングセットと検証セットの両方の損失や電話エラー率などの情報が表示されます。各エポックの後、モデルは検証セットで評価され、検証電話エラー率が以前のものよりも優れている場合、このチェックポイントを保存します。指定されたepoch
が終了した後、微調整プロセスが終了し、新しいモデルが利用可能になります。
トレーニングプロセスの後、新しいモデルをモデルリストで利用できるようにする必要があります。 list_model
コマンドを使用して、新しいモデルが利用可能になっていることを確認してください
# command to check all your models
python -m allosaurus.bin.list_model
利用可能な場合、この新しいモデルは、他の事前に守られたモデルと同じスタイルで使用できます。推論を実行して、新しいモデルを使用してください。
python -m allosaurus.run --lang < language id > --model < your new model > --device_id < gpu_id > -i < audio >
この作業では、次のコードとインベントリの一部を使用しています。特に、このモデルの電話インベントリを構築するために、AlloveraとPhoibleを頻繁に使用しました。
作業でコードを使用する場合は、次の論文を引用してください。
アドバイスや提案がある場合は、お気軽にメールを送信してください(Xinjianl [at] Cs.cmu.edu)またはこのリポジトリで問題を送信してください。ありがとう!
@inproceedings { li2020universal ,
title = { Universal phone recognition with a multilingual allophone system } ,
author = { Li, Xinjian and Dalmia, Siddharth and Li, Juncheng and Lee, Matthew and Littell, Patrick and Yao, Jiali and Anastasopoulos, Antonios and Mortensen, David R and Neubig, Graham and Black, Alan W and Florian, Metze } ,
booktitle = { ICASSP 2020-2020 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP) } ,
pages = { 8249--8253 } ,
year = { 2020 } ,
organization = { IEEE }
}