从场景来看,语音识别可以分为流式语音识别和非流式语音识别。非流式语音识别(离线识别)是指模型在用户说完一句话或一段话后进行识别,而流式语音识别是指模型在用户还在说话时同步进行语音识别。由于其低延迟,流式语音识别在业界具有广泛的应用,例如听写和转录。Transformer流式语音识别挑战目前,Transformer模型虽然可以在离线场景下进行准确的语音识别,但在流式语音识别中遇到了两个致命的问题:1)计算复杂度和内存存储开销会随着语音时长的增加而增加。由于Transformer在使用self-attention模型时考虑了所有的历史信息,因此存储和计算的复杂度会随着语音时长线性增加。流式语音识别往往有很长的语音输入,所以原生的Transformer很难应用于流式语音识别。图1:Transformerself-attentionforstreamingspeechrecognition示意图2)由于Transformer模型层数过多,会通过futurewindowsize(lookaheadwindow)。如下图所示,如果Transformer模型每层回溯一帧,那么最终的lookahead会随着Transformer层数的增加而累积。比如一个18层的Transformer最终会累积18帧的延迟,在实际应用中会造成很大的延迟,使得语音识别的响应速度变慢,用户体验变差。图2:Transformer的未来窗口随着层数的增加Block-based和memory-based解决方案为了解决Transformer模型在流式语音识别中存在的上述问题,研究人员提出了chunk-based和memory-based两种解决方案.1)Chunk-based方案第一种方案是chunk-based方案,如下图,虚线是chunk的分隔符。主要思路是将相邻的帧变成一个块,然后按照块进行处理。这种方法的优点是可以快速训练和解码,但由于块与块之间没有连接,导致模型精度较差。图3:Block-basedstreamingspeechrecognitionsolution2)memory-basedsolutionmemory-based方案的主要思想是在block的基础上引入memory,这样不同的block就可以链接起来。但是这种方式会破坏训练中的非自循环机制,使得模型训练速度变慢。图4:基于内存的流式语音识别方案业界往往存在大量的训练数据,基于内存的方案会增加模型训练的开销。这促使研究人员寻找平衡准确性、训练速度和测试速度的解决方案。快速训练解码,Mask应有尽有针对以上问题,微软研究人员提出了一种快速训练解码的方法。这个方法很简单,只需要一个掩码矩阵就可以把非流式Transformer变成流式Transformer。下图是non-flow和0delay的mask矩阵,是一个全1的矩阵,或者说是一个下三角矩阵。图5:离线语音识别编码器掩码矩阵图6:0延迟的流式语音识别编码器掩码矩阵研究人员希望在基于块的方法中连接不同的块,并保持Transformer的并行训练特性。为了实现这一目标,研究人员提出了基于块的流式Transformer。具体算法如下:首先,在当前帧的左侧,让每一层的每一帧向前看n帧,这样作为层数Transformer对历史的视觉的叠加就可以累加了。如果有m层,可以看到n*m帧的历史。尽管看到了额外的n*m帧,但这些帧不会减慢解码时间,因为它们的表示是在历史计算中计算的,不会在当前块中重新计算。与解码时间相关的只是每层可以看到的帧数。因为希望以后的信息延迟小,所以要避免层数对视野的累积影响。为了实现这一点,每个块的最右边的帧可以在没有任何未来视图的情况下制作,而块内的帧可以相互看到,这可以防止延迟随着层数的增加而增加。最后,在每个块之间,不同的帧可以相互看到,这样平均延迟是块长度的一半。这种方式可以让Transformer保持并行训练的优势,训练速度很快。得到的mask矩阵如下。图7:所提出方法的编码器掩码矩阵在解码过程中,解码时间主要由块大小决定。缓存之前的key和value,避免重复计算,加速解码。该方法的公式如下,在计算attentionweight的时候会缓存历史key和value(红色标注)。实验数据集和模型设置研究人员进行的实验在微软内部进行了超过65,000小时的训练,并在微软内部约180万个单词的测试集上进行了测试。实验使用了32块GPU,混合精度训练了两天左右使模型收敛,使用torchjit进行测速。研究人员使用Transducer框架实现语音识别流识别。实验对比了TransformerTransducer(T-T)、ConformerTransducer(C-T)和RNNTransducer(RNN-T)。Transformer和Conformer的编码部分使用了18层,每层隐藏状态(hiddenstate)=512个参数。Transducer中的预测器网络采用LSTM网络结构,包含两层,每层hiddenstate=1024。RNN-T的大小也差不多。低延迟解码效果表1:低延迟解码效果从表1可以看出:1)在低延迟的情况下,T-T和C-T会消除10%的字错误率(WordErrorRate,WER);2)如果每层向左看60帧(1.8s),与看整个历史的结果相比,性能损失并不大,大约1%;3)但是T-T的速度比RNN-T慢在四线程的情况下,Transformer比RNN慢3倍左右。这个问题可以使用batch的方式来解决,即将相邻的几个帧一起解码,然后利用Transformer的并行能力来加速解码。表2:Transformer的实时率表2是不同Transformer对应batch的帧数的实时率。可以看到,当两帧一起解码时,Transformer已经达到了RTF<1,而当五帧一起解码时,RTF<5。据此可以得出结论,T-T可以在不量化的情况下应用到实际场景中,代价是延迟很小(2帧约40ms)。低延迟解码效果表3:低延迟解码效果在低延迟的情况下,TransformerTransducer家族的优势更加突出。与传统的混合(hybrid)模型相比,T-T有13%的WER提升。与streamingS2S模型(参数相同)相比,Transducer模型往往会取得更好的结果(与RNNS2S和TransS2S相比)。在相同的Transducer框架下,Transformer模型会取得比RNN模型更好的效果,而且在速度上也有明显的优势。令人惊讶的是,通过上述方法,目前T-T离线与流式的距离小于10%,证明了研究人员提出的流式方法的有效性,可以最大程度避免精度损失。8位量化表4:经过8位量化结果,可以得到更快的Transducer模型。在单线程情况下,Transformer可以提速一倍,但是RNN-T可以提速4倍左右。其中,Transformer速度提升有限的原因是SoftMax、LayerNorm等操作难以通过8位加速。结论在本文中,MicrosoftAzure语音团队和微软亚洲研究院的研究人员共同提出了一种流式语音识别解决方案,它结合了Transformer编码器家族和流式Transducer框架。该解决方案使用Mask机制来快速训练和解码流式语音识别模型。在65000小时大规模训练数据的实验中可以看出,Transformer模型相比RNN模型在识别准确率上有明显提升,并且在低延迟场景下,解码速度更快。未来,研究人员将继续研究基于Transformer的语音识别模型,力求进一步降低解码的计算消耗,使Transformer模型在零延迟场景下能够达到与RNN模型相同的解码速度。
