Kaldi thchs 30中国語音声認識チュートリアルを実行
27305 ワード
転載先https://www.jianshu.com/p/c48466d36162この文章は詳しく書かれていて、初心者が入門して見るのに適しています.
説明試験環境:Ubuntu 16.04 推奨:このチュートリアルに注意深く従うと、チュートリアルの手順と詳細に注意深く従っていないため、エラーが発生する人もいます. ドキュメント更新時間:20180713 thchs 30訓練を用いた最後の識別精度は約64% であった.
thchs 30ステップの実行 kaldiのインストール:https://github.com/kaldi-asr/kaldi/blob/master/tools/INSTALL、公式チュートリアルで まずgithabダウンロードのソースコードのegsディレクトリの下に入ってこの例を見つけて、それからその紹介を見てみましょう.readmeにはコーパスのダウンロード方法があります.それを下ろします(3つの圧縮パッケージを全部下ろします).全部で8個以上Gが大きいです. 対応するフォルダの下(s 5と同じレベルでよい)に合格し、thchs 30-openslrと名付けられ、すべての圧縮パッケージをこの下に解凍し、ファイルディレクトリは以下の である.
4.s 5ディレクトリを開き、cmd.shを編集します.ローカル実行に変更します.以下のようにします.
s 5の下のrun.shスクリプトを修正して、2つの場所を変更することができます
5.bash run.shを直接実行できますが、前に配置ミスなどがなければ問題ないはずですが、問題があれば出力を注意して見て、何時間から十数時間ぐらい走ります(機械によって異なります).このスクリプトを1行1行実行することを推奨することもできます.これにより、位置決めエラーが容易になります.どうやって一行で走りますか?コメントの使用:
[原句]上のように一言ずつ.データ準備、monophone単音素訓練、tri 1三要素訓練、trib 2 lda_mlltフィーチャー変換、trib 3はsat自然言語適応、trib 4はquick、後ろはdnnです7.dnnに実行するとエラーが発生します.デフォルトのdnnはGPUで走っているからです.チェックしてみると、CPUの下だけで終了しています.ここではdnnを走らないことをお勧めします.試したことがあるので、CPUに変えて7、8日間走って、17、18回反復しました.遅すぎます.一回の訓練はどうしても20回以上かかります.あと何度も訓練しなければならない.だから、dnnを走りたいならGPUを探しましょう.8.実行が終わったらthchs 30/s 5/expディレクトリを見て、tri 1/decode_test_word/scoring_kaldi/best_werファイルはプログラムのエラー率が約36.15%で、tri 1/final.mdlは出力のモデルであり、graph_wordフォルダの下にはwords.txtとHCLG.fstがあり、1つは辞書で、1つは有限状態機です.この3つのファイルがあれば、あなたの識別機能を使うことができます.9.自分の音声を認識する(wavファイルまたはマイクを使用する)認識効果は正しくなく、誤り率は約36%である.ソースコードのkaldi/srcディレクトリに戻ります.make extコンパイル拡張プログラム.(その前にtoolsフォルダの下のportaudioがインストールされていることを確認します)すると、onlinebinフォルダが表示されます.中には2つのプログラムがあり、online-wav-gmm-decode-fasterはwavファイルを再生して識別し、online-gmm-decode-fasterはマイクから音を入力して識別する.(ここでちょっとした差をつけます:portaudioを入れたら、音が取れない可能性があります.audio recoder(apt-getで)を入れて、それを使って録音してみて、音があるかどうかを測ってみましょう.録音できれば、portaudioは大丈夫です.普通に入れたらいいです.だめならもう一度再起動します.なぜか分かりません.)10.egsの下に行って、voxforgeを開くとonlineが入っていますdemo、直接thchs 30に合格しました.online_demoの中に2つのフォルダonline-data workを建てて、online-dataの下に2つのフォルダaudioとmodelsを建てて、audioの下であなたが再生するwavを放して、modelsはフォルダtri 1を建てて、s 5の下のexpの下のtri 1の下のfinal.mdlと35.mdl(final.mdlはショートカットです)を試験します.s 5下のexp下のtri 1下のgraphをwordの中のwords.txtとHCLG.fstは、modelsのtri 1に合格しました.ここでコピーしたディレクトリ構造はこうなるはずです
11.online_を開くdemoのrun.sh次の注記を削除します:(このセクションはvoxforgeの例で現在のネットのテスト用語と識別モデルをダウンロードしたものです.私たちはテスト用語を自分で準備します.モデルはtri 1です) それから次の文を見つけて、その経路をtri 1 に変更します.
変更:
および:
変更:(最後のmodelのみfinal.mdlに変更)
12.直接./run.shでしょう.再生認識を開始します.ヒントは./run.sh–test-mode liveコマンドがマイクから認識されます.
13.昇華部分はここにあります.tri 1のモデルを試した後、tri 2や3を試してみたいと思っていますが、操作すると次のような問題が発生します.
どうやって解決しますか?このソースファイルをよく見てください.dietaです.ldpの場合、matrixパラメータも追加しなければなりません(tri 2 bを例に挙げます).
そこでrun.shを修正して次のようにします:(12.mat(tri 2ではfinal.matは12.matのショートカットなので、final.matをコピーします)を試験して、コマンドに導入します)
同時にs 5下のexp下のtri 2 b下の12.matをmodelsのtri 2 b下に試験した.14.run.shを再度変更すると次のようになります(2つのパラメータを追加–left-context=3–right-context=3)
15./run.shを実行し、結果は以下の通りです.どうですか.ちょっとかっこいいですか.tri 2などのモデルを使ってマイクをオンラインにしたいなら、同じように修正すればいいです.
トレーニングと復号スクリプトの解読
本節では、公式ドキュメントと組み合わせて、主なスクリプトを解読します.
次のフローのシンボルの説明:->は次のステップを表し、{}はループを表し、[]はカッコ内の各ステップを表し、()は異なるブランチで可能な操作を表します.
1.train_mono.shは単音子ステルスマルコフモデルを訓練するために用いられ,合計40回の反復を行い,2回の反復ごとに整列操作を行った.
2.train_deltas.shはコンテキストに関連する三音子モデルを訓練するために使用される
3.train_lda_mllt.shは線形判別分析と最大尤度線形変換に用いる
4.train_sat.shは発音者の適応を訓練するために用いられ,特徴空間に基づく最大尤度線形回帰
5.train_quick.shは、既存の特徴上でモデルを訓練するために使用される.現在のモデルのツリー構築後の各ステータスについて、ツリー統計のカウントのオーバーラップ判定の類似性に基づいて、古いモデルで最も近いステータスを選択します.
6.run_dnn.shはxentとMPEを含むDNNを訓練するために用いられる.
7.train_mpe.shはdnnのシーケンス判別MEP/sMBRを訓練するために使用され、この段階では、フレームレベルの訓練よりも一般的なASRターゲットに近い文全体を最適化するためにニューラルネットワークを訓練する.sMBRの目的は、参照転写整列から導出された状態ラベルの所望の正解率を最大化することであり、競合仮定を表すためにメッシュフレームワークを使用することである.各文の反復を用いたランダム勾配降下法を訓練した.まず,固定した低学習率1 e−5(sigmoids)を用いて3−5ラウンドを運転した.第1ラウンドの反復後に語図を再生成し,急速な収束を観測した.MMI,BMMI,MPE,sMBRトレーニングをサポートします.すべての技術はSwitchboard 100 hセットで同じで、sMBRだけで少し良いです.sMBR最適化では,近似正解率の計算において,静音フレームを無視した.
8.train_dae.shはdaeに基づくノイズ除去効果を実験するために用いられる
9.train.shは深さニューラルネットワークモデルを訓練するために用いられ,フレームを三音状態のDNNに分類するフレームクロスエントロピー訓練である.これは小ロットのランダム勾配降下によって達成された.デフォルトではSigmoid非表示ユニット、Softmax出力ユニット、および完全に接続されたAffineTransformレイヤが使用され、学習率は0.008、小ロットのサイズは256です.運動量や正規化は使われていません(注:最適学習率と非表示ユニットのタイプは異なり、sigmoidの値は0.008、tanhは0.00001です.「-feature-transform」と「-dbn」によってinput-transformと事前訓練のDBNがこのスクリプトに転送され、出力レイヤのみがランダムに初期化されます.早期停止を使用して過度なフィッティングを防止するため、クロス検証セットを測定します(すなわち、コレクションを保持する)上のターゲット関数であるため、2対のフィーチャー整列dirが監督訓練を実行する必要がある.
10.train_scheduler.sh典型的には、train_scheduler.shがtrain.shによって呼び出されます.最初はクロス検証セットで実行する必要があり、メイン関数は$iterに基づいて反復回数と学習率を制御する必要があります.学習率は、ターゲット関数の相対性が向上するにつれて変化します.'start_halving_impr=0.01'より大きくなると、学習率が初期化されます定数を保持しないと学習率は反復毎に‘halving_factor=0.5’を乗じて縮小され、最後に‘end_halving_impr=0.001’より小さくなると訓練は終了する.新しいモデルの入力として14.make_fmllr_feats.shを用いてFLLR特徴15.pretrain_dbn.sh深さニューラルネットワーク事前訓練スクリプト16.decode_fmllr.shが発音者に適応したモデルを復号操作17.nnet-train-frmshuff.ccで最も一般的に使用されているニューラルネットワーク訓練ツールを保存し、反復トレーニングを実行します.プロセス:–feature-transformインスタントフィーチャー拡張NN入力-ターゲットペアのフレームごとの小ロットランダム勾配降下(SGD)トレーニングでサポートされるフレームごとのターゲット関数(オプション-オブジェクト関数):Xent:フレームごとのクロスエントロピーMse:フレームごとの平均二乗誤差18 nnet-forward.ccニューラルネットワークを介してデータを転送し、デフォルトではCPUを使用する.オプション:–apply-log:ニューラルネットワークの対数出力を生成する(例えば、対数後験確率を得る)-no-softmax:モデルからsoft-max層を除去-class-frame-counts:計算対数のカウントを音響スコアから減算
専有略語中国語解釈
Kaldi初心者の初心者に役立つことを願っています.私のように0.0です.
説明
thchs 30ステップの実行
thchs30-openslr
├── data_thchs30
├── resource
└── test-noise
4.s 5ディレクトリを開き、cmd.shを編集します.ローカル実行に変更します.以下のようにします.
export train_cmd=run.pl
export decode_cmd=run.pl
export mkgraph_cmd=run.pl
export cuda_cmd=run.pl
s 5の下のrun.shスクリプトを修正して、2つの場所を変更することができます
#n=4 #parallel jobs , cpu
n=2 #parallel jobs
#thchs=/nfs/public/materials/data/thchs30-openslr # ,
thchs=/home/jackie/data/thchs30-openslr
5.bash run.shを直接実行できますが、前に配置ミスなどがなければ問題ないはずですが、問題があれば出力を注意して見て、何時間から十数時間ぐらい走ります(機械によって異なります).このスクリプトを1行1行実行することを推奨することもできます.これにより、位置決めエラーが容易になります.どうやって一行で走りますか?コメントの使用:
:<
....
....
BLOCK
[原句]上のように一言ずつ.データ準備、monophone単音素訓練、tri 1三要素訓練、trib 2 lda_mlltフィーチャー変換、trib 3はsat自然言語適応、trib 4はquick、後ろはdnnです7.dnnに実行するとエラーが発生します.デフォルトのdnnはGPUで走っているからです.チェックしてみると、CPUの下だけで終了しています.ここではdnnを走らないことをお勧めします.試したことがあるので、CPUに変えて7、8日間走って、17、18回反復しました.遅すぎます.一回の訓練はどうしても20回以上かかります.あと何度も訓練しなければならない.だから、dnnを走りたいならGPUを探しましょう.8.実行が終わったらthchs 30/s 5/expディレクトリを見て、tri 1/decode_test_word/scoring_kaldi/best_werファイルはプログラムのエラー率が約36.15%で、tri 1/final.mdlは出力のモデルであり、graph_wordフォルダの下にはwords.txtとHCLG.fstがあり、1つは辞書で、1つは有限状態機です.この3つのファイルがあれば、あなたの識別機能を使うことができます.9.自分の音声を認識する(wavファイルまたはマイクを使用する)認識効果は正しくなく、誤り率は約36%である.ソースコードのkaldi/srcディレクトリに戻ります.make extコンパイル拡張プログラム.(その前にtoolsフォルダの下のportaudioがインストールされていることを確認します)すると、onlinebinフォルダが表示されます.中には2つのプログラムがあり、online-wav-gmm-decode-fasterはwavファイルを再生して識別し、online-gmm-decode-fasterはマイクから音を入力して識別する.(ここでちょっとした差をつけます:portaudioを入れたら、音が取れない可能性があります.audio recoder(apt-getで)を入れて、それを使って録音してみて、音があるかどうかを測ってみましょう.録音できれば、portaudioは大丈夫です.普通に入れたらいいです.だめならもう一度再起動します.なぜか分かりません.)10.egsの下に行って、voxforgeを開くとonlineが入っていますdemo、直接thchs 30に合格しました.online_demoの中に2つのフォルダonline-data workを建てて、online-dataの下に2つのフォルダaudioとmodelsを建てて、audioの下であなたが再生するwavを放して、modelsはフォルダtri 1を建てて、s 5の下のexpの下のtri 1の下のfinal.mdlと35.mdl(final.mdlはショートカットです)を試験します.s 5下のexp下のtri 1下のgraphをwordの中のwords.txtとHCLG.fstは、modelsのtri 1に合格しました.ここでコピーしたディレクトリ構造はこうなるはずです
online_demo
├── online-data
│ ├── audio
│ │ ├── 1.wav
│ │ ├── 2.wav
│ │ ├── 3.wav
│ │ ├── 4.wav
│ │ ├── 5.wav
│ │ └── trans.txt
│ └── models
│ └── tri1
│ ├── 35.mdl
│ ├── final.mdl
│ ├── HCLG.fst
│ └── words.txt
├── README.txt
├── run.sh
└── work[ run.sh ]
├── ali.txt
├── hyp.txt
├── input.scp
├── ref.txt
└── trans.txt
11.online_を開くdemoのrun.sh
if [ ! -s ${data_file}.tar.bz2 ]; then
echo "Downloading test models and data ..."
wget -T 10 -t 3 $data_url;
if [ ! -s ${data_file}.tar.bz2 ]; then
echo "Download of $data_file has failed!"
exit 1
fi
fi
ac_model_type=tri2b_mmi
変更:
ac_model_type=tri1
および:
online-wav-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85\
--max-active=4000 --beam=12.0 --acoustic-scale=0.0769 \
scp:$decode_dir/input.scp $ac_model/model
変更:(最後のmodelのみfinal.mdlに変更)
online-wav-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85\
--max-active=4000 --beam=12.0 --acoustic-scale=0.0769 \
scp:$decode_dir/input.scp $ac_model/final.mdl
12.直接./run.shでしょう.再生認識を開始します.ヒントは./run.sh–test-mode liveコマンドがマイクから認識されます.
13.昇華部分はここにあります.tri 1のモデルを試した後、tri 2や3を試してみたいと思っていますが、操作すると次のような問題が発生します.
ERROR (online-wav-gmm-decode-faster:LogLikelihoods():diag-gmm.cc:533) DiagGmm::ComponentLogLikelihood, dimension mismatch 39vs. 40
どうやって解決しますか?このソースファイルをよく見てください.dietaです.ldpの場合、matrixパラメータも追加しなければなりません(tri 2 bを例に挙げます).
そこでrun.shを修正して次のようにします:(12.mat(tri 2ではfinal.matは12.matのショートカットなので、final.matをコピーします)を試験して、コマンドに導入します)
ac_model=${data_file}/models/$ac_model_type
trans_matrix="$ac_model/12.mat"
audio=${data_file}/audio
if [ -s $ac_model/matrix ]; then
trans_matrix=$ac_model/12.mat
fi
同時にs 5下のexp下のtri 2 b下の12.matをmodelsのtri 2 b下に試験した.14.run.shを再度変更すると次のようになります(2つのパラメータを追加–left-context=3–right-context=3)
online-wav-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85 \
--max-active=4000 --beam=12.0 --acoustic-scale=0.0769 --left-context=3 --right-context=3\
scp:$decode_dir/input.scp $ac_model/final.mdl $ac_model/HCLG.fst \
$ac_model/words.txt '1:2:3:4:5' ark,t:$decode_dir/trans.txt \
ark,t:$decode_dir/ali.txt $trans_matrix;;
15./run.shを実行し、結果は以下の通りです.どうですか.ちょっとかっこいいですか.tri 2などのモデルを使ってマイクをオンラインにしたいなら、同じように修正すればいいです.
online-wav-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85 --max-active=4000 --beam=12.0 --acoustic-scale=0.0769 --left-context=3 --right-context=3 scp:./work/input.scp online-data/models/tri2b/final.mdl online-data/models/tri2b/HCLG.fst online-data/models/tri2b/words.txt 1:2:3:4:5 ark,t:./work/trans.txt ark,t:./work/ali.txt online-data/models/tri2b/12.mat
File: D4_750
トレーニングと復号スクリプトの解読
本節では、公式ドキュメントと組み合わせて、主なスクリプトを解読します.
次のフローのシンボルの説明:->は次のステップを表し、{}はループを表し、[]はカッコ内の各ステップを表し、()は異なるブランチで可能な操作を表します.
1.train_mono.shは単音子ステルスマルコフモデルを訓練するために用いられ,合計40回の反復を行い,2回の反復ごとに整列操作を行った.
gmm-init-mono->compile-train-graphs->align-equal-compiled->gmm-est->
{gmm-align-compiled->gmm-acc-stats-ali->gmm-est}40->analyze_alignments.sh
2.train_deltas.shはコンテキストに関連する三音子モデルを訓練するために使用される
check_phones_compatible.sh->acc-tree-stats->sum-tree-stats->cluster-phones->compile-questions->
build-tree->gmm-init-model->gmm-mixup->convert-ali->compile-train-graphs->
{gmm-align-compiled->gmm-acc-stats-ali->gmm-est}35->analyze_alignments.sh
3.train_lda_mllt.shは線形判別分析と最大尤度線形変換に用いる
check_phones_compatible.sh->split_data.sh->ali-to-post->est-lda->acc-tree-stats->sum-tree-stats->
cluster-phones->compile-questions->build-tree->gmm-init-model->convert-ali->compile-train-graphs->
{gmm-align-compiled->gmm-acc-stats-ali->gmm-est}35->analyze_alignments.sh
4.train_sat.shは発音者の適応を訓練するために用いられ,特徴空間に基づく最大尤度線形回帰
check_phones_compatible.sh->ali-to-post->acc-tree-stats->sum-tree-stats->cluster-phones->compile-questions->
build-tree->gmm-init-model->gmm-mixup->convert-ali->compile-train-graphs->
{gmm-align-compiled->(ali-to-post->)gmm-acc-stats-ali->gmm-est}35->ali-to-post->
gmm-est->analyze_alignments.sh
5.train_quick.shは、既存の特徴上でモデルを訓練するために使用される.現在のモデルのツリー構築後の各ステータスについて、ツリー統計のカウントのオーバーラップ判定の類似性に基づいて、古いモデルで最も近いステータスを選択します.
check_phones_compatible.sh->ali-to-post->est-lda->acc-tree-stats->sum-tree-stats->
cluster-phones->compile-questions->build-tree->gmm-init-model->convert-ali->compile-train-graphs->
{gmm-align-compiled->gmm-acc-stats-ali->gmm-est}20->analyze_alignments.sh
6.run_dnn.shはxentとMPEを含むDNNを訓練するために用いられる.
{make_fbank.sh->compute_cmvn_stats.sh}[train,dev,test]->train.sh->{decode.sh}[phone,word]->
align.sh->make_denlats.sh->train_mpe.sh->{{decode.sh}[phone,word]}3
7.train_mpe.shはdnnのシーケンス判別MEP/sMBRを訓練するために使用され、この段階では、フレームレベルの訓練よりも一般的なASRターゲットに近い文全体を最適化するためにニューラルネットワークを訓練する.sMBRの目的は、参照転写整列から導出された状態ラベルの所望の正解率を最大化することであり、競合仮定を表すためにメッシュフレームワークを使用することである.各文の反復を用いたランダム勾配降下法を訓練した.まず,固定した低学習率1 e−5(sigmoids)を用いて3−5ラウンドを運転した.第1ラウンドの反復後に語図を再生成し,急速な収束を観測した.MMI,BMMI,MPE,sMBRトレーニングをサポートします.すべての技術はSwitchboard 100 hセットで同じで、sMBRだけで少し良いです.sMBR最適化では,近似正解率の計算において,静音フレームを無視した.
{nnet-train-mpe-sequential}3->make_priors.sh
8.train_dae.shはdaeに基づくノイズ除去効果を実験するために用いられる
compute_cmvn_stats.sh->{add-noise-mod.py->make_fbank.sh->compute_cmvn_stats.sh}[train,dev,test]->
train.sh->nnet-concat->{{decode.sh}[phone,word]}[train,dev,test]
9.train.shは深さニューラルネットワークモデルを訓練するために用いられ,フレームを三音状態のDNNに分類するフレームクロスエントロピー訓練である.これは小ロットのランダム勾配降下によって達成された.デフォルトではSigmoid非表示ユニット、Softmax出力ユニット、および完全に接続されたAffineTransformレイヤが使用され、学習率は0.008、小ロットのサイズは256です.運動量や正規化は使われていません(注:最適学習率と非表示ユニットのタイプは異なり、sigmoidの値は0.008、tanhは0.00001です.「-feature-transform」と「-dbn」によってinput-transformと事前訓練のDBNがこのスクリプトに転送され、出力レイヤのみがランダムに初期化されます.早期停止を使用して過度なフィッティングを防止するため、クロス検証セットを測定します(すなわち、コレクションを保持する)上のターゲット関数であるため、2対のフィーチャー整列dirが監督訓練を実行する必要がある.
feat-to-dim->nnet-initialize->compute-cmvn-stats->nnet-forward->nnet-concat->cmvn-to-nnet->
feat-to-dim->apply-cmvn->nnet-forward->nnet-initialize->train_scheduler.sh
10.train_scheduler.sh典型的には、train_scheduler.shがtrain.shによって呼び出されます.最初はクロス検証セットで実行する必要があり、メイン関数は$iterに基づいて反復回数と学習率を制御する必要があります.学習率は、ターゲット関数の相対性が向上するにつれて変化します.'start_halving_impr=0.01'より大きくなると、学習率が初期化されます定数を保持しないと学習率は反復毎に‘halving_factor=0.5’を乗じて縮小され、最後に‘end_halving_impr=0.001’より小さくなると訓練は終了する.新しいモデルの入力として14.make_fmllr_feats.shを用いてFLLR特徴15.pretrain_dbn.sh深さニューラルネットワーク事前訓練スクリプト16.decode_fmllr.shが発音者に適応したモデルを復号操作17.nnet-train-frmshuff.ccで最も一般的に使用されているニューラルネットワーク訓練ツールを保存し、反復トレーニングを実行します.プロセス:–feature-transformインスタントフィーチャー拡張NN入力-ターゲットペアのフレームごとの小ロットランダム勾配降下(SGD)トレーニングでサポートされるフレームごとのターゲット関数(オプション-オブジェクト関数):Xent:フレームごとのクロスエントロピーMse:フレームごとの平均二乗誤差18 nnet-forward.ccニューラルネットワークを介してデータを転送し、デフォルトではCPUを使用する.オプション:–apply-log:ニューラルネットワークの対数出力を生成する(例えば、対数後験確率を得る)-no-softmax:モデルからsoft-max層を除去-class-frame-counts:計算対数のカウントを音響スコアから減算
専有略語中国語解釈
cmvn:
fft:
GMM:
MFCC:
pcm:
pdf:
PLP:
SGMM:
UBM:
VTLN:
Kaldi初心者の初心者に役立つことを願っています.私のように0.0です.