本人经过一番寒彻骨,学习shell、linux、kaldi,终于将kaldi中最简单的样例理解,由于过于口语话,文中可能出现措辞不当,忘谅解。
首先我们打开kaldi中yesno例子,打开脚本run.sh,第一行是脚本解释器,,我们采用bash这个脚本解释器;
然后是train_cmd,decode_cmd两个变量,进行本地运行。对于接下来的if条件语句,如果你已经下载了yesno的语料,则可以将其注释;
然后设置两个变量train_yesno、test_base_name,分别作为训练目录和测试目录,之后采用rm -rf data exp mfcc删除冗余数据;
接下来就是进行对下载的数据处理成kaldi可以训练解码的格式,首先调用local/prepare_data.sh脚本,以wave_yesno为参数,对数据进行处理。然后运行脚本prepare_dict.sh,建立字典,然后运行prepare_lang.sh,这一步的目的创建音素等下面建模需要的音素,目录等;
然后进行特征提取,yesno脚本是提取mfcc特征。关于数据处理技术中,数据预处理技术主要包括样本特征归一化和全局特征标准化两种技术。如果每个样本均值的变化与处理问题无关,就应该将特征均值归零,减小特征相对于深度神经网络模型的变化。在语音识别任务中,提取完mfcc特征后,往往采取倒谱均值归一化(CMN),是在句子内减去美尔倒谱系数(MFCC)特征的均值,可以减弱声学信道扭曲带来的影响;关于全局特征标准化目标是使用全局转换缩放每维数据,使得最终特征向量出于相似动态范围内。在语音识别任务中,对于实数数据,例如MFCC和FBANK,通常会使用一个全局转换将每维特征归一化为均值0,方差1。经过特征归一化后的数据,往往能在后续处理的过程中能取得较好的效果。如果不做特征归一化,能量维或者MFCC特征的第一维会遮蔽其他维度特征,导致不能充分训练语音特征。
下面进行单因素训练,高斯核数目设置为400,然后进行图像化解码;
之后进行解码操作,我的理解是:kaldi里实现的就是在不同层面有不同的FST,用到的就是WFST,不同层次的有限状态转换机结合到一起,也就是H*C*L*G(有剪枝),然后搜索最佳路径;
最后对我们的训练好的模型进行score,里面涉及到shell文本处理的三大利器:awk、gerp、sed,这里本人就不做详细说明了,这就是大致完整的yesno脚本的详解。
关于linux、kaldi学习本人还是处于初级阶段,欢迎大佬或者新手给予我建议,博主QQ76859420.