kaldi中訓練聲學模型,首先是訓練單音素模型,即mono-phone過程,
本文主要講述mono-phone訓練的過程。
代碼爲steps/train_mono.sh
用法如下所示:
steps/train_mono.sh [options] <training-data-dir> <lang-dir> <exp-dir>
training-data-dir表示事先準備好的要準備訓練數據文件夾(即第0步準備的:wav.scp,text,utt2spk,spk2utt文件等,由local/data_prep.sh生成);lang-dir表示事先準備好的和語言模型相關的文件(即第20步準備的:L_disambig.fst,L.fst,oov.int,oov.txt,phones.txt,topo,
words.txt文件等,由step/prepare_lang.sh生成);
exp-dir表示輸出文件路徑;
[options]表示輸入配置參數,如下所示:
-nj:並行job數
-cmd:job調度分發腳本,默認是run.pl(Grid Engine分發腳本)
調用如下:
local/train_mono.sh --nj "$train_nj" --cmd "$train_cmd" $traindatadir $langdir $expdir/mono
打開steps/train_mono.sh,首先是一項參數
主要的如下所示:
scale_opts控制縮放選項:
--transition-scale=1.0 --acoustic-scale=0.1 --self-loop-scale=0.1
num_iters訓練迭代次數;max_iter_inc每個輪次最大增加的高斯數
totgauss總高斯數;
careful傳遞給gmm-align-complied參數,默認爲false;
boost_silence係數,用來增加靜音音素的似然;
realign_iters在第N次迭代進行一次對齊操作,
在訓練的job並行訓練過程中,訓練數據的各個子集合是分散到不同的處理器去進行訓練,然後每輪迭代後會進行合併。
下面就講一下訓練的過程:
1.首先是初始化GMM,使用的腳本是/kaldi-trunk/src/gmmbin/gmm-init-mono,輸出是0.mdl和tree文件;
2.compile training graphs,使用的腳本是/kaldi-trunk/source/bin/compile-training-graphs,輸入是tree,0.mdl和L.fst
輸出是fits.JOB.gz,其是在訓練過程中構建graph的過程;
3.接下來是一個對齊的操作,kaldi-trunk/source/bin/align-equal-compiled;
4.然後是基於GMM的聲學模型進行最大似然估計得過程,腳本爲/kaldi-trunk/src/gmmbin/gmm-est;
5.然後進行迭代循環中進行操作,如果本步驟到了對齊的步驟,則調用腳本kaldi-kaldi/src/gmmbin/gmm-align-compiled;
6.重新估計GMM,累計狀態,用腳本/kaldi-trunk/src/gmmbin/gmm-acc-states-ali;調用新生成的參數(高斯數)重新估計GMM,調用腳本/kaldi-trunk/src/gmmbin/gmm-est;
7.對分散在不同處理器上的結果進行合併,生成.mdl結果,調用腳本gmm-acc-sum;
8.增加高斯數,如果沒有超過設定的迭代次數,則跳轉到步驟5重新進行訓練
最後生成的.mdl即爲聲學模型文件
在離線識別階段,即可以調用utils/mkgraph.sh;來對剛剛生成的聲學文件進行構圖
之後解碼,得到離線測試的識別率。
以上就完成了聲學模型訓練第一個階段,mono-phone訓練的代碼介紹過程。