语音识别深度学习模型

1 引言

一个语音识别系统主要分为声学模型与语言模型部分。整体的流程为将对语音信号进行特征提取,然后利用声学模型编码序列,然后利用语言模型对生成的句子进行优化(确定具体的字符、单词)。

如果是识别几个简单的命令,那么可以把识别任务看成一个分类任务,那么就不需要语言模型以及解码搜索步骤。google发布的speech command数据集就是简单的识别几十个命令,如:stop、up、off等。

深度学习模型目前已经成为了语音识别的主流模型,而且在学术研究中有end-to-end的趋势,不过在实际应用中仍然是一个大的工程项目,由一些处理单元组成。n-gram的语言模型仍然十分常见,并没有完全被神经网络语言模型取代。语音识别的目前的难点包括:背景噪声的影响,不同的口音、语言模型,这些仍然没有完全得到解决。当然,实际应用中,可以通过一些技巧来绕过这个问题,例如:微软PPT同声语音识别中,通过使用PPT本身的内容辅助进行语音识别。

2 特征表示

语音识别中的特征表示,最常用的是MFCC。由于深度学习模型对于特征之间的相关性不敏感,一些模型也开始使用更加原始的filter bank。

有一篇很好的博客详细解释这些特征【1】。这里我们简单进行介绍。

一个语音信号是一个随时间变化的音量大小信号,可以看成一个声音波形,一般信号采集时,使用固定频率采集波形,常用频率为16000Hz。下面是一个波形的示例。

在提取特征过程中,会对波形窗口划分,窗口大小可以设置为20ms~40ms,常用的是25ms,窗口移动的步长为10ms,因此相邻的窗口有15ms的重叠。

对每个窗口进行傅里叶变换,Short-Time Fourier-Transform (STFT)。并且计算得到power spectrum。计算公式为

P=\dfrac{|FFT(x_i)|^2}{N}

这里i表示第i个窗口。

在此基础上,Filterbank使用三角形状的滤波器,得到各个窗口的特征。一般采用40个滤波器,得到的结果中每个时间窗对应长度为40的特征向量。

Filter bank得到的特征之间相关性很强,因此MFCC采用Discrete Cosine Transform (DCT)?filter bank进行去相关性。

通常,为了增强信噪比(Signal-to-Noise)会对特征进行正则化处理,每个时间窗的特征减去整个样本上的平均值。

3 网络结构

在语音识别的神经网络模型中,通常是CNN、双向LSTM(BLSTM)结构,以及一些seq2seq的模型。

3.1 ResNet

ResNet训练快、效果好。效果也不比循环神经网络差太多。模型的由多个残差连接模块组成。模型详情可以参见深度学习经典模型。

3.2 Lace

Lace【2】(layer-wise context expansion with attention)是微软提出的一个模型,主要是对CNN的一个改进。模型结构如图所示,可以看出模型中的JumpNet实际上就是残差连接。多个JumpNet之后加入了一个element-wise matrix product


下面这张图解释了element-wise matrix product。实际是对CNNfilter的简化,对于某个位置的所有channel采用相同的权重,输出是几个位置上的特征加权和。


3.3 CNN-BLSTM

这种模型【4】先使用CNN对特征进行映射,随后采用双向LSTM建模序列信号。在微软的语音识别系统【3】以及百度的Deep Speech2中都采用了这种结构。

再实现技巧上,值得注意的地方在于,LSTM中使用的batch normalization,如果采用普通的batch normalization没有什么效果。例如deep speech2使用的是sequence-wise normalization。另外RNN中的也经常使用Layer Normalization,这在tensorflow中有相关的实现。

3.4 seq2seq模型

另外也有一部分Seq2seq模型【6】,模型上与机器翻译中使用的模型相差不大,在技巧上,主要采用的是multi-head attention、label smooth、对于生成文本使用语言模型进行second-pass rescoring。

3.4 说话人向量(i-vector)

当然在对话系统中,存在不同说话人之间的切换,因此,在微软以及IBM【9】的系统中都采用了说话人向量i-vector,通常取100维。I-vector的计算采用的是EM算法,详细计算方法可以参见【7,8】。在使用i-vector的过程中,如果是LSTM,那么对于每个输入都拼接上i-vector。但是CNN在每个filter中都使用了,多个位置的信息,因此使用i-vector的方法是对每层加上一个W^l v_s,这里W^l是可训练的参数,v_s是i-vector。

4 总结

本文简单介绍了语音识别中几个深度学习模型。可以看出模型结构上基本上基于CNN与LSTM的,采用的技巧很多事神经网络模型通用的技巧,如:残差连接、Batch normalization。比较有特色的是说话人向量的处理。

从微软2017年的论文可以窥见,各个公司的系统应该都采用了模型集成的方法,基础模型还是CNN与CNN-LSTM。论文中采用的依然是传统方法来提取i-vector,没有采用深度学习模型来提取i-vector。微软的系统中已经开始采用基于LSTM的语言模型。

参考:

  1. Yu, Dong, et al. “Deep Convolutional Neural Networks with Layer-Wise Context Expansion and Attention.”?INTERSPEECH. 2016.
  2. THE MICROSOFT 2017 CONVERSATIONAL SPEECH RECOGNITION SYSTEM
  3. Sainath, Tara N., et al. “Convolutional, long short-term memory, fully connected deep neural networks.”?Acoustics, Speech and Signal Processing (ICASSP), 2015 IEEE International Conference on. IEEE, 2015.
  4. Amodei, Dario, et al. “Deep speech 2: End-to-end speech recognition in english and mandarin.”?International Conference on Machine Learning. 2016.
  5. Chiu, Chung-Cheng, et al. “State-of-the-art speech recognition with sequence-to-sequence models.”?arXiv preprint arXiv:1712.01769?(2017).
  6. Saon, George, et al. “Speaker adaptation of neural network acoustic models using i-vectors.”?ASRU. 2013.
  7. Dehak, Najim, et al. “Front-end factor analysis for speaker verification.”?IEEE Transactions on Audio, Speech, and Language Processing?19.4 (2011): 788-798.
  8. Saon, George, et al. “The IBM 2015 English conversational telephone speech recognition system.”?arXiv preprint arXiv:1505.05899?(2015).

这里有一个speech的state of the art列表:
https://github.com/syhw/wer_are_we

一些代码

特征提取:

https://github.com/jameslyons/python_speech_features

模型:

Tensorflow中examples/speech_commands

https://github.com/mozilla/DeepSpeech (包含数据集)

https://github.com/baidu-research/ba-dls-deepspeech

Facebook公开代码:https://github.com/facebookresearch/wav2letter

发表评论