WAV2LETTER++:最快的开源语音识别系统

Vineel Pratap, Awni Hannun, Qiantong Xu, Jeff Cai, Jacob Kahn, Gabriel Synnaeve,
Vitaliy Liptchinsky,Ronan Collobert

Facebook AI Research

摘要

本文介绍 wav2letter++,最快的开源深度学习语音识别框架。 wav2letter++ 完全用 C++ 编写,使用 ArrayFire 张量库来获得最大效率。 在这里,我们解释 wav2letter++ 系统的体系结构和设计,并将其与其它主要的开源语音识别系统进行比较。 在某些情况下,wav2letter++ 比其它用于训练端到端神经网络进行语音识别的优化框架快 2× 我们还显示,对于具有 1 亿个参数的模型,wav2letter++ 的训练时间线性扩展至我们测试的最高 64 个 GPU。 高性能框架支持快速迭代,这通常是成功研究和对新数据集和任务进行模型调整的关键因素。

1 简介

随着人们对自动语音识别(ASR)的兴趣越来越大,开源软件生态系统中的 ASR 系统和工具包层出不穷,包括Kaldi [1]、ESPNet [2]、OpenSeq2Seq [3] 和 Eesen[4] 在过去的十年中,这些框架已经从基于隐马尔可夫模型(HMM)和高斯混合模型(GMM)的传统语音识别转变为基于端到端神经网络的系统。 许多最新的开源 ASR 工具包,包括本文中介绍的工具包,都依赖于基于 graphemes 而不是 phonemes 的端到端声学建模。 发生这种变化的原因有两个:端到端模型非常简单,并且与 HMM/GMM 系统的精度差距正在迅速缩小。 C++ 是世界上流行度排名第三的编程语言 1 它允许对高性能关键任务系统进行完全的资源控制,此外,静态类型可以通过在编译时捕获任何类型不匹配来帮助进行大型项目。 此外,几乎可以从任何编程语言轻松调用原生库。 但是,由于主流框架中缺少定义较好的 C++ API,因此在机器学习社区中 C++ 的使用几乎停止,并且 C++ 主要用于性能关键的组件。 随着代码库的扩大,在脚本语言和 C++ 之间来回切换也变得麻烦且容易出错。 而且,只要有足够的库,现代 C++ 的开发也不会比脚本语言慢很多。 在本文中,我们介绍第一个完全用 C++ 编写的开源语音识别系统。 通过使用现代 C++,我们没有牺牲编程的简便性,而是保持编写高效和可扩展软件的能力。 在这项工作中,我们专注于 ASR 系统的技术方面,例如训练和解码速度以及可扩展性。 本文其余部分的结构如下。 2部分,我们讨论 wav2letter++ 的设计。 3部分中,我们简要讨论其它现有的主要开源系统,并在4部分中将它们的性能与我们的性能进行比较。

2 设计

wav2letter++ 的设计受三个需求的驱动。 首先,该工具包必须能够在数千小时语音的数据集上高效地训练模型。 其次,表示和融入新的网络结构、损失函数和其它核心操作应该很简单。 第三,从模型研究到部署的路径应该简单明了,在保持研究所需的灵活性的同时,需要尽可能少的新代码。

2.1 ArrayFire 张量库

我们使用 ArrayFire [5] 作为张量操作的主要库。 我们选择 ArrayFire 的原因有很多。 ArrayFire 是高度优化的张量库,可以在多个后端(包括 CUDA GPU 后端和 CPU 后端)上执行。 ArrayFire 还使用即时代码生成将一系列简单操作组合到单个内核调用中。 这样可以更快地执行内存带宽绑定操作,并可以减少峰值内存使用量。 ArrayFire 的另一个重要特征是用于数组构造和操作的简单接口。 与支持 CUDA 的其它 C++ 张量库相比,ArrayFire 接口简单并且依赖于较少的 C++ 特性。

2.2 数据准备和特征提取

我们的特征提取支持多种音频文件格式(例如 wav、flac... / 单声道、立体声 / int、float)以及多种特征类型,包括原始音频、线性缩放的能量谱、log-Mels(MFSC)和 MFCC。 我们使用 FFTW 库来计算离散傅里叶变换 [6] 在每次进行网络评估之前,wav2letter++ 中的数据加载都会动态计算特征。 由于完整的端到端流水线可以从单个二进制文件运行,这使得探索其它特征更加简单,允许动态数据增强,并使部署模型更加容易。 为了在训练模型时提高效率,我们异步并行地加载解码音频并计算特征。 对于我们测试过的模型和批次大小,花费在数据加载上的时间可以忽略不计。

PIC

1wav2letter++ 库体系结构。

2.3 模型

我们支持几种端到端的序列模型。 每个模型都分为 network 和 criterion。 network 只是输入的函数,而 criterion 是输入和目标文本的函数。 network 始终具有参数,criterion 的参数是可选的。 这种抽象使我们可以使用相同的训练流水线轻松训练不同的模型。 支持的 criteria 包括 Connectionist Temporal Classification(CTC)[7]、wav2letter 原有的 AutoSegCriterion (ASG) [8] 和带有 attention 的 Sequence-to-Sequence 模型 (S2S) [9, 10] CTC criterion 没有参数,而 ASG 和 S2S criterion 都具有可以学习的参数。 此外,我们注意到添加新的序列 criteria 特别容易,因为可以使用 C++ 有效实现 ASG 和 CTC 等损失函数。 我们支持广泛的网络结构和激活函数 — 在此无法列出。 对于某些操作,我们使用更有效的 cuDNN 操作[11] 扩展 ArrayFire CUDA 核心后端。 我们使用 cuDNN 提供的 1D 和 2D 卷积以及 RNN 程序。 由于我们使用的网络库提供动态图的构建和自动微分,因此构建新层或其它原始操作的工作量很小。 我们给出一个示例,说明如何构建和训练具有二元交叉熵损失的单层 MLP(在图2中),以演示 C++ 接口的简单性。

PIC

2示例:使用自动微分对一个隐藏层 MLP 进行二元交叉熵和 SGD 训练。

2.4 训练和扩展

我们的训练流水线为用户提供最大的灵活性,使他们可以尝试不同的特征、结构和优化参数。 训练可以三种模式运行 — train(从零训练)、continue(从一个检查的状态继续)和 fork(例如迁移学习)。 我们支持标准优化算法,包括 SGD 和其它常用的基于梯度的一阶优化器。 我们通过数据并行和同步 SGD,将 wav2letter++ 扩展到更大的数据集。 对于进程间通信,我们使用 NVIDIA Collective Communication Library(NCCL2)2 为了最小化进程之间的等待时间并提高单个进程的效率,我们在构造用于训练的批次之前,根据输入长度对数据集进行排序 [12]

2.5 解码

wav2letter++ 解码器是一种具有多种优化的 beam-search 解码器以提高效率 [13] 我们使用与 [13] 相同的解码目标,包括来自语言模型和单词插入项的约束。 解码器接口接受来自声学模型的 emissions 和(如果相关)transitions 作为输入。 我们还给解码器一个 Trie,其中包含单词字典和语言模型。 我们支持任何类型的语言模型,只要它们开放我们的解码器所需的接口,包括 n-gram LM 和任何其它无状态参数 LM。 我们在 KenLM 之上为 n-gram 语言模型 [14] 提供一个轻量的封装。

名称 语言 Model(s) ML Syst.
Kaldi C++, Bash HMM/GMM -
DNN/LF-MMI -
ESPNet Python, CTC, seq2seq, PyTorch,
Bash hybrid Chainer
OpenSeq2Seq Python, C++ CTC, seq2seq TensorFlow
wav2letter++ C ++ CTC, seq2seq, ArrayFire
ASG
表1主要的开源语音识别系统。

3 相关工作

我们简要概述其它常用的开源语音识别系统,包括 Kaldi [1]、ESPNet [2] 和 OpenSeq2Seq [3] 到目前为止,Kaldi 语音识别工具包 [1] 最为古老,它由一组独立的命令行工具组成。 Kaldi 支持 HMM/GMM 和混合 HMM/NN 的声学建模,并包括基于音素的预置程序。 端到端语音处理工具包(ESPNet)[2] 与 Kaldi 紧密集成,并将其用于特征提取和数据预处理。 ESPNet 使用 Chainer [15] 或 PyTorch [16] 作为后端来训练声学模型。 它主要是用 Python 编写的,但是仿照 Kaldi 的风格,上层工作流程以 bash 脚本表示。 在鼓励解耦系统组件的同时,这种方法在表达类型安全、可读性和直观性的接口时缺少静态类型的面向对象编程语言的优势。 ESPNet 还具有基于 CTC 的[7] 和 基于注意力的编解码器 [10] 的实现作为结合两个标准的混合模型。 与 ESPNet 类似,OpenSeq2Seq [3] 具有基于 CTC 和编码器/解码器的模型,并使用 TensorFlow [17]而不是 PyTorch 作为后端。 对于上层流程,OpenSeq2Seq 还依赖于调用 Perl 和 Python 脚本的 bash 脚本。 OpenSeq2Seq 系统的显着特征是它对混合精度训练的支持。 同样,ESPNet 和 OpenSeq2Seq 都支持文本到语音(TTS)的模型。 1描述这些开源语音处理系统的分类。 如表所示,wav2letter++ 是唯一完全用 C++ 编写的框架,它(i)可以轻松集成到实际上以任何编程语言实现的现有应用程序中;(ii)通过静态类型化和面向对象的编程更好地支持大规模开发;(iii)允许最大效率,如4部分所述。 相比之下,Python 之类的动态类型化语言可以促进快速原型设计,但是缺少强制静态类型化通常会阻碍大规模开发。

4 实验

在本节中,我们将在比较研究中讨论 ESPNet、Kaldi、OpenSeq2Seq 和 wav2letter++ 的性能。 ASR 系统是根据《华尔街日报》(WSJ)数据集[18]的大词汇量任务进行评估的。 我们再 WSJ 上测量训练时的平均周期时间和平均语句解码延迟。 我们用于实验的计算机具有以下硬件配置:每台计算机均在具有16GB内存的NVIDIA SXM2模块上具有八个NVIDIA Tesla V100 Tensor Core GPU。 每个计算节点具有2个Intel Xeon E5-2698 v4 CPU,在2.20 GHz时共有40个(2 × 20)内核,80个硬件线程(“内核”)。 所有机器都通过100Gbps InfiniBand网络连接。

PIC

图3 训练循环中主要步骤的时间(以毫秒为单位)。 这里的时间为在一个完整的时期内每个批次的平均时间。

4.1 训练

我们根据缩放网络参数和增加使用的GPU数量来评估训练时间。 我们考虑 2 种神经网络架构:循环神经网络,有 3000 万个参数;纯卷积网络,有 1 亿个参数,分别在图4的上图和下图中描述。 对于 OpenSeq2Seq,我们同时考虑 float32 和混合精度 float16 训练。 对于这两个网络,我们都使用 40 维 log-mel filterbank 作为输入,并使用 CTC [7] 作为 criterion(基于 CPU 的实现)。 对于 Kaldi,我们使用 LF-MMI [19] criterion,因为标准的 Kaldi 食谱中没有 CTC 训练。 所有模型都使用带动量的 SGD 训练。 每个 GPU 我们使用 4 个语句的批次大小。 每次运行限制每个 GPU 使用 5 个 CPU 内核。 3提供有关训练流水线主要组成部分的更详细视图;处理时间为使用单个GPU在整个周期内的平均。

PIC

图4 训练时间比较(对数刻度)。 顶部:30m 参数的 RNN,受 DeepSpeech 2 [12] 启发:2 个空间卷积层、然后是 5 个双向 LSTM 层,然后是 2 个线性层。 底部:具有 100m 参数的CNN,类似于 [13]:18 个时间卷积层,后跟 1 个线性层。

对于这两种模型,wav2letter++ 都有明显的优势,并随着我们扩展计算规模而增加。 对于具有 3000 万个参数的较小模型,即使在单个 GPU 上,wav2letter++ 也比第二好的系统快 15% 以上。 请注意,由于我们使用8台GPU机器,因此在16、32和64个GPU上进行的实验涉及多节点通信。 ESPNet不支持开箱即用的多节点培训。 我们通过使用带有NCCL2后端的PyTorch DistributedDataParallel模块来扩展它。 ESPNet依赖于预先计算的输入功能,而wav2letter ++和OpenSeq2Seq出于灵活性而实时计算功能。 在某些情况下,OpenSeq2Seq 混合精度训练将周期时间减少 1.5 倍以上。 这是 wav2letter++ 将来可以从中受益的优化。 Kaldi 的 LF-MMI 不会为每个 SGD 同步更新梯度;每个周期的时间仍然比原来慢 20 倍以上。 我们没有在图4中包括Kaldi,因为标准(LF-MMI)和优化算法不易比较。

4.2 解码

Name WER (%) Time/sample (ms) Memory (GB)
ESPNet 7.20 1548
OpenSeq2Seq 5.00 1700 7.8
OpenSeq2Seq 4.92 9500 26.6
wav2letter++ 5.00 10 3.9
wav2letter++ 4.91 140 5.5
表2:LibriSpeech dev-clean的解码性能。

wav2letter++ 包含一个用 C++ 编写的 one-pass beam-search 解码器(请参见第2.5节)。 我们将其与 OpenSeq2Seq 和 ESPNet 中的其它 beam-search 解码器进行基准测试。 Kaldi 没有包含,因为它不支持 CTC 解码,而是实现了一个基于 WFST 的解码器。 我们向每个解码器提供由在 LibriSpeech 上训练的全卷积 OpenSeq2Seq 和 Wave2Letter++ 3 生成的相同的、预先计算的 emissions。 在给定相同模型的情况下,这可以独立评估性能。 由于 ESPNet 不支持 n-gram LM 解码,因此将 4-gram LibriSpeech 语言模型用于 OpenSeq2Seq 和 wav2letter++。 在表2中,我们报告单线程解码在 LibriSpeech dev-clean 上的解码时间和峰值内存使用情况,以达到 5.0% 的 WER,以及每个框架可获得的最佳 WER。 我们对超参数进行重大调优,以使报告的结果反映出报告的 WER 的最佳可能速度。 wav2letter++ 不仅比类似的解码器好一个数量级,而且使用的内存也少得多。

5 结论

在本文中,我们介绍了 wav2letter++:一种开发端到端语音识别器的快速简单的系统。 该框架完全用 C++ 编写,因此可以有效地训练模型和执行实时解码。 与其它语音框架相比,我们的初步实施显示出令人鼓舞的结果;尽管 wav2letter++ 可以从进一步的优化中继续受益。 由于其简单且可扩展的接口,wav2letter++ 非常适合用作端到端语音识别快速研究的平台。 同时,我们还保留基于 Python 的 ASR 系统可能进行某些优化以缩小与 wav2letter++ 差距的可能性。

6 参考

[1]    Daniel Povey, Arnab Ghoshal, Gilles Boulianne, Lukas Burget, Ondrej Glembek, Nagendra Goel, Mirko Hannemann, Petr Motlicek, Yanmin Qian, Petr Schwarz, et al., “The kaldi speech recognition toolkit,” in IEEE 2011 workshop on automatic speech recognition and understanding. IEEE Signal Processing Society, 2011, number EPFL-CONF-192584.

[2]    Shinji Watanabe, Takaaki Hori, Shigeki Karita, Tomoki Hayashi, Jiro Nishitoba, Yuya Unno, Nelson Enrique Yalta Soplin, Jahn Heymann, Matthew Wiesner, Nanxin Chen, et al., “Espnet: End-to-end speech processing toolkit,” arXiv preprint arXiv:1804.00015, 2018.

[3]    Oleksii Kuchaiev, Boris Ginsburg, Igor Gitman, Vitaly Lavrukhin, Carl Case, and Paulius Micikevicius, “Openseq2seq: extensible toolkit for distributed and mixed precision training of sequence-to-sequence models,” arXiv preprint arXiv:1805.10387, 2018.

[4]    Yajie Miao, Mohammad Gowayyed, and Florian Metze, “Eesen: End-to-end speech recognition using deep rnn models and wfst-based decoding,” in Automatic Speech Recognition and Understanding (ASRU), 2015 IEEE Workshop on. IEEE, 2015, pp. 167–174.

[5]    James Malcolm, Pavan Yalamanchili, Chris McClanahan, Vishwanath Venugopalakrishnan, Krunal Patel, and John Melonakos, “Arrayfire: a gpu acceleration platform,” 2012.

[6]    Matteo Frigo and Steven G. Johnson, “The design and implementation of FFTW3,” Proceedings of the IEEE, vol. 93, no. 2, pp. 216–231, 2005, Special issue on “Program Generation, Optimization, and Platform Adaptation”.

[7]    Alex Graves, Santiago Fernández, Faustino Gomez, and Jürgen Schmidhuber, “Connectionist temporal classification: labelling unsegmented sequence data with recurrent neural networks,” in Proceedings of the 23rd international conference on Machine learning. ACM, 2006, pp. 369–376.

[8]    Ronan Collobert, Christian Puhrsch, and Gabriel Synnaeve, “Wav2letter: an end-to-end convnet-based speech recognition system,” CoRR, vol. abs/1609.03193, 2016.

[9]    Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Bengio, “Neural machine translation by jointly learning to align and translate,” arXiv preprint arXiv:1409.0473, 2014.

[10]    Jan K Chorowski, Dzmitry Bahdanau, Dmitriy Serdyuk, Kyunghyun Cho, and Yoshua Bengio, “Attention-based models for speech recognition,” in Advances in neural information processing systems, 2015, pp. 577–585.

[11]    Sharan Chetlur, Cliff Woolley, Philippe Vandermersch, Jonathan Cohen, John Tran, Bryan Catanzaro, and Evan Shelhamer, “cudnn: Efficient primitives for deep learning,” arXiv preprint arXiv:1410.0759, 2014.

[12]    Awni Hannun, Carl Case, Jared Casper, Bryan Catanzaro, Greg Diamos, Erich Elsen, Ryan Prenger, Sanjeev Satheesh, Shubho Sengupta, Adam Coates, et al., “Deep speech: Scaling up end-to-end speech recognition,” arXiv preprint arXiv:1412.5567, 2014.

[13]    Vitaliy Liptchinsky, Gabriel Synnaeve, and Ronan Collobert, “Letter-based speech recognition with gated convnets,” CoRR, vol. abs/1712.09444, 2017.

[14]    Kenneth Heafield, “Kenlm: Faster and smaller language model queries,” in Proceedings of the Sixth Workshop on Statistical Machine Translation. Association for Computational Linguistics, 2011, pp. 187–197.

[15]    Seiya Tokui, Kenta Oono, Shohei Hido, and Justin Clayton, “Chainer: a next-generation open source framework for deep learning,” in Proceedings of workshop on machine learning systems (LearningSys) in the twenty-ninth annual conference on neural information processing systems (NIPS), 2015, vol. 5, pp. 1–6.

[16]    Adam Paszke, Sam Gross, Soumith Chintala, Gregory Chanan, Edward Yang, Zachary DeVito, Zeming Lin, Alban Desmaison, Luca Antiga, and Adam Lerer, “Automatic differentiation in pytorch,” 2017.

[17]    Martín Abadi, Paul Barham, Jianmin Chen, Zhifeng Chen, Andy Davis, Jeffrey Dean, Matthieu Devin, Sanjay Ghemawat, Geoffrey Irving, Michael Isard, et al., “Tensorflow: a system for large-scale machine learning.,” in OSDI, 2016, vol. 16, pp. 265–283.

[18]    Douglas B Paul and Janet M Baker, “The design for the wall street journal-based csr corpus,” in Proceedings of the workshop on Speech and Natural Language. Association for Computational Linguistics, 1992, pp. 357–362.

[19]    Daniel Povey, Vijayaditya Peddinti, Daniel Galvez, Pegah Ghahremani, Vimal Manohar, Xingyu Na, Yiming Wang, and Sanjeev Khudanpur, “Purely sequence-trained neural networks for asr based on lattice-free mmi.,” in Interspeech, 2016, pp. 2751–2755.