流式语音识别模型(StreamingASRModel)是指可以在处理音频流的过程中,支持实时返回识别结果的一类ASR模型。与之相对的是非流式模型,它必须在处理完整句音频后才能返回结果。流式ASR可以更好地用于需要实时获取识别结果的场景,例如直播实时字幕、会议实时记录、语音输入、语音唤醒等场景。
作者丨林泽华
语音算法招聘及求职联系Danny:15995739706
Streamingautomaticspeechrecognition(ASR)aimstoemiteachhypothesizedwordasquicklyandaccuratelyaspossible,whilefull-contextASRwaitsforthecompletionofafullspeechutterancebeforeemittingcompletedhypotheses.[1]
1.流式ASR问题形式化
2.实现思路
2.1传统ASR算法实现流式的关键点
2.2端到端ASR算法实现流式的关键点
3.具体实现方式
3.1思路1:调整模型结构
3.2思路2:修改训练方式
4.流式ASR的用户体验问题
4.1单次识别延迟过大
4.2音频越长延迟越大
4.3中间结果突变
5.总结
6.参考资料
流式和非流式的区别在于是取整句上下文,还是上文,其中为已接收的音频特征流的当前帧索引。在实现中,允许模型有一定的延迟,此时虽然已经接收了帧输入,但实际解码到的是第帧,为有限的下文长度。或者对上文长度也有一定限制,即在对第帧后验概率建模的时候,只考虑指定长度的上下文内容:
和分别是上文(left-context)和下文(right-context)长度,则代表使用所有上文。
为什么要专门提流式的ASR模型呢?或者说难道现有模型无法流式么?要知道ASR模型通常都是可以处理不定长的数据的,既然可以处理短音频,那在推理的时候,一段一段地传输给模型识别,不就流式了么?
确实,这样也可以实现流式ASR,问题是:直接在推理阶段做了这样的修改之后,会导致训练和推理不一致,流式的效果相比非流式识别下降过大,达不到我们期望效果。
流式ASR的落脚点在于:如何让模型在训练阶段的建模对象和流式推理阶段一致,从而提高流式识别的效果。在这一点上,传统的ASR算法和端到端ASR处理思路是一样的。
传统ASR算法的优化目标为
其中,语言模型建模的是根据历史Token预测下一个Token的概率,并且只依赖于上文,它本身就是支持流式的。词典模型把发音序列转换为Token序列,也是流式的转换。因此关键在于声学模型是否支持流式。
目前已经有的流式ASR算法主要可以归纳为两类,第一类从模型出发,选取支持只考虑上文和有限下文模型结构,第二类从训练方式出发,手动限制模型下文长度,让模型只对有限上下文进行建模。
许多模型本身是不考虑(或只考虑有限的)下文的,例如FullyConnect只考虑当前帧或固定长度窗口的拼帧,RNN、LSTM、GRU等只考虑上文,CNN、TDNN等只考虑有限的上下文窗口。或者优化模型结构,如因果卷积。具体的模型结构这里就不一一列举了。
不依赖下文的模型示意图
在算法实现过程中,尽量使用这一类模型,就可以省去很多麻烦。例如kaldi算例里实现的大部分模型都是选取的支持流式的结构。再比如说,RNN-T从一开始就选用了RNN,当然也就支持流式。反之像LAS、Transformer等选取BLSTM、Self-Attention结构,要想实现流式就比较复杂。
对于BLSTM、Self-Attention等模型结构,期望上下文越多越好,为了让这一类模型具备只考虑有限上下文的建模能力,需要修改模型训练方式,在对第帧后验概率建模的时候,屏蔽掉指定长度上下文之外的内容。
主要的实现方法是基于chunk的方式,在序列建模的框架下,间接实现局部建模,例如LC-BLSTM[2]、以及诸多的流式Transformer等。
基于chunk的流式ASR
对chunk的有几种不同使用方式:
加入memory的chunk
对于Transformer等Encoder-Decoder结构的模型,其流式的关键在于Encoder的流式,因为大部分Decoder充当的是语言模型的角色,它的建模方式是
对于预测下一Token的概率的建模本身是只考虑上文的,因此最终还是围绕Encoder是否能流式。当然,Encoder采用不同的流式方式,Decoder相应也要做一定的适配,但理论上,Decoder本身是支持流式的。
上文我们提到基于chunk实现流式的方式,其中不同长度的chunk就意味着不同长度的延迟。一方面我们希望模型见到的上下文越丰富效果越好,另一方面,我们希望下文越少响应越快。这是chunk流式方案存在的内在矛盾,从这点上大家可以吐槽这种方案不够优雅。
在ASR解码过程中,中间结果的获取一般是通过回溯best-path来得到,但是随着解码不断进行,不同时刻的最优路径可能发生较大的改变,尤其是在一些声学模型结果区分度较小的场景,比如一些近似音、噪声太大等,就会使得n-best路径本身的得分比较接近,后续较小的得分变化就导致top-1路径改变,又或者因为加入了纠错、Rescore等模块,导致最终的识别结果与中间结果有较大差异。
流式ASR研究的是一类实际应用的问题:为了实现实时ASR的功能需求,以及提高人机语音交互过程中用户体验。本文对流式ASR问题做了形式化定义,分析了流式ASR关键在于声学模型考虑的上下文长度的原因,并把常见的实现方式归纳成调整模型结构和修改训练方式两大类。同时,本文列举了几个影响用户体验的问题。
流式ASR是目前的一个研究热点,但它的技术还不够成熟,仍待大家深入探索,不断突破。