这篇文章主要调研的是另外一种改进在线语音识别的方法:基于 RNN Transducer 方法。这篇文章可能文字讲解的地方会比较少,因为图片的内容信息量已经很大了,同时论文的出处我会一并放出,有兴趣的朋友可以阅读下原文。因为我本人是基于 TensorFlow 进行实验的。在 PyTorch Binding 的 Transducer Loss1ytic/warp-rnnt基础上,我添加 TensorFlow binding的支持TeaPoly/warp-rnnt。另外最近强势的基于 Chunk-aware/ local window 的 Conformer + Transducer/Seq2Seq 在线方法,也是我比较感兴趣的方向,基于滴滴的 Athena 框架(TensorFlow 2.2)上添加了 Conformer 的支持Conformer-Athena。文末还会给出更多有助于我们搭建基于 TensorFlow 的 RNN-T 训练框架的 Repo。
关于 Transducer Loss 显存占用过大的问题,可以参考手动支持混合精度训练以及微软的优化策略https://arxiv.org/pdf/1909.12415.pdfEfficient joint and function merge。efficient joint 我的 TensorFlow 实现在TeaPoly/Transducer-OptimizedLoss。
实时系统的训练准则对⽐
Frame-Level Criterion
Cross Entropy:

CE Loss 公式
Sequence-Level Criteria
- Maximum Mutual Information:

该 loss 出了对带浅层语言声学模型做基于词序列的标准解优化之外,还对竞争路径做了区分优化。
Ref:Sequence-discriminative training of deep neural networks
- Minimum Phone Error or state-level Minimum Bayes Risk:

基于MMI的进一步优化是,对标准路径做了相似路径优化扩充,引入了序列相似度打分,旨在缩小类内距离同时放大类外距离。
Ref:Sequence-discriminative training of deep neural networks
End-to-End Criteria
- Connectionist Temporal Classification:

相信会有部分人认为 CTC 方法端到端框架下有点牵强,我觉得这很大可能是因为后期出了 RNN-T、Seq2Seq、Encoder-Decoder 框架。可在 CTC 方法刚提出的时候大家普遍都认为这就是一种端到端的方法,该方法极大的简化了此前基于 GMM-HMM alignment 的数据准备流程,英文可以基于 BPE 等方法直接制作 word-piece 就可以训练,中文,建立发音映射表或者基于常用字替换表就可以直接训练。当然后期还是会依赖发音词典和语言模型。
- RNN-T:

RNN-T 是基于 CTC 的一个改进,详细内容可以参考两篇经典文章Sequence Transduction with Recurrent Neural Networks和Sequence to Sequence Learning with Neural Networks。具体优化如CTC、Prediction初始化,LayerNorm和学习率等会在后面论文实验部分来分享。似乎 RNN-T 在数据规模不是特别大(7~8万小时)的情况下,还是很需要工匠精神的。
论⽂中的实验对⽐
Model Units
以下是来自京东的一组训练框架的 setup

中文识别单元的实验对比如下:

京东的实验结果关于中文字的实验结果似乎和阿里Zhang Shiliang论文中的Investigation of Modeling Units for Mandarin Speech Recognition Using Dfsmn-ctc-smbr结果有些出入。我的理解是两个框架下中文字的建模有比较大的区别,一个基于7228字作为完整映射,一个基于2000/3000/4000中文字加拼音(或常用字替换)后期还是要基于发音词典(或常用字映射)来解码。后者对于语言层面的解码有很大的优化空间。
Ref:Research on Modeling Units of Transformer Transducer for Mandarin Speech Recognition
Different Criterion
Datsebase is 1000 hours Sogou dataset. model units is Chinese character:
- 26 English characters
- 6784 frequently-used Chinese characters an unknown token (UNK)
- a blank token

Ref:Exploring RNN-Transducer for Chinese Speech Recognition
Dataset

Ref:Exploring RNN-Transducer for Chinese Speech Recognition
Quality Improvements

Ref:Exploring RNN-Transducer for Chinese Speech Recognition
Quality Improvements

Configure:
- 8-layer encoder, 2048 unidirectional LSTM cells + 640 projection units.
- 2-layer prediction network, 2048 unidirectional LSTM cells + 640 projection units.
- Model output units: grapheme or word-piece.
- Total system size: ~120MB after quantization (more on this in a later slide).

开源项⽬
warp-transducer
Mingkun Huang奉献的 GPU/CPU 版本的 RNN-T Loss,目前支持 PyTorch/Tensorflow binding。结果符合预期,在加入 CTC 和 prediction 初始化之后提升非常可观。
Ivan Sorokin奉献的 GPU 版本的 RNN-T Loss,速度上较warp-transducer更有优势,显存占用方面差不多,支持 PyTorch/Tensorflow binding。Tensorflow binding 这部分是我写的。
rnnt-speech-recognition
Noah Chalifour大学生开发,一套基于 TensorFlow 2.0 的 RNN-T 训练框架,几乎从数据制作到训练、测试都是采用 TensorFlow,目前原作者似乎都没完整跑完一个 CommonVoice 训练。我目前跑了几个迭代,非常慢并且伴随 crash 的问题,猜测是因为训练过程中实时 Greedy Search 测试的缘故,所有只能从头完成了 RNN-T 的训练,后续考虑开源出来。说回来,rnnt-speech-recognition这部分代码的条理很清晰,同时风格也比较精练,整套代码很值得参考。
TensorflowASR
涵盖 CTC/Transducer/LAS/MultiTaskCTC 的一套训练框架,基于 TensorFlow。声学模型和语言模型都支持 Transformer/Conformer,aishell2 上 CER(WER) 已经做到了 4.4%。
微软亚洲研究院基于 ESPnet ( PyTorch backend) 修改而来的一套基于在线 Transformer 的 pipeline,包含 Chunk 和 lookahead 在线的方式,On the Comparison of Popular End-to-End Models for Large Scale Speech Recognition,基于 Librispeech 实验结果来看 chunk 的方式效果还是要更好,延迟和识别率都挺可观的。
