传统的语音识别系统中,往往包含多个独立的模块,通常有如下模块:
特征提取模块,从输入的语音信号中提取特征,用于声学模型的建模以及解码过程,以MFCC为例,通过分帧、逐帧加窗、预加重、FFT计算功率谱、生成Mel Banks计算滤波输出、Log求倒谱、DCT离散余弦变换得到MFCC特征;
声学模型,通常通过对词,音节、音素等基本的声学单元进行建模,生成声学模型,主要面临两个问题特征向量序列的可变长和音频信号的丰富变化性,其中可变长特征向量序列问题在学术上通常有动态时间规划(Dynamic Time Warping, DTW)和隐马尔科夫模型(Hidden Markov Model, HMM)方法来解决,而音频信号的丰富变化性是由说话人的各种复杂特性或者说话风格与语速、环境噪声、信道干扰、方言差异等因素引起的,声学模型需要足够的鲁棒性来处理以上的情况;
语言模型,语言模型对系统所需识别的语言在单词层面上进行建模,判断出那个词是最适合出现在当前句中,当前采用基于统计的N元语法(N-gram)模型的相对较多,就我个人使用而言效果还是不错的,ngram语言模型采用了n元依赖假设,即当前词的概率,只依赖于前n-1个词,
不考虑平滑的问题,模型概率估计使用最大似然概率:
发音词典/词汇表:发音词典包含系统所能处理的单词的集合,并标明了其发音,通过发音词典得到声学模型的建模单元和语言模型建模单元间的映射关系,从而把声学模型和语言模型连接起来,组成一个搜索的状态空间用于解码器进行解码工作。在词典生成过程中,通过拼音-音素的映射确定的是拼音到音素的转换规则/映射关系,利用中文词-拼音的映射尽可能多的列出中文词及其对应的拼音,使用g2p工具实现输入中文词,输出对应音素的功能,还需要收集中文词因为发音字典需要覆盖尽可能多的词-音素,最后将中文词表作为输入,通过g2p工具获得词-音素的映射即为发音词典;
解码器:解码器是语音识别系统的核心之一,负责读取输入的语音信号的特征序列,再由声学模型、语言模型及发音词典生成的状态空间中,解码出以最大概率输出该信号的词串。解码器模块主要完成的工作包括:给定输入特征序列的情况下,在由声学模型、声学上下文、发音词典和语言模型等四种知识源组成的搜索空间中,通过维特比搜索,寻找最佳词串.在解码过程中,各种解码器的具体实现可以是不同的,就静态编译而言,是把所有知识源统一编译在一个状态网络中,在解码过程中,根据节点间的转移权重获得概率信息,由AT&T提出的Weighted Finite State Transducer(WFST)方法是一种有效编译搜索空间并消除冗余信息的方法,后面有关WFST知识点再单独剖析理解。
在端到端ASR过程中,只分为输入端的语音特征和输出端的文本信息,输入经过一个 RNN 生成一个向量即为encoding,之后用另一个 RNN 从向量中解码出所需的文本信息即为decoding,整个模型不需要词对齐以及额外的语言模型,E2E模型通常包含以下的具体模型:
CTC:主要负责声学模型的训练,能够自动对齐输出标签和输入序列,不需要再像DNN-HMM模型那样做对齐标注,能够解决时序类数据的分类问题.为了方便下面的描述,我们做如下定义,输入音频信号用符号序列X表示,对应的输出对应的标注文本用符号序列Y表示,为了便于训练我们希望能够找到输入X 与输出Y之间的映射关系,但是这里面存在一个问题就是X和Y的长度是变化的,而CTC在训练时不关心具体的唯一的对齐关系,而是考虑所有可能对应为标签的序列概率和,所以比较适合这种类型的识别任务,CTC引入了blank(该帧没有预测值),每个预测的分类对应的一整段语音中的一个spike(尖峰),其他不是尖峰的位置认为是blank。对于一段语音,CTC最后的输出是spike(尖峰)的序列,并不关心每一个音素持续了多长时间.现在使用的CTC常用的场景是RNN后接CTC算法,RNN模型输入是个个音频片段,输出个数与输入的维度一样,有T个音频片段,就输出T个维度的概率向量,每个向量又由字典个数的概率组成。例如网络输入音频个数定为T,字典中不同字的个数为N,那么RNN输出的维度为TxN,根据这个概率输出分布,我们就能得到最可能的输出结果,在接下来的讨论中可以把RNN+CTC看成一个整体,当然也可以将RNN替换成其他的提取特征算法也是没问题的,这里面就是大同小异了,举个通俗易懂的例子,比如输入一个200帧的音频数据,真实的输出是长度为5的结果, 经过神经网络处理之后,出来的还是序列长度是200的数据。假如有两个人都说了相同内容的ni hao这句话,他们的真实输出结果都是ni hao这5个有序的音素,但是因为每个人的发音特点不一样,比如,有的人说的快有的人说的慢,原始的音频数据在经过神经网络计算之后,第一个人得到的结果可能是:nnnniiiiii…hhhhhaaaaaooo(长度是200),第二个人说的话得到的结果可能是:niiiiii…hhhhhaaaaaooo(长度是200),这两种结果都是属于正确的计算结果,可以看出长度为200的数据,最后可以对应上nihao这个发音顺序的结果是非常多的,CTC就是用在这种序列有多种可能性的情况下,计算和最后真实序列值的损失值的方法,对于损失函数这里要明确一点,一个标定好的音频片段,训练该片段时,我们希望的输出就是标定的文本,假如音频说的一个hello,RNN或者其他模型输出的是相同数量的向量,向量里是每个字母的概率.
RNN-T:全称是Recurrent Neural Network Transducer,是在CTC的基础上改进的,CTC的缺点是它没有考虑输出之间的dependency,而RNN-T则在CTC模型的Encoder基础上,又加入了将之前的输出作为输入的一个RNN,称为Prediction Network,再将其输出的隐藏向量与encoder得到的j结果放到一个joint network中,得到输出logit再将其传到softmax layer得到对应的class的概率。RNN-T能够联合优化声学模型与语言模型,由于RNN-T是针对每帧输入特征进行预测输出,即不用等语音全部说完再出结果,因此可以更好的应用在流式识别上,尤其是在嵌入式设备。
Attention:Attention 模型的特点是 Eecoder 不再将整个输入序列编码为固定长度的中间向量 ,而是编码成多个向量(或者说一个向量的序列),并为不同的向量根据实际需要赋予不同的权重,以此来影响输出结果.首先要确定的是Attention是一种权重向量或矩阵,其往往用在Encoder-Decoder架构中,但Attention本身并不一定要在 Encoder-Decoder 框架下使用的,它是可以脱离 Encoder-Decoder 框架的,其权重越大,表示的context对输出越重要,它的计算方式有很多变种,但是核心都是通过神经网络学习而得到对应的权重,通常第i步的输出Yi与其Attention权重aij相关,而权重aij与Decoder中的第i-1步的隐藏状态、Encoder中的第j层隐藏状态hj相关;
Transformer:可以通过借助RNN-T在语音识别上的优势,利用tranformer替换RNN-T中的RNN结构,实现并行化运算,加快训练过程。