1.1单音素模型脚本流程
单音素建模脚本(steps/train_mono.sh):
#monophone
steps/train_mono.sh--boost-silence 1.25 --nj$n --cmd "$train_cmd" data/mfcc/train data/lang exp/mono \
|| exit 1;
输出在exp/mono中,下面按脚本train_mono.sh运行流程逐项说明。
1.1.1 特征倒谱归一化(Cepstralnormalization)
exp/mono/cmvn.logexp/mono/cmvn.ark:对每个说话人,计算归一化倒谱均值和方差的统计值
#cepstralnormalization
#feature: add"delta" and "accelaration", dim = 39
feats="ark,s,cs:apply-cmvn$cmvn_opts --utt2spk=ark:$sdata/JOB/utt2spkscp:$sdata/JOB/cmvn.scp scp:$sdata/JOB/feats.scp ark:- | add-deltas ark:- ark:- |"
example_feats="`echo$feats| sed s/JOB/1/g`";
1.1.2 模型初始化(Modelinitialization)
#modelinitialization
#options used toget plausible means and variances
#tree isphonetic-context decision tree-- doesn’t have any splits in monophone case.
$cmd JOB=1$dir/log/init.log \
gmm-init-mono $shared_phones_opt"--train-feats=$feats subset-feats --n=10 ark:- ark:-|"$lang/topo$feat_dim $dir/0.mdl $dir/tree || exit 1;
- 运行log:exp/mono/log/init.log
- 调用gmm-init-mono命令行工具,即gmm-init-mono.cc中的函数。
gmm-init-mono<topology-in> <dim> <model-out> <tree-out>
- 双引号中为一些命令行选项,确保求得的均值方差是可行的。
- 输入:HMM拓扑文件data/lang/topo和GMM特征维度39。
- 输出:模型文件exp/mono/0.mdl和决策树exp/mono/tree。
注1:单音素决策树
--可以通过copy-tree命令行工具查看音素上下文决策树文件。
--决策树文件中存储的是多态类型对象EventMap。
--TE指的是TableEventMap,表示树的各种节点的查询Table。
--CE指的是ConstantEventMap,表示树的叶子节点。
--SE指的是SplitEventMap,表示树的分支,而在单音素模型中不需要做split处理。
--“TE 0 219”表示从第0个音素开始分裂,这里0指向NULL,因为phone-id中0是为epsilon保留的。随后是219个non-NULL event map。
--“TE -1 3 ( CE5 CE 6 CE 7 ) ”这个字符串表示一个音素的分裂从key-1开始,这个key表示拓扑结构中的pdfclass,在这里也就是HMM状态,其中,-1是初始状态,0、1、2是 HMM 中间的转移状态,3 是结束状态。中间的3个转移状态可以有对应的CE,每一个表示决策树的一个叶子节点。
注2:HMM拓扑文件
--可以通过cat data/lang/topo查看。
--给定了所有非静音音素的3状态left-to-right型HMM结构,并给出了开始训练前默认的状态转移概率。
--静音音素单独给出了5状态的HMM结构,具有更多的状态转移。
注3:模型文件0.mdl
--通过gmm-copy命令行工具查看模型文件gmm-copy --binary=false exp/mono/0.mdl - | less
--模型文件中包含两部分,一部分是TransitionModel(转移模型),其中包含HMM拓扑结构、triples以及转移概率;另一部分是AmGmm(声学模型)。模型文件中的对象都不是Table,所以直接通过Read/W