天天看点

基于ASRT中文语音识别系统的优化

该项目是基于CNN+CTC网络实现,中文标注是拼音,解码使用HMM,项目地址:https://github.com/nl8590687/ASRT_SpeechRecognition

该项目很不错,但是本人用原版项目代码进行训练测试无法达到较好的效果,然后对其做了一些改动,时间有限最终拼音ER在11%左右,词错误率WER 在33%左右,数据集使用aishell,thchs30,ST-CMDS

原版项目解释可以参考github上的说明,比较详细,下面说下优化部分:

模型架构使用VGG(微调结构适配频谱图)+CTC

原始VGG网络:

基于ASRT中文语音识别系统的优化

其中微调版VGG结构:

Conv3-32
BatchNormalization
Conv3-32
BatchNormalization
maxpool
Conv3-64
BatchNormalization
Conv3-64
BatchNormalization
maxpool
Conv3-128
BatchNormalization
Conv3-128
BatchNormalization
Conv3-128
BatchNormalization
maxpool
Conv3-256
BatchNormalization
Conv3-256
BatchNormalization
Conv3-256
BatchNormalization
maxpool
Conv3-256
BatchNormalization
Conv3-256
BatchNormalization
Conv3-256
BatchNormalization
maxpool
Conv3-256
BatchNormalization
Conv3-256
BatchNormalization
Conv3-256
BatchNormalization
maxpool
FC-512
BatchNormalization
FC-512
BatchNormalization

一.声学模型构建实验

1.对原始模型进行测试,作者表述模型识别拼音的错误率在18.26%,我进行测试改模型识别拼音的错误率在21%左右。注意拼音解码至文字序列也会增加错误率,在之前并未进行测试。

2.首先使用原始版本纯RNN+CTC进行实验,数据使用aishell1,修改部分是在每层RNN后增加batch normalization,训练最好拼音错误率在18%

3.使用微调VGG + CTC ,对于dev和test集训练最好结果拼音错误率在11%左右,train集的拼音错误率在0.1%左右,存在过拟合现象。

4.也尝试使用 Rest_Net50 +CTC ,对于dev集训练最好结果拼音错误率在 15%左右,所以最终选择微调VGG + CTC

二.语言模型解码实验

使用基于HMM的viterbi解码拼音至文字,并在源代码进行优化解码算法,在增加原有识别文字序列为空时促发恐慌算法进行补偿的基础上,增加二次补偿算法,增加了识别准确率。最终文字解码错误率CER在33%左右。存在的问题有:识别序列长度与原标注不一致,会造成计算错误率上升很多,比如在序列中间多一个字但后面是正确的,也会计算为后面文字全部为错误。

另外对于HMM的转移概率也进行了优化,原公式转移概率=二元词频/二元词第一个字的词频,修改为转移概率=pow(二元词频,2)/(二元词第一个字的词频*二元词第二个字的词频),增加考虑到第二个词反向转移到第一个词的概率,经过大量试验该项优化可以小幅度提升准确度。

在效率上,LanguageModel2.py源代码中选择最优路径算法使用双层for循环时间复杂度O(N2),修改为归并排序时间复杂度O(NlogN),大幅度加快了解码速度。

继续阅读