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)