kaldi语音识别 chain模型的数据准备
egs的可视化:
在介绍chain模型的数据准备过程之前,我们先来看一下所生成egs的具体内容:
nnet3-chain-copy-egs ark:train.cegs ark,t:text.cegs
通过以上指令可将chain模型生成的egs由二进制文件转化成文本文件。具体形式如下图所示:
53995f3a79b411eaa903cb6b0881f966是utt_id,525表示是该该trunk是从该utt的第525帧开始的。
<NumInputs> 1 表示只有一个输入。如果采用了ivector,则此处的值变成2.
input <I1V> 230 表示该trunk共230帧,左偏移40帧,右偏移189帧。
第三行开始到第232行,表示230帧的mfcc特征,
由于chain模型采用跳帧策略,所以egs中存储的是三倍下采样后输出索引:
分子lattice。WFSA结构。用于计算MMI
强制对齐结果,用于计算交叉熵
egs的生成过程
step 1. 划分验证集和训练子集。利用utt2uniq,确保训练集和验证集的划分不交叉。
step 2:设置输入特征和ivector相关信息(可选)。cmvn支持apply-cmvn-online和apply-cmvn两种
step 3:获取训练数据的帧数和特征维度
step 4 :计算egs的数量
num_archives = num_frames / (frames_per_iter) + 1
egs_per_archive = num_frames / (frames_per_eg * num_archives)
step 5:设置egs和chain的配置信息。值得一提的是constrained参数默认是True。我们后期可以设置为False
step 6: 设置lattice的情况。默认是用gmm解码得到的完整lattice作为分子,主要是为了防止gmm得到的lattice不准确,有一定的容错机制。但是我感觉可以用剪枝后的结果,以提供更加准确的信息。
step 7:验证集和训练子集的egs生成。主要涉及三个函数:lattice-align-phones、chain-get-supervision和nnet3-chain-get-egs
step 8:正式生成训练集的egs。注意,此时生成的文件名叫cegs_orig.JOB.$n.ark,第一个数字表示job_id,第二个表示ark索引。
step 9:将同属一个job id的egs合并在一起。默认情况下,archive_multiple=1。该过程还伴随着shuffle和归一化的操作。normalization.fst在分母有限状态机den.fst的基础上,修改了初始概率和终止概率得到的。
由于chain模型训练过程使用的是trunk,而不是完整的句子,所以 需要修改。
step 10:删除临时文件
- 点赞
- 收藏
- 关注作者
评论(0)