kaldi-train_mono.sh详解

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训练的代码介绍过程。

参考文献:https://blog.csdn.net/quheDiegooo/article/details/70132679

猜你喜欢

转载自blog.csdn.net/xwei1226/article/details/80491538