WAV2LETTER++: THE FASTEST OPEN-SOURCE SPEECH RECOGNITION SYSTEM

摘要

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

1.介绍

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

2.设计

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

2.1 ArrayFire张量库

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

2.2 数据准备和特征抽取

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

2.3 模型

在这里插入图片描述
  我们支持几种端到端的序列模型。每个模型都分为网络标准接口。网络只是输入的函数,而标准接口是输入和损失的函数。虽然网络始终具有参数,但是标准接口的参数是可选的。这种抽象使我们可以使用相同的训练管道轻松训练不同的模型。支持的标准接口包括连续时序分类(CTC),原始的wav2letter AutoSegCriterion(ASG)和基于注意力的序列到序列的模型(S2S)。CTC标准接口没有参数,而ASG和S2S标准接口都具有可以学习的参数。此外,我们注意到添加新的序列标准接口特别容易,因为可以使用C++有效实现诸如ASG和CTC之类的损失函数。我们支持广泛的网络体系结构和激活函数–在此无法列出。对于某些操作,我们使用更有效的cuDNN操作来扩展核心ArrayFire CUDA后端。我们使用cuDNN等提供的1D和2D卷积以及RNN例程。由于我们使用的网络库提供了动态图的构建和自动微分,因此构建新层或其他原始操作的工作量很小。我们给出一个示例,说明如何构建和训练具有二进制交叉熵损失的单层MLP(在图2中),以演示C++接口的简单性。

2.4 训练和扩展

我们的训练管道为用户提供了最大的灵活性,使他们可以尝试不同的特征,架构和优化参数。训练能够以三种模式运行- t r a i n train (平稳训练), c o n t i n u e continue (从检查点状态继续)和 f o r k fork (例如,迁移学习)。我们支持标准优化算法,包括SGD和其他常用的基于梯度的一阶优化器。我们通过数据并行,同步SGD将wav2letter ++扩展到更大的数据集。对于进程间通信,我们使用NVIDIA集体通信库(NCCL2)。为了最小化进程之间的等待时间并提高单个进程的效率,我们在构建训练批次之前先根据输入长度对数据集进行排序

2.5 解码

wav2letter++解码器是一种集束搜索解码器,具有多项优化措施以提高效率。 我们使用与[13]相同的解码目标函数,其中包括来自语言模型和单词插入项的约束。解码器接口接受来自声学模型的输出和(如果相关)转换作为输入。 我们还给解码器一个Trie,其中包含单词字典和语言模型。我们支持任何类型的语言模型,都可以公开解码器所需的接口,包括n-gram LM和任何其他无状态参数LM。我们在KenLM之上为n-gram语言模型提供了一个包装器。

3.相关工作

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

猜你喜欢

转载自blog.csdn.net/qq_28385535/article/details/106639209