WAV2LETTER ++:最快的开源语音识别系统
WAV2LETTER++:最快的开源语音识别系统Vineel Pratap, Awni Hannun, Qiantong Xu, Jeff Cai, Jacob Kahn, Gabriel Synnaeve,Vitaliy Liptchinsky, Ronan CollobertFacebook AI研究原文请参见:https://arxiv.org/abs/1812.07625,感谢原作者,因译
WAV2LETTER ++:最快的开源语音识别系统
Vineel Pratap, Awni Hannun, Qiantong Xu, Jeff Cai, Jacob Kahn, Gabriel Synnaeve,
Vitaliy Liptchinsky, Ronan Collobert
Facebook AI研究
原文请参见:https://arxiv.org/abs/1812.07625 ,感谢原作者,因译者才疏学浅,偶有纰漏,望不吝指出。
本内容由灵声讯音频-语音算法实验室整理翻译,转载和使用请与“灵声讯”联系,联系方式:音频/识别/合成算法QQ群(696554058)
本文介绍了最快的开源深度学习语音识别框架wav2letter ++。wav2letter++的代码全是用C++编写,同时为了最大提升效能使用了Array Fire 张量计算库。 在这里我们将要说明这个系统架构和设计,并与其他一些主流的开源语音识别系统做比较。 在某些情况下,wav2letter ++训练时长比其他端到端的神经网络语音识别框架快两倍以上。 同时,我们还展示了具有1亿个参数的模型的wav2letter++在64 GPU上的训练时间,这可是我们测试的最高值。高性能框架可实现快速迭代,对其至关重要的一个因素是在新的数据集和新任务上的成功研究和模型调整。
关键词: 语音识别,开源软件,端到端
1.引言
随着对自动语音识别(ASR)兴趣的日益增长,开源软件生态系统已经看到了ASR系统和工具库的使用寿命,包括Kaldi [1],ESPNet [2],Open Seq2Seq [3]和Eesen [4]。在过去十年里,这些框架已完成从传统的基于隐马尔可夫模型(HMM)到高斯混合模型(GMM),再到基于神经网络端到端系统的转换。近期许多开源的ASR工具库,包括本文中已提到的,都依赖于基于字的端到端声学建模而非音素。这样转变的内在原因是两方面的:一是端到端模型比其他模型明显更简单,二是在准确率方面与HMM / GMM等系统的差距也越来越小。C ++是世界上第三大流行的编程语言, 它允许用于完整的资源控制,以实现高性能和关键的任务系统。此外,静态类型有助于在大型项目编译时捕获任意错误。而且,本地库可以很容易被其他编程语言所调用。但是,在机器学习中采用C ++,由于在主流框架中缺乏定义明确的C ++ API而停滞不前,同时C ++也更多是被用于高性能核心组件。随着代码量越来越大,在脚本语言和C ++之间来回传递数据也变得麻烦且容易出错。尽管它提供了足够多的库,但是在目前用C ++开发要比脚本语言慢得多。在本文中,我们介绍了第一个完全用C++编写的开源语音识别系统。通过使用C ++,我们做到了不牺牲编程的简易性,同时还要保证能编写高效且可扩展的软件。在这项工作中,我们专注于ASR系统的技术方面,例如训练和解码速度,以及可扩展性等。本论文的其余部分结构如下:在第二节中,我们讨论了wav2letter ++的设计;在第三节中,我们简要地讨论了其他现有的主流开源系统,在第四节中对以上架构的性能做了比较。
2.设计
wav2letter ++的设计受三方面的驱动。首先,对于成千上万小时的数据集,能够尽可能高效的训练模型。第二,表示和整合新的网络架构,损失函数和其他核心操作应该很简单。第三,从模型研究到部署的流程应该是简便的,需要尽可能少的新代码,同时保持研究所需的灵活性。
2.1 Array Fire(高性能并行计算库)
我们使用Array Fire作为张量计算的主要库,选择Array Fire是有以下几个原因的。Array Fire是一个高度优化的张量库,它可以在多个后台上运行,包括CUDA GPU后台和CPU后台。 它还可以即时生成代码,将一系列简单操作组合到单个内核中调用。这样使得内存带宽占用的执行速度更快,以减少峰值内存的占用。Array Fire的另一个重要的特点是构造的接口简单,对阵列操作也很简单。与其他支持CUDA的 C++张量库相比较,Array Fire接口更加简洁,且对C ++特性的依赖更少。
图1. wav2letter ++架构
2.2 数据准备和特征提取
我们的特征提取支持多种音频文件格式(例如wav,flac ...... / 单声道,双声道 / 整型,浮点型)和多种特征类型,如raw,线性功率谱,梅尔对数谱(MFSC)和梅尔倒谱系数(MFCC)。我们用FFTW库来计算离散傅立叶变换。在wav2letter ++中对加载的数据求特征之前,会对每一个网络进行评估。这使得探测替代特征更简单,也允许动态数据加载。也使从完整的端到端管道开始,更容易从单个二进制文件运行来使用模型。为了使高效率训练模型,我们从加载和解码音频数据,到计算特征计都是异步和并行的。对于我们测试的模型和样本集,数据加载所花费的时间是可以忽略不计的。
2.3 模型
我们支持多种端到端模型。每个模型都可以分为网络和标准两部分。网络只是输入的函数,而标准是输入和目标转换的函数。网络总是有参数,但标准的参数是可选的。这种思路允许我们使用相同的训练通道很容易训练不同的模型。该支持的标准包括CTC模型,原来的wav2letter Auto Seg Criterion(ASG)模型,以及基于注意力机制的S2S模型(S2S)。 CTC标准没有参数,而ASG和S2S标准都有可以被学习的参数。此外,我们注意到添加诸如损失函数一样的序列标准特别容易,就类似于ASG和CTC可以在C++中有效地实现。我们支持广泛的网络架构和活动函数-这里可以列出太多了。对于某些标准操作,
图2. 示例:使用自动微分,使用二元交叉熵和SGD训练的一个隐藏层MLP
我们扩展Arrary Fire CUDA后台更多高效的DNN操作。使用一维和二维概念以及有cuDNN的RNN例程。由于我们使用的网络库提供动态图形构建和自动区分,构建新层或其他原始操作需要很少的努力。同时也举例说明如何构建和训练具有二进制交叉熵损失的单层MLP(图2),以演示C ++接口的简单性。
2.4 训练和规模
我们的训练通道为用户提供了最大的灵活性,可以尝试不同的功能,架构和优化参数。训练可以以三种模式进行 - 训练(平坦训练),继续(继续检查点状态)和分叉(例如转学习)。我们支持标准优化算法,包括SGD和其他常用的基于一阶梯度的优化器。我们将wav2letter ++扩展为具有数据并行,同步SGD的更大数据集。对于进程间通信,我们使用NVIDIA集体通信库2(NCCL2)。为了最大限度地减少进程之间的等待时长并提高单个进程的效率,我们在构建用于训练的批处理之前对输入长度的数据集进行了排序。
2.5 解码
wav2letter ++解码器是一种波束搜索解码器,具有多种优化功能以便能提高效率[13]。我们使用与文献[13]相同的解码目标,其中包括语言模型和单词插入约束。解码器接口接受来自声学模型的导入和(如果相关)转换作为输入。 我们还给解码器一个包含单词字典和语言模型的Trie。 我们支持任何类型的语言模型,它公开我们的解码器所需的接口,包括n-gram 语言模型和任何其他无状态参数的语言模型。 我们基于KenLM为n-gram语言模型提供了一个轻量封装模型[14]。
表1.主流的开源语音识别系统
3.相关工作
我们简述了其他常用的开源语音识别系统,包括Kaldi [1],ES-PNet [2]和OpenSeq2Seq [3]。 Kaldi语音识别工具库是迄今为止最早,它由一组独立的命令行工具组成。Kaldi支持HMM / GMM和基于混合HMM / NN的声学建模,并包括基于音素的组合。端到端语音处理工具库(ESPNet)[2]与Kaldi紧密相连,并将其用于特征提取和数据预处理。ESPNet使Chainer [15]或PyTorch [16]作为训练声学模型的后台。它主要是用Python编写的,但是,遵循Kaldi的编码风格,高级工作流以bash脚本表示。在鼓励系统组件分离的同时,这种方法缺乏静态类型的面向对象编程语言在表达类型时的安全性,以及可读性和直观的接口方面的优势。 ESPNet以基于CTC和基于注意力机制的编解码器[10]实现以及结合两种标准的混合模型为特色。OpenSeq2Seq类似于ESPNet,它具有基于CTC和编码器 - 解码器模型的特征,并且使用Tensor-Flow [17]而不是PyTorch作为后台,用Python编写。对于高级工作流,OpenSeq2Seq还依赖于调用Perl和Python脚本的bash脚本。 OpenSeq2Seq系统的一个显着特点是它支持混合精度训练。此外,ESPNet和OpenSeq2Seq都支持语音合成(TTS)模型。表1描述了这些开源语音处理系统的分类。如表所示,wav2letter ++是唯一完全用C ++编写的框架,它(i)可以轻松集成到以任何编程语言虚拟实现的现有应用程序中;(ii)通过静态类型和面向对象编程更好地支持大规模开发; (iii)允许最高效率,如第4节所述。相比之下,动态类型语言(如Python)促进快速原型设计,但缺乏强制静态类型通常会阻碍大规模开发。
图3. 训练中主要步骤的毫秒级时长,针对整个数据集的多次平均结果
4.实验
在本节中,我们将在比较研究中讨论ESPNet,Kaldi,OpenSeq2Seq和wav2letter ++的性能。 ASR系统是根据华尔街日报(WSJ)数据集[18]的大词汇量任务进行评估的。我们测量了WSJ在训练期间的平均时间和平均语音解码延迟时间。我们用于实验的机器具有以下硬件配置:每台机器在NVIDIA SXM2模块上配备8个NVIDIA Tesla V100 Tensor Core GPU,内存为16GB。每个计算节点都有2个Intel Xeon E5-2698 v4 CPU,支持40(2 20)个内核,80个硬件线程(“内核”),2.20GHz。所有机器都通过100Gbps的In-finiBand网络连接。
4.1训练
我们评估了扩展网络参数和增加GPU使用数量的训练时间,也考虑了两种类型的神经网络架构:循环结构,具有三千万个参数,或者纯卷积,具有一亿个参数,分别如图4的顶部和底部图表所示。对于OpenSeq2Seq,我们考虑float32以及混合精度float16训练。对于两个网络,我们使用40维log-mel滤波器组作为输入,并使用CTC [7]作为标准(基于CPU的实现)。对于Kaldi,我们使用LF-MMI [19]标准,因为标准Kaldi组件中没有CTC训练。所有模型均采用SGD进行训练。我们使用每个GPU 上跑4个批量大小的数据。每次运行仅限于为每个GPU使用5个CPU内核。图3更详细地介绍了训练管道的主要组成部分,使用单个GPU在整个迭代上平均处理时间。对于这两种模型,wav2letter ++具有明显的优势,随着我们扩展计算而增加。对于具有3000万个参数的小模型,wav2letter ++比下一代最佳系统快了15%以上,即使在单个GPU上也是如此。请注意,由于我们使用8台GPU机器,因此对16,32和64 GPU的实验涉及多节点通信。ESPNet不支持开箱即用的多节点训练。我们通过将PyTorch DistributedDataParallel模块与NCCL2后台一起使用来扩展它。 ESPNet依赖于预先计算的输入功能,而wav2letter ++和OpenSeq2Seq为了灵活性而动态地计算功能。在某些情况下,混合精确训练会使OpenSeq2Seq的迭代时间减少1.5倍以上。这是wav2letter ++可以在未来受益的优化。LF-MMI的Kaldi方案不会同步每个SGD更新的梯度; perepoch时间仍然慢20倍以上。我们在图4中没有包括Kaldi,因为标准(LF-MMI)和优化算法不容易比较。
图4 训练时间的比较(对数标度)。 top:具有30000参数的RNN,受DeepSpeech 2 [12]的启发:2个空间卷积层,接着是5个双向LSTM层,接着是2个线性层。 bottom:具有100000参数的CNN,类似于文献[13]:18个时序卷积层,后面接1个线性层
表2. Libri Speech dev-clean上的解码性能
4.2解码
wav2letter ++包括一个用C ++编写的单程波束搜索解码器(参见第2.5节)。我们将其与OpenSeq2Seq和ES-PNet中提供的其他波束搜索解码器进行对比。但Kaldi不包括在内,因为它不支持CTC解码,并且实现了基于WFST的解码器。我们为每个解码器提供相同的预先计算的引导,这些引导是由在LibriSpeech上训练的完全卷积的OpenSeq2Seq模型Wave2Letter + 3生成的。这样可以在相同模型下独立测量性能。4-gram LibriSpeech语言模型用于OpenSeq2Seq和wav2letter ++,因为ESPNet不支持n-gram 语言模型解码。在表2中,我们报告解码时间和峰值内存使用情况,单线程解码,LibriSpeech dev-clean达到5.0%的WER,以及每个框架的最佳可用WER。对超参数进行了大量调整,以便报告的结果反映了报告中所提WER的最佳速度。wav2letter ++不仅比同类解码器的性能高出一个数量级,而且使用的内存也少很多。
5.结论
在本文中,我们介绍了wav2letter ++:快速而简单用于开发端到端语音识别的系统。该框架完全用C ++编写,这使得它能够高效训练模型并执行实时解码。尽管我们的初步实现展示了与其他识别框架对比的结果,但是wav2letter ++可以可以从持续优化中变得更好。因为wav2letter ++简单易用的接口,它非常适合作为一个快速研究端到端语音识别的平台。与此同时,我们对使用基于Python的ASR系统可以实现优化减小wav2letter ++差距的可能性保持开放。
更多推荐
所有评论(0)