kaldi中训练声学模型,首先是训练单音素模型,即mono-phone过程,
本文主要讲述mono-phone训练的过程。
代码为steps/train_mono.sh
用法如下所示:
steps/train_mono.sh [options]
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训练的代码介绍过程。