Kaldi 中文语音识别需要考虑的问题


转自:点击打开链接

原文作者:英语流利说团队 李飞腾


  • Kaldi语音识别
    • 1.声学建模单元的选择
      • 1.1对声学建模单元加入位置信息
    • 2.输入特征
    • 3.区分性技术
    • 4.多音字如何处理?
    • 5.Noise Robust ASR
    • 6.Deep Learning[DNN/CNN替换GMM]
    • 7.在手机等资源受限设备

author:Feiteng
Email:[email protected]
date:2014/08/10

Kaldi训练脚本针对不同的语料库,需要重写数据准备部分,脚本一般放在conf、local文件夹里;

  • conf放置一些配置文件,如提取mfcc、filterbank等参数的配置,解码时的一些参数配置
  • local一般用来放置处理语料库的数据准备部分脚本 > 中文识别,应该准备:发音词典、音频文件对应的文本内容和一个基本可用的语言模型(解码时使用) 
    注:一般情况下,在模型训练阶段LM对ASR的参数训练没有影响,即不影响GMM、HMM、DNN/CNN的参数值;使用区分度模型训练会有影响[生成Lattice候选]

1.声学建模单元的选择

  • 全音节[是否带声调]、声韵母[是否带声调]、音素? 
    > 带声调的声韵母作为建模单元是比较常见的中文识别选择,也有一些文章指出,使用更细化的phones 集可以有更多的性能提升:
    中文连续语音识别系统音素建模单元集的构建——包叶波等 
    基于发音特征的汉语普通话语音声学建模——颜永红等 
    基于发音特征的汉语声调建模方法及其在汉语语音识别中的应用——刘文举等 

1.1对声学建模单元加入位置信息

For instance, we'd have:
AA AA_B AA_E AA_I AA_S
for (B)egin, (E)nd, (I)nternal and (S)ingleton
and in the case of silence
SIL SIL SIL_B SIL_E SIL_I SIL_S
仍然要注意,中英文的差别,中文声学建模单元可能不含有全部的_B _E _I _S

2.输入特征

MFCC、fbank、PLP

  • 使用对角协方差矩阵的GMM由于忽略了不同特征维度的相关性,MFCC更适合用来做特征
  • DNN/CNN可以对更好的利用这些相关性,把MFCC的DCT省略,使用fbank特征可以更多地降低WER
    tips: Deep Learning更多是实验性质,解释多半是迎合实验现象 

    甚至直接从语音波形图上直接提取特征 

    IBM-Tara N. Sainath-2014-IMPROVEMENTS TO FILTERBANK AND DELTA LEARNING 

    Tara N. Sainath发表了一系列的CNN on Speech的文章,我觉得质量是CNN on Speech的文章中最好的

  • 中文是带声调的语言,声调不同,差别很多,因此可以在特征上加入声调信息

    2014-A DNN-BASED ACOUSTIC MODELING OF TONAL LANGUAGE AND ITS APPLICATION TO MANDARIN PRONUNCIATION TRAINING 

    2014-AUTOMATIC PHONETIC SEGMENTATION IN MANDARIN CHINESE BOUNDARY MODELS, GLOTTAL FEATURES AND TONE

  • Noise Robust feature?

    LiDeng2013-An Overview of Noise-Robust Automatic Speech Recognition

3.区分性技术

  • 区别特征提取:LDA、MLLR、SAT、fbMMI
  • 区分度模型训练:MMI、MPE、MCE、smbr
    经验:并不是所有区分性技术都有正面效果

4.多音字如何处理?

假设我们的文本标注如下:

spk001 我们 的 作品 为 第一名
发音词典如下:
的 d e0
的 d e4
的 d i2
为 w ei2
为 w ei4

都是多音字,那么在模型训练阶段如何根据标注spk001联合phones的HMM模型呢?
有两种解决策略:

  • ①唯一化处理:更改文本标注和发音词典,将多音字唯一化标注 

    如:

    的1 d e0 

    的2 d e4 

    为1 w ei2 

    为2 w ei4 

    spk001 我们 的1 作品 为1 第一名 

    这样做的话,我们在解码阶段需要去除发音词典中的标识1、2,从而不会在解码结果中引入多余的1、2

  • ②自动处理:Kaldi可以将多种选择(多音)编入spk001的fst,在Align阶段根据音频特征选择phone的标号
    这种处理可能不够精确,ML本来就不能100%准确,这点让人悲伤; 

    不过可能语料库的发音人并不能对所有的多音字都发正确的音,

    如果使用①需要校对每一个含有多音字的音频发音,人工大大的;

    英语单词也存在多音字,不过相比中文少得多,可参考:冯志伟-汉语拼音音节的歧义指数

5.Noise Robust ASR

  • 从特征提取、模型层面把噪声考虑进去 可参考:
    综述文章:LiDeng2013-An Overview of Noise-Robust Automatic Speech Recognition

6.Deep Learning[DNN/CNN替换GMM]

这一步“需要”先训练一个HMM+GMM,然后获得wav文件的alignment,即每一帧对应的phone->state
这样我们就为DNN准备好了 train.data train.label
注:我们可以使用为GMM提取的特征,也可以重新从wav提取特征,需要注意的是窗口大小、帧移要与alignment匹配;
通常提取fbank特征作为DNN的输入,而且组合当前帧左右相邻的n帧成 2n+1帧特征作为输入

  • Dropout、ReLU 
    关于Dropout我在TIMIT做了不下20组实验,才看到WER的下降,更绝大多数文章的描述并不相同; 
    ReLU做了几组实验,没看到更低的WER,有待继续。
  • CNN 
    根据实验CNN相比DNN会有5%-10%的WER下降,卷积层不同的实现[FFT vs 矩阵乘积]性能会有差异,这一层计算量略大 
    Tara N. Sainath发表了一系列的CNN on Speech的文章,我觉得质量是CNN on Speech的文章中最好的
  • 直接HMM+DNN混合训练
    参考:2014-google-GMM-FREE DNN TRAINING
  • 其他
    SVD低秩逼近W矩阵

7.在手机等资源受限设备

参考 雷欣 的两篇文章,针对数值存储、模型等做优化,在资源暂用与识别率下降方面做权衡

  • 1.2013-Accurate and Compact Large Vocabulary Speech Recognition on Mobile Devices
  • 2.FINE CONTEXT, LOW-RANK, SOFTPLUS DEEP NEURAL NETWORKS FOR MOBILE SPEECH RECOGNITION

你可能感兴趣的:(语音识别)