Kaldi的BaseLine训练过程

steps/train_mono.sh --nj "$train_nj" --cmd "$train_cmd" data/train data/lang exp/mono || exit 1

data lang dir

 

# 使用差分特征训练GMM模型

# 因为每一步训练的模型都会导致状态的均值发生变换,而决策树是与状态的分布相关的。也就是说,旧的决策树就不适用于新训练的模型。因此,需要重新为新模型训练新的决策树(根据特征和新的alignment)。

流程:

使用特征和新的alignment,为新模型训练新的决策树;

由于决策树改变,音素的聚类(pdf)也发现改变,因此由旧的音素的聚类(pdf)组成的alignment也需要改变。使用旧模型、新模型、新决策树,将旧的alignment(由pdf组成)转换为新的alignment(由新pdf组成);

使用新的决策树初始化GMM模型,并进行训练:

总共迭代n次,即重复n次:

对每一个utterance

将对应的alignment与多个特征进行配对,生成.acc(与.egs类似)

使用.acc训练这段alignment中出现的所有GMM.mdl

n=$realign_iters时:

使用Galignment),与H.mdl)、Ctree)、LL.fst),生成HCLG图,用该图与对应的多个特征进行对齐,生成新的alignmentali.JOB.gz

n=$mllt_iters时:

将对应的alignment与多个特征进行配对,生成.macc(与.acc类似)

使用.macc训练一个MLLT矩阵(.mat),用这个矩阵将GMM.mdl)的均值进行降维,输出新的模型

迭代结束

steps/train_deltas.sh --cmd "$train_cmd" 2000 11000 data/train data/lang exp/mono_ali exp/tri1 || exit 1

numleaves totgauss data lang alidir dir

 

feats="ark,s,cs:apply-cmvn $cmvn_opts --utt2spk=ark:$sdata/JOB/utt2spk scp:$sdata/JOB/cmvn.scp scp:$sdata/JOB/feats.scp ark:- | add-deltas $delta_opts ark:- ark:- |"

 

#增量特征的计算由程序add-deltas完成,它使用ComputeDeltas函数.增量特征计算具有与HTK相同的默认设置,也就是说,为得到第一个(即左侧的)增量特征,我们将原特征乘以[-2,1,0,1,2]的滑动窗口,然后通过除以(2^2 + 1^2 + 0^2 + 1^2 + 2^2 = 10).通过用第一个增量特征的计算方法来计算第二个(即右侧的)增量特征.每一侧的上下文帧数由参数:"-delta-window"(默认值:2)来控制,要增加的delta特征数量由参数"-delta-order"(默认值:2)来控制.使用此脚本的典型脚本行是:

feats="ark:add-deltas --print-args=false scp:data/train.scp ark:- |"

 

acc-tree-stats 1.mdl scp:train.scp ark:1.ali 1.tacc

#收集树的统计信息,用于决策树训练。该程序读入特征(档案格式)和相应的对齐,并且生成用于创建决策树的足够的统计信息。上下文宽度(三音素的宽度为3,五音素的宽度为5)和中心音素位置(三音素的中心为2,五音素的宽度为3)用于标识上下文。转换模型(声学模型)用作输入以标识PDF(GMM)和音素。

#作上下文音素的复制

sum-tree-stats treeacc 1.treeacc 2.treeacc 3.treeacc

#将分割$njjob后的$nj.treeacc合并为一个.treeacc,用于建设音素上下文树

cluster-phones

#为满足多种需要,聚类音素(或聚类音素集)

compile-questions questions.txt questions.qst

#编译决策树为程序可读的格式

build-tree treeacc roots.txt 1.qst topo tree

#训练决策树

gmm-init-model [options] <tree-in> <tree-stats-in> <topo-file> <model-out> [<old-tree> <old-model>(initializing GMMs with old model)]

gmm-init-model --write-occs=$dir/1.occs $dir/tree $dir/treeacc $lang/topo $dir/1.mdl prev/tree prev/30.mdl

#用决策树和树统计信息初始化GMM,用单高斯生成混合高斯

gmm-mixup [options] <model-in> <state-occs-in> <model-out>

gmm-mixup --mix-up=4000 1.mdl 1.occs 2.mdl

#将对齐(转录)从一个决策树/模型转换为另一个对齐(转录)

convert-ali [options] <old-model> <new-model> <new-tree> <old-alignments-rspecifier> <new-alignments-wspecifier>

convert-ali $alidir/final.mdl $dir/1.mdl $dir/tree "ark:gunzip -c $alidir/ali.JOB.gz|" "ark:|gzip -c >$dir/ali.JOB.gz" || exit 1;

#为每个JOB创建一个fsts.JOB.gz,其中每个句子对应一个训练图, H o C o L o G (without transition-probabilities, by default)

compile-train-graphs [options] <tree-in> <model-in> <lexicon-fst-in> <transcriptions-rspecifier> <graphs-wspecifier>

compile-train-graphs $dir/tree $dir/1.mdl $lang/L.fst "ark:utils/sym2int.pl --map-oov $oov -f 2- $lang/words.txt < $sdata/JOB/text |" "ark:|gzip -c >$dir/fsts.JOB.gz" || exit 1;

while 不收敛 do

#给定基于GMM的模型(HCLG),对特征进行对齐,输出转录(PDF_ID为单元).

gmm-align-compiled [options] <model-in> <graphs-rspecifier> <feature-rspecifier> <alignments-wspecifier> [scores-wspecifier]

gmm-align-compiled $scale_opts --beam=$beam --retry-beam=$retry_beam --careful=$careful

"$mdl" "ark:gunzip -c $dir/fsts.JOB.gz|" "$feats" "ark:|gzip -c >$dir/ali.JOB.gz"

#输入特征和转录,将其中的每一帧特征与一个转移(或高斯)对应起来

#输入<model-in>,读取其中的trans_modelam_gmm,再从trans_model中读取转移到transition_accs,am_gmm中读取所有的高斯到gmm_accs;

#<feature-rspecifier>中的每一帧,试图在<alignments-rspecifier>中找到对应的transition identifier,并写入到transition_accs;

#transition identifiertrans_model中找到对应的pdf_id,将这一帧以及这个pdf_id写入到gmm_accs

#最后写入<stats-out>(先写入transition_accs,再写入gmm_accs)

gmm-acc-stats-ali [options] <model-in> <feature-rspecifier> <alignments-rspecifier> <stats-out>

gmm-acc-stats-ali $dir/$x.mdl "$feats" "ark,s,cs:gunzip -c $dir/ali.JOB.gz|" $dir/$x.JOB.acc || exit 1;

#基于GMM的声学模型的最大似然重估计, Do Maximum Likelihood re-estimation of GMM-based acoustic model

#<stats-in>中的'特征-高斯'用于训练<model-in>中的一些高斯,当然有部分高斯没有被训练到.

#因此,输出一个occs(occupations,训练过的高斯占有数)用于表示哪些高斯被训练过了

gmm-est [options] <model-in> <stats-in> <model-out>

gmm-est --mix-up=$numgauss --power=$power --write-occs=$dir/$[$x+1].occs

$dir/$x.mdl "gmm-sum-accs - $dir/$x.*.acc |" $dir/$[$x+1].mdl || exit 1;

done#结束

# (保留最有鉴别性的特征维数)训练一个LDA对角矩阵变换,这个矩阵(变换)称为MLLT

# 可进行splice拼帧

# 因为每一步训练的模型都会导致状态的均值发生变换,而决策树是与状态的分布相关的。也就是说,旧的决策树就不适用于新训练的模型。因此,需要重新为新模型训练新的决策树(根据特征和新的alignment)。

numleavesnumber of leaves,叶子数,决策树最后一次分裂后的叶子数,即三音素聚类后的三音素的数量

totgausstotal gauss,总混合高斯模型数,在gmm-est估计时刻加入此参数以更改目标混合高斯数,gmm-acc-stats-ali<alignments-rspecifier>(来自ali.JOB.gz)以及<feature-rspecifier>进行统计,统计出各个混合高斯(hmm状态)对应的一些特征片段,将结果写入到$x.*.acc(即<stats-out>)中

流程:

  1. 使用特征和新的alignment,为新模型训练新的决策树;
  2. 由于决策树改变,音素的聚类(pdf)也发现改变,因此由旧的音素的聚类(pdf)组成的alignment也需要改变。使用旧模型、新模型、新决策树,将旧的alignment(由pdf组成)转换为新的alignment(由新pdf组成);
  3. 使用新的决策树初始化GMM模型,并进行训练:

    总共迭代n次,即重复n次:

    对每一个utterance:

    将对应的alignment与多个特征进行配对,生成.acc(与.egs类似)

    使用.acc训练这段alignment中出现的所有GMM.mdl

    当n=$realign_iters时:

    使用G(alignment),与H(.mdl)、C(tree)、L(L.fst),生成HCLG图,用该图与对应的多个特征进行对齐,生成新的alignment(ali.JOB.gz)

    当n=$mllt_iters时:

    将对应的alignment与多个特征进行配对,生成.macc(与.acc类似)

    使用.macc训练一个MLLT矩阵(.mat),用这个矩阵将GMM.mdl)的均值进行降维,输出新的模型

    迭代结束

numleaves totgauss data lang alidir dir

steps/train_lda_mllt.sh --cmd "$train_cmd" 2000 11000 data/train data/lang exp/tri1_ali exp/tri2b || exit 1;

numleaves totgauss data lang alidir dir

steps/train_mmi.sh --boost 0.05 data/train data/lang exp/tri2b_ali exp/tri2b_denlats exp/tri2b_mmi_b0.05 || exit 1;

data lang alidir denlatdir dir

steps/train_mpe.sh data/train data/lang exp/tri2b_ali exp/tri2b_denlats exp/tri2b_mpe || exit 1;

data lang alidir denlatdir dir

# 说话人自适应训练,即,使用fMLLR适应后的特征(经过fMLLR变换后的特征)进行训练

流程:

  1. 使用特征和新的alignment,为新模型训练新的决策树;
  2. 由于决策树改变,音素的聚类(pdf)也发现改变,因此由旧的音素的聚类(pdf)组成的alignment也需要改变。使用旧模型、新模型、新决策树,调用convert-ali,将旧的alignment(由pdf组成)转换为新的alignment(由新pdf组成);
  3. 使用新的决策树初始化GMM模型,并进行训练:

    总共迭代n次,即重复n次:

    对每一个utterance:

    将对应的alignment与多个特征进行配对,生成.acc(与.egs类似)

    使用.acc训练这段alignment中出现的所有GMM.mdl

    当n=$realign_iters时:

    使用G(alignment),与H(.mdl)、C(tree)、L(L.fst),生成HCLG图,用该图与对应的多个特征进行对齐,生成新的alignment(ali.JOB.gz)

    当n=$fmllr_iters时:

    根据该utterance对应的特征、后验概率、所属说话人(utt2spk),对每个估计utterance一个fMLLR变换,将所有utterance的变换储存为(trans.JOB),对旧的特征进行fMLLR变换,生成的新的特征继续加入迭代,这意味着原始特征将经过${#fmllr_iters})个fMLLR变换。

    迭代结束

因为使用了fMLLR变换过的特征进行训练GMM(.mdl),因此,输入到新模型中的特征(后续的训练和解码)都需要使用fMLLR变换。

steps/train_sat.sh --cmd "$train_cmd" 2500 15000 data/train data/lang exp/tri2b_ali exp/tri3b || exit 1;

numleaves totgauss data lang alidir dir

steps/train_quick.sh --cmd "$train_cmd" 4200 40000 data/train data/lang exp/tri3b_ali exp/tri4b || exit 1;

numleaves totgauss data lang alidir dir

posted @ 2017-09-09 22:41  JarvanWang  阅读(1368)  评论(0编辑  收藏  举报