whisper流式语音识别 docker_复杂度


谷歌发布了一篇被ICASSP 2020收录的论文《Transformer Transducer: A Streamable Speech Recognition Model with Transformer Encoders and RNN-T Loss》。论文提出了一种新的语音识别方法,它结合了Transformer和RNN-T,并用mask控制上下文的范围,实现了流式语音识别,提升了识别速度,为实时端到端语音识别的发展做出了开拓性贡献,支持实时语音识别也是语音对话机器人(Siri、小爱同学等)、智能语音外呼机器人等产品的基础。

注:流式是指边说边进行识别的任务方式。

一、背景介绍

目前,基于transformer的语音识别模型在做流式解码时面临着一些困难,而流式解码正是做实时语音识别的关键。首先,传统的transformer结构需要decoder和 encoder共同的信息做注意力机制,也就意味着这是一种label-synchronous解码。此外self-attention的计算量随输入序列长度的增加呈二次方增长,如果要做到流式的话最好是处理时间保持定值,其与输入长度无关。

针对可以流式解码的语音识别最容易想到的是用RNN,因为他们既可以有效的描述输入语音在时域的依赖性,也可以保证将每一帧的计算量保持在一个常数的范围内,因此之前推出了基于RNN的RNN-T和RNA等流式端到端的结构。此外,他们还可以学到输入语音的声学特征和标签之间的对齐关系,所以他们天生就有了frame-synchronous 解码的能力。

由于Transformer模型结构相对简单并且可以并行计算,因此这篇论文将transformer和 RNN-T结合起来,提出一种可以做流式处理的Transformer transducer的语音识别模型。

二、方法介绍

1.RNN-T结构

如下图所示是RNN-T的结构,他用前馈网络和softmax将audio encoder的输出和label encoder的输出结合起来,从而在每一个时间节点得到一个在输出标签上的概率分布。这篇论文就是把RNN-T中encoder的部分换成了Transformer结构,之前很多工作的encoder部分都是基于LSTM的,因为transformer结构简单,而且self-attention的计算本身可以并行化,所以相比用了RNN的RNN-T来说,新的方法极大的缩短了训练时间。


whisper流式语音识别 docker_语音识别_02


2.RNN-T损失函数

下面介绍RNN-T结构中用到的损失函数,因为我们想要得到在已知输入序列的情况下输出标签的概率分布,一种方法是通过对输出标签和编码特征间的对齐关系进行积分,从而得到概率分布,如下图公式所示:


whisper流式语音识别 docker_语音识别_03


但是上述这种方法在实际计算中是非常难操作的,所以论文采用了一种前向算法来计算这个概率分布。因此,最终的RNN-T损失函数如下图所示,其中alpha代表前向算法:


whisper流式语音识别 docker_kaldi语音识别实战pdf_04


3.Transformer

上面谈到的RNN-T结构中的label encoder和audio encoder部分,在本论文中分别都用了如下Transformer的结构来代替。与传统的transformer结构不同,LabelEncoder不能注意到AudioEncoder:


whisper流式语音识别 docker_kaldi语音识别实战pdf_05


4.如何实现流式实时解码

论文用了相对位置编码,这样我们就可以重新利用之前计算过的状态值,达到减少计算的效果。因此,在t时刻,计算激活值的复杂度是O(t)(注意t 个状态和前向过程的花费)。另外,如果用绝对位置编码的话,因为不能重新利用已计算过的状态值,所以复杂度是O(t^2)。虽然通过改变位置编码,复杂度从O(t^2)降到O(t),但是随着时间增长,延迟还是会越来越长。潜意识的一种解决方法是让模型只注意一个滑动窗W里面的状态,这样就能将复杂度变成常数。对于传统的transformer模型来说,有decoder和encoder之间的注意力,所以就自己本身去学输入和输出标签的对齐关系而言,它是不能只注意有限的上下文去做训练或者推断的。而Transformer-Transducer这种做法,把AudioEncder和LabelEncoder分开了,对齐关系是通过RNN-T中单独前向、后向过程学习的,这样子就能把注意力局限在自己定义的一段上下文中用了。

三、实验结果

论文用了970小时的公开数据集Librispeech做了实验,在实验中,模型结构配置采用18层audio encoder和2层label encoder,基于logmel energy生成了512维的特征,同时也用了谷歌之前出的Specaugment的方法对数据进行了增强扩充从而防止过拟合和增强泛化能力。值得一提的是,新结构的训练时间大幅缩短,Transformer transducer的训练时间为1天,而基于LSTM的RNN-T的训练则需要3.5天。

论文首先对比了如果用full attention Transformer Transducer模型和其他模型的WER结果,如下图(Table 2)所示,由此可以看到本次的模型FullAttn T-T在WER和模型大小上综合表现是最好的。


whisper流式语音识别 docker_复杂度_06


为了能实现流式语音识别,之后实验还调整了audio encoder和label encoder的上下文宽度,实验结果如Table6所示,可以看出,利用的音频历史信息越长,WER就会越低,但是为了实现流式处理,作者把audio encoder左边的上下文降到了10帧做了测试。实验证明,在audioencoder的上下文被限制在10的时候,labelencoder左边的上下文宽度对WER的影响很小。此外,在audio encoder中如果利用未来两帧的信息可以让WER效果提高30%。


whisper流式语音识别 docker_kaldi语音识别实战pdf_07


四、总结

本篇论文提出了Transformer transducer的语音识别模型,此模型将RNN-T结构中的encoder从LSTM 替换为Transformer,使用RNN-T损失函数,通过mask来控制输入语音和标签的上下文来实现流式解码,有效地在解码速度和WER之间做出了权衡。现在工业界的实时语音识别服务大多基于Kaldi进行开发,而Kaldi是基于大量C++和shell等脚本语言开发的,不易快速上手进行二次开发,不知道谷歌推出的这款新型的流式端到端语音识别算法,之后是否会成为工业界的首要选择呢?