- 差分
在一定窗长内,计算前后帧的差分特征补充到当前帧后边。如一个M维的特征做D阶差分后特征维度变为(D+1)*M。
# kaldi
src/featbin/add-deltas scp:data/train/feats.acp \
ark,scp:data/trainfeat_delta.ark,data/train/feats_deltas.scp
- 拼帧
在一定窗长内,将前后指定帧拼成一帧特征。
# kaldi
src/featbin/splice-feats scp:data/train/feats.scp \
ark,scp:data/train/feats_splice.ark,data/train/feats_splice.scp
- 归一化
语音识别中,归一化经常被称为倒谱均值方差归一化(CMVN)。这是由于语音识别特征通常为倒谱系数,在其基础上进行均值和方差归一化,称为CMVN。CMVN将输入特征规整为均值为0向量,方差为单位矩阵。
存在全局归一化(global CMVN)和说话人归一化(Speaker CMVN)。
# 估计CMVN系数
compute-cmvn-stats scp:data/train/feats.scp \
ark,scp:data/train/cmvn.ark,data/train/cmvn.scp
如果提供uttspk,则进行说话人归一化,否则进行全局归一化。
aishell实例:
# 应用CMVN进行特征变换
apply-cmvn scp:data/train/cmvn.scp scp:data/train/feats.scp \
ark,scp:data/train/feats_cmvn.ark,data/train/feats_cmvn.scp
借助标注信息估计的一组变换系数,增强输入特征的表征能力。
该类变换通常讲输入乘以一个变换矩阵。
特征变换估计方法主要可分为: 线性判别分析(LDA)和最大似然线性变换(MLLT)。
-
线性判别分析(LDA)
通过变换来减小同类特征之间的方差,增加不同类特征之间的方差。这里的类指的是声学模型的状态。 -
最大似然线性变换(MLLT)
这是一类变换的统称,包括半协定方差(STC)、均值最大线性似然回归(MeanMLLR)、方差最大线性似然回归(VarMLLR)和特征最大似然线性回归(fMLLR)。
其中,MeanMLLR和VarMLLR是针对模型参数的变换方法;STC和fMLLR是针对特征的变换方法。
2.1 STC
也被称为MLLT,用于全局特征变换。
由于是全局变换。因此解码时,只需要使用训练过程中估计的矩阵进行特征变换。
STC估计输出一个矩阵。
基于此训练的脚本为:steps/train_lda_mllt.sh
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.
步骤:
//生成先验概率,统计计算lda所需统计量,[splice-feats final.ali] -> [lda.acc]
ali-to-post
weight-silence-post
acc-lda
//估计lda矩阵,[lda.acc] -> [lda.mat]
est-lda
//通过对转换后的特征重新统计,用于生成决策树[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
//同lda,估计mllt的矩阵
ali-to-post | weight-silence-post | gmm-acc-mllt
est-mllt
//对gmm模型进行变换,[mllt.mat mdl] -> [new.mdl]
gmm-transform-means
//组合变换矩阵,[lda.mat mllt.mat] -> [lda.mat]
compose-transforms
//重新统计所需统计量,[$i.ali] -> [$i.acc]
gmm-acc-stats-ali
//估计新的模型,[$i.acc] -> [$i.mdl]
gmm-est //该步骤增加混合高斯分量的数目
//输出最后的模型
final.mdl = $i.mdl
done
aishell实例:
相比train_deltas.sh
多了LDA+MLLT变换。
2.2 fMLLR
用于说话人特定的特征变换。
由于是基于说话人的变换,因此解码时需要重新进行估计。先使用未变换的特征进行解码,再根据解码的对齐结果估计fMLLR系数,在进行特征变换。见steps/decode_fmllr.sh
。
在估计fMLLR时,如果不提供utt2spk,则按句估计fMLLR。
输出是按说话人缩阴的若干矩阵。
基于此的训练脚本为:steps/train_sat.sh
。且默认基于LAD+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.
步骤:
//生成先验概率,统计计算fmllr所需统计量,[splice-feats spk2utt] -> [trans]
ali-to-post
weight-silence-post
gmm-est-fmllr
//通过对转换后的特征重新统计,用于生成决策树[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
//同lda,估计fmllr的矩阵 -> [fmllr.trans]
ali-to-post | weight-silence-post | gmm-est-fmllr
//组合变换矩阵,[trans.mat fmllr.trans] -> [trans.mat]
compose-transforms
//重新统计所需统计量,[$i.ali] -> [$i.acc]
gmm-acc-stats-ali
//估计新的模型,[$i.acc] -> [$i.mdl]
gmm-est //该步骤增加混合高斯分量的数目
//输出最后的模型
final.mdl = $i.mdl
aishell实例:
如有问题或建议欢迎私信。
参考
[1] 《kaldi语音识别实战》[book]
[2] LDA_MLLT_fMLLR三音素HMM的训练流程图 [博客园]
[3] kaldi HMM-GMM全部训练脚本分解 [博客园]