本节介绍基本的端到端语音识别涉及的重要概念
语音识别任务中,输入是语音,输出是文本,两个序列不等长,但是时序上有同步性。传统语音识别通过HMM来建模输出和输入不等长和时序同步性,并对音素,词典,语言模型分层次建模。
在传统的HMM框架里,声学模型往往在三音素的hmm状态级别建模,与语言模型分开建模训练,在训练时,任务的整体目标被割裂成多个训练目标。 另外,传统的HMM框架框架的模型训练会涉及到很多过程,包括上下文相关音素,音素聚类,HMM-GMM训练,强制对齐等,非常繁琐。
下面是一个HMM-DNN模型的训练过程,仅用于说明训练过程的复杂,具体内容可以不看。
1.对于每个句子扩展为单音素序列,用前向后向EM训练,得到单音素的hmm-单高斯model1。
2.用model1对句子做对齐,单高斯进行2倍分裂,更新模型,迭代这个对齐/分裂的过程n次,得到单音素的hmm-gmm模型model2.
3.用model2对句子做对齐,将音素根据上下文扩展为三音素,使用单高斯学习每个音素的决策树,,最后每个叶子结点对应一个单高斯. 得到一个三音素-hmm-单高斯模型model3
4.类似于第2步,用model3不停迭代分裂高斯,得到三音素hmm-gmm的model4
5. model4对句子做对齐,对齐数据用于帧级别NN训练.
...一般在传统HMM框架下,会先利用HMM-GMM模型,通过对齐的方式,得到帧级别的对应标注,再通过帧级别损失函数来优化神经网络模型, 不过这也不是必须的,HMM框架也可以不做帧对齐,比如论文End-to-end speech recognition using lattice-free MMI中直接进行训练。
近几年,基于神经网络的端到端建模方式则更佳简洁
- 直接以目标单元作为建模对象,比如中文使用
字,英文使用字符或者BPE. - 通过特殊的模型(目标函数),处理输入输出对齐未知的问题。
这类端到端模型常用的建模方式分两类: 基于CTC目标函数和基于Attention-Encoder-Decoder结构的模型。在这两种框架下,可以选用各种不同的类型神经网络。比如DNN,RNN,CNN,Self-Attention。
CTC目标函数
传统语音识别通过HMM来约束输出和输入的对齐方式(时间上保持单调),CTC是一种特殊的HMM约束。
CTC本质上对所有合法的输出和输入对齐方式进行了穷举,所谓合法,即对齐后的输出序列能够按CTC规则规约得到的原标注序列,则为合法对齐。
使用CTC目标函数会引入一个blank的输出单元,CTC规约规则为:
- 连续的相同字符进行合并
- 移除blank字符
一个例子:
某段语音数据,输入帧数为7帧(此处仅用于举例),原始的标注序列为“出门问问”,为4个字,但是网络需要输出7个单元,输出和输入一一对应。CTC模型中,通过对原标注内的4个单元进行重复和插入blank来扩展为7个单元,下面两种都是可能的扩展序列,其中-为blank,如果扩展序列通过CTC规则规约可以得到原标注序列,则改扩展序列称为合法对齐序列。
出-门问问-问 -> 出门问问
出-门--问问 -> 出门问第一个对齐序列出-门问问-问是合法对齐序列,第二个对齐序列出-门--问问不是合法对齐序列。
除了出-门问问-问还有很多其他合法序列,比如
出出门问问-问
出出出门问-问
出-门-问-问
出--门问-问
...CTC目标函数的思想是: 既然不知道哪种对齐关系是正确的,那就最大化所有合法CTC对齐的概率之和。所以对于这个样本,目标就是最大化如下概率。
P(出门问问|X) = P(出-门问问-问|X) + P(出出门问问-问|X)
+ P(出出出门问-问|X)+ ... + P(出--门问-问|X)求这个目标函数梯度的一种方式是穷举所有的有效CTC对齐,分别求梯度相加。但是这种方法复杂度太高。由于CTC本身结构特点,存在一种更高效的动态规划算法,可以极大的提升速度。具体可参考论文CTC-paper和文章Eesen中的CTC实现。
解码时,模型对每一个输入帧都给出输出,这种解码方法称为Frame同步解码。若某些帧输出为blank或者和前一帧是重复的字符,则可以合并。 由于穷举序列中blank占的个数最多。最后模型倾向于输出尽量少的非blank字符,因此解码序列中往往每个非blank字符只输出一次,这个叫做CTC的尖峰效应。
学习CTC的优秀材料:
Attention-based Encoder Decoder
Attention-based Encoder Decoder简称AED,也叫Seq2Seq框架,在ASR领域里,该框架也叫做LAS(Listen, Attend and Spell)。
模型中的encoder对输入序列(语音)进行信息提取,decoder则是一个在目标序列(文本)上的自回归模型(输入之前的单元,预测下一个单元),同时在自回归计算时,通过attention方式去获取encoder的输出编码信息,从而能够利用到输入序列的信息。
这种建模方式,可以不必显示建模输出和输入之间的对齐关系,而是利用attention机制交给网络去学习出隐含的对齐。相比如CTC,AED允许输入输出单元之间存在时序上的交换,因此特别适用于机器翻译这种任务。但是对于语音识别或者语音合成这些存在时序单调性的任务,这种无约束反而会带来一些问题。
AED的解码
解码时,不需要对每一个输入帧都进行输出,而是根据整个输入序列信息和已输出信息进行下一次输出,直到输出一个特殊结束字符。 这种解码方法称为Label同步解码。
多说一句
CTC没有显示构建文本之间的关系,RNN-t模型是一种显示建模了文本关系的帧同步解码的模型。
标准的AED中,decoder和encoder之间cross-attention需要看到encoder的完整序列,所以无法进行流式识别。可利用GMM-attention/Mocha/MMA等单调递进的局部Attention方法进行改进。
联合建模
研究者发现,联合使用CTC loss和AED可以有效的加速训练收敛,同时得到更好的识别结果。目前这个方法已经成为端到端学习的标准方案。
在解码时,同时使用CTC和AED的输出,可以提高识别率,但是由于AED本身是非流式的解码,在Wenet中,则没采用联合解码的方式,而是采用了先使用CTC解码,再用AED对CTC的Nbest结果进行Rescoring,这样即结合了两种模型的效果,又可以应用于流式场景。
神经网络类型
常用的神经网络类型包括DNN,CNN,RNN,Self-attention等,这些方法进行组合,衍生除了各种模型,Wenet中,对于encoder网络部分,支持Transformer和Conformer两种网络。decoder网络部分,支持Transformer网络。
Transformer由多个Transformer Block堆叠,每个Block中会使用self-attention,res,relu,ff层。
Conformer由多个Conformer Block堆叠,每个Block中会使用conv,self-attention,res,relu,ff层。
降采样/降帧率
输入序列越长,即帧的个数越多,网络计算量就越大。而在语音识别中,一定时间范围内的语音信号是相似的,多个连续帧对应的是同一个发音,另外,端到端语音识别使用建模单元一般是一个时间延续较长的单元(粗粒度),比如建模单元是一个中文汉字,假如一个汉字用时0.2s,0.2s对应20帧,如果将20帧的信息进行合并,比如合并为5帧,则可以线性的减少后续encoder网络的前向计算、CTC loss和AED计算cross attention时的开销。
可以用不同的神经网络来进行降采样,Wenet中使用的是2D-CNN。
流式语音识别
虽然CTC解码是Frame同步的,但是要想支持低延迟的流式识别,Encoder中的计算对右侧的依赖不能太长。标准的Fully self-attention会对依赖整个序列,不能进行流式计算,因此wenet采用了基于chunk的attention,将序列划分为多个固定大小的chunk,每个chunk内部的帧不会依赖于chunk右侧的帧。同时,连续堆叠的convolution层会带来较大的右侧依赖,wenet则采用了因果卷积来避免convolution层的右侧依赖。
