关于LDA、MLLT及fMLLR的特征变换请阅读《kaldi语音识别实战》阅读笔记:特征变换
一、train_lda_mllt.sh
1.1 描述
对输入特征进行LDA+MLLT特征变换后进行三音素训练。LDA和MLLT变换矩阵会随着训练重新估计新的。MLLT在这里指的是STC(半绑定定协方差)。用于全局特征变换。
Usage: steps/train_lda_mllt.sh [options] <#leaves> <#gauss> <data> <lang> <alignments> <dir>
e.g.: steps/train_lda_mllt.sh 2500 15000 data/train_si84 data/lang exp/tri1_ali_si84 exp/tri2b
Main options (for others, see top of script file)
--cmd (utils/run.pl|utils/queue.pl <queue opts>) # how to run jobs.
--config <config-file> # config containing options
--stage <stage> # stage to do partial re-run from.
aishell调用实例
1.2 步骤
# 生成先验概率,根据升学特征和对齐计算LDA所需统计量,[splice-feats final.ali] -> [lda.acc]
ali-to-post
weight-silence-post
acc-lda
# 估计LDA矩阵,[lda.acc] -> [lda.mat]
est-lda
# 以LDA变换为基础构建特征管道
feat="$splicefeat | transform-feats lda.mat"
# 通过对转换后的特征重新统计,用于生成决策树[final.ali feats.*lda.mat] -> [treeacc]
acc-tree-stats
# 三音素绑定,[treeacc] -> [tree]
cluster-phone
compile-questions
build-tree //该步骤完成决策树三音素聚类
# 三音素模型初始化,[treeacc tree topo] -> [1.occ 1.mdl]
gmm-init-model
# 将三音素决策树的叶子替换为转换后模型决策树的叶子,[final.mdl 1.mdl final.ali] -> [ali.new]
convert-ali
# 生成训练图,[1.mdl text l.fst] -> [train.fst]
compile-train-graph
# 迭代训练
for i < iteration
# 重新对齐,[train.fst $i.mdl] ->[$i+1.ali]
gmm-align-compiled
#估计MLLT统计量
ali-to-post | weight-silence-post | gmm-acc-mllt
# 估计MLLT矩阵
est-mllt
# 对gmm模型进行变换,[mllt.mat mdl] -> [new.mdl]
gmm-transform-means
# 组合LDA和MLLT矩阵,[lda.mat mllt.mat] -> [lda.mat]
compose-transforms
# 重新定义特征管道
# feat="$splicefeat | transform-feats $(x+1).mat"
# 重新统计所需统计量,[$i.ali] -> [$i.acc]
gmm-acc-stats-ali
# 更新GMM模型参数,[$i.acc] -> [$i.mdl]
gmm-est //该步骤增加混合高斯分量的数目
# 输出最后的模型
final.mdl = $i.mdl
done
相比train_deltas.sh
多了LDA+MLLT变换。
二、train_sat.sh
2.1 描述
使用fMLLR训练,fMLLT用于说话人特定的特征变换,训练默认基于LDA+MLLT变换后的特征及其强制对齐的结果。
Usage: steps/train_sat.sh <#leaves> <#gauss> <data> <lang> <ali-dir> <exp-dir>
e.g.: steps/train_sat.sh 2500 15000 data/train_si84 data/lang exp/tri2b_ali_si84 exp/tri3b
Main options (for others, see top of script file)
--cmd (utils/run.pl|utils/queue.pl <queue opts>) # how to run jobs.
--config <config-file> # config containing options
--stage <stage> # stage to do partial re-run from.
aishell调用实例
2.2 步骤
# 生成先验概率,估计初始fMLLR矩阵,[splice-feats spk2utt] -> [trans]
ali-to-post
weight-silence-post
gmm-est-fmllr
# 以fMLLR变换的特征为基础构建特征管道,mlltfeat为进行差分后或者基于LDA变换后的特征
feats="$sifeat | transform-feats trans"
# 通过对转换后的特征重新统计,用于生成决策树[final.ali feats.*lda.mat] -> [treeacc]
acc-tree-stats
# 三音素绑定,[treeacc] -> [tree]
cluster-phone
compile-questions
build-tree //该步骤完成决策树三音素聚类
# 三音素模型初始化,[treeacc tree topo] -> [1.occ 1.mdl]
gmm-init-model
# 将三音素决策树的叶子替换为转换后模型决策树的叶子,[final.mdl 1.mdl final.ali] -> [ali.new]
convert-ali
# 生成训练图,[1.mdl text l.fst] -> [train.fst]
compile-train-graph
# 迭代训练
for i < iteration
# 重新对齐,[train.fst $i.mdl] ->[$i+1.ali]
gmm-align-compiled
# 估计fMLLR的矩阵 -> [fmllr.trans]
ali-to-post | weight-silence-post | gmm-est-fmllr
# 组合变换矩阵,[trans.mat fmllr.trans] -> [new_trans]
compose-transforms
# 重新构建特征管道
feats="$sifeats| transform-feats new_trans"
# 重新统计所需统计量,[$i.ali] -> [$i.acc]
gmm-acc-stats-ali
# 估计新的模型,[$i.acc] -> [$i.mdl]
gmm-est # 该步骤增加混合高斯分量的数目
# 输出最后的模型
final.mdl = $i.mdl
aishell实例
如有问题或建议欢迎私信。
严禁私自转载,侵权必究
参考
[1] 《kaldi语音识别实战》[book]
[2] kaldi HMM-GMM全部训练脚本分解 [博客园]