语音本质上是一种即时信号。语音中携带的信息元素在多个时间尺度上演变。在气压的影响下,同一声源的频率只会发生几百千赫兹的变化,因此我们可以通过声音来判断声源的位置,并将其与周围嘈杂的环境区分开来,从而获得所传递的信息。语音功率谱中缓慢变化的部分是音素的生成序列,音素是构成我们口语的最小单位。除此之外,构成短语和叙述结构的单词序列变化得更慢。但是,这些要素在时间尺度上并没有严格的区分。相反,各种尺度的元素混合在一起,所以时间上下文很重要,可以用比较少见的停顿作为元素之间的分界线。自动语音识别(ASR)系统必须理解这种嘈杂的多尺度数据流,并将其转换为准确的单词序列。在撰写本文时,最流行和最成功的语音识别引擎是使用混合系统构建的。即,同时将深度神经网络(DNN)与隐马尔可夫模型(HMMs)、上下文相关的音素模型(context-dependentphonemodels)、n-gram语言模型(n-gramlanguagemodels)和维特比搜索复合体结合起来结合使用维特比搜索算法的变体。这个模型相当复杂,需要复杂的训练方法和相当多的专业知识来帮助建立模型。如果说深度学习的成功教会了我们什么的话,那就是我们通常可以用一个通用的神经网络来代替复杂的、多维的机器学习方法,这种神经网络可以被训练来优化可微成本函数(costfunction)。这种方法(我们现在称其为“纯”DNN方法)在语音识别方面取得了巨大成功。现在,一旦我们拥有了相当数量的训练数据和足够的计算资源,我们就可以更轻松地构建高级大词汇量连续语音识别(LVCSR)系统。本文的目的是提供一个简单的指南,说明如何使用Neon使用“纯”DNN方法构建语音识别系统,其中DNN遵循Graves及其合作者提倡的方法,而百度的AI研究人员开发了它此外,使其成为一个完整的端到端ASR管道。同时,作为对这篇博文的补充,我们将开源我们实现的端到端语音识别引擎的代码。在其最初始的形式中,该系统使用双向循环神经网络(BiRNN)来训练模型以直接从频谱图生成转录,而无需明确地将音频帧与转录对齐。相反,隐式对齐是使用Graves的连接主义时间分类(CTC)算法实现的。虽然“纯”DNN方法现在允许使用最先进的性能LVCSR系统进行训练,但显式解码步骤:将模型输出转换为可感知的单词序列,在评估过程中仍然至关重要。解码技术多种多样,我们通常同时使用加权有限状态转换器和神经网络语言模型。如果想了解相关内容,需要更深入的文章来介绍,而本文主要限于ASRpipeline的训练部分。如果需要,我们会为读者提供一些额外的参考资料以填补空白,希望传达构建端到端语音识别引擎的完整观点。简而言之,端到端语音识别流水线由三个主要部分组成:1.特征提取阶段,将原始音频信号(例如,来自wav文件)作为输入并生成一系列特征向量,其中给定一个音频输入帧的特征向量。特征提取阶段的输出示例包括原始波形、频谱图和同样流行的梅尔频率倒谱系数(MFCC)的切片。2.一种声学模型,它将一系列特征向量作为输入,并产生以特征向量输入为条件的一系列字符或音素的概率。3.解码器采用两个输入(声学模型和语言模型的输出),并根据语言模型中编码的语言规则,根据声学模型生成的序列搜索最可能的转录。处理数据在构建端到端语音识别系统时,有效的数据加载机制至关重要。我们将利用Neon1.7中添加的新功能:Aeon,一种能够支持图像、音频和视频数据的高级数据加载工具。使用Aeon大大简化了我们的工作,因为它允许我们直接使用原始音频文件训练声学模型,而无需费心对数据进行显式预处理。此外,Aeon使我们更容易指定我们希望在训练期间使用的光谱特征类型。提取数据通常,语音数据以某种标准音频格式的原始音频文件和包含相应转录的一系列文本文件的形式分发。在许多情况下,转录文件将包含以下形式的行:<音频文件路径>、<音频文件中语音的转录>。这意味着列出的路径指向包含转录的音频文件。但是,在许多情况下,转录文件中列出的路径不是绝对的,而是相对于某些假定目录结构的。为了处理不同的数据打包情况,Aeon要求用户生成一个包含一对绝对路径的“清单文件”,一个指向音频文件,另一个指向相应的转录。我们将向读者推荐Neon的语音示例(包括链接)和Aeon文档以获取更多详细信息。除了清单文件,Aeon还要求用户提供数据集中最长话语的长度和最长转录的长度。这些长度可以在生成清单文件时提取。例如,您可以使用流行的SoX程序来提取音频文件的持续时间。我们通过训练由卷积(Conv)层、双向循环(BiRNN)层和全连接(FC)层组成的深度神经网络(基本上遵循“DeepSpeech2”,如图所示)网络来构建我们的声学模型。除了在输出层使用softmax激活函数外,我们在其他层使用ReLU激活函数。如图所示,网络将光谱特征向量作为输入。使用Aeon数据加载器,Neon可以支持四种类型的输入特征:原始波形、频谱图、梅尔频谱系数(MFCS)和梅尔频率倒谱系数(MFCC)。MFSCs和MFCCs是从频谱图推导出来的,它们基本上是将频谱图的每一列变换成数量相对较少的独立系数,更接近于人耳的感知频率范围。在我们的实验中,我们还观察到,在所有其他条件相同的情况下,使用梅尔特征作为输入训练的模型比使用频谱图训练的模型表现稍好。光谱输入被传递到Conv层。通常,可以考虑使用1D或2D卷积的多个Conv层的架构。我们将利用允许网络在输入的“更广泛的上下文”上运行的跨步卷积层。跨步卷积层还减少了序列的总长度,从而显着减少了内存占用和网络执行的计算。这使我们能够训练更深层次的模型,我们可以在不增加太多计算资源的情况下实现性能的大幅提升。Conv层的输出被送入BiRNN层的堆栈。每个BiRNN层由一对串联运行的RNN组成,输入序列以相反的方向呈现,如图所示。这对RNN的输出将如图所示连接起来。BiRNN层特别适合处理语音信号,因为它们允许网络访问输入序列中每个给定点的未来和过去上下文[1]。在训练基于CTC的声学模型时,我们发现使用“普通”RNN而不是它们的门控变体(GRU或LSTM)是有益的。这主要是因为后者具有显着的计算开销。与[2]中一样,我们还对BiRNN层应用批量归一化以减少整体训练时间,同时对模型的准确度影响很小,该准确度由整体单词错误率(WER)衡量。在每次迭代中,BiRNN层的输出首先传递给全连接层,后者又将信息传递给softmax层。softmax层中的每个单元对应于描述目标词汇表的字母表中的单个字符。例如,如果训练数据来自英语语料库,则字母表通常包括从A到Z的所有字符和任何相关的标点符号,以及用于分隔文本中单词的空格字符。基于CTC的模型通常还需要一个包含特殊“空白”字符的字母表。这些空白字符使模型能够可靠地预测连续的重复符号以及语音信号中的伪像,例如停顿、背景噪声和其他“非语音”情况。因此,给定一个语音帧序列,该模型会为每个帧生成字母表上的概率分布。在数据训练期间,softmax的输出被传递给CTC成本函数(稍后详细讨论),它使用真实文本来(i)对模型的预测进行评分,以及(ii)为值的准确性生成错误信号.总体目标是训练模型以提高现实场景中的预测性能。训练数据根据经验,我们发现使用随机梯度下降与动量和梯度约束相结合可以产生性能最好的模型。更深的网络(7层或更多层)具有大致相同的效果。我们使用由Sutskever等人实施的Nesterov加速梯度下降来训练模型。大多数模型的超参数,例如:网络深度、给定层中的单元数、学习率、退火率、动量等,都是根据现有开发数据集凭经验选择的。我们使用“Xavier”初始化方法来初始化我们模型中的每一层,尽管我们没有系统地研究比较实验的结果是否通过使用其他替代初始化方案进行了优化。我们所有的模型都使用CTC损失标准进行训练,CTC计算内部的详细解释超出了本博客的范围。我们将在此处进行简要概述,并建议读者阅读Graves的论文以获得更深入的理解。CTC算法以“折叠”函数的操作为中心,该函数将字符序列作为输入并通过首先删除输入字符串中的任何重复字符,然后删除所有“空白”符号来生成输出序列。例如,如果我们用“_”表示空白符号,那么给定一个长度为T的话语及其对应的“groundtruth”转录,CTC算法将构造一个“转置”折叠函数,定义为所有可能的A长度为T的字符序列折叠到“groundtruth”转录上。任何序列出现在这个“转置”集合中的概率可以直接从神经网络中的softmax输出计算出来。然后将CTC成本定义为序列概率总和的对数函数,该序列存在于“转置”集中。该函数可微分于softmax的输出,后者是反向传播中要计算的误差梯度。用一个简单的例子来说明,假设输入的话语有三帧,对应的转录本是单词“OX”。同样,使用“_”表示空白,折叠成OX的三字符序列集由_OX、O_X、OOX、OXX和OX_组成。CTC算法设置P(abc)=p(a,1)p(b,2)p(c,3),其中p(u,t)表示单元“u”的输出,softmax模型在时间t(帧)值。因此CTC算法需要枚举折叠到给定目标序列的所有固定长度的序列。在处理很长的序列时,可以通过forward-backward算法高效地进行枚举组合,这与使用HMMs方法处理问题的思路非常接近。评估模型训练好后,我们可以通过预测一段系统从未听过的语音来评估其性能。由于模型生成概率向量序列作为输出,我们需要构建解码器将模型的输出转换为单词序列。解码器的工作是搜索模型的输出并生成最可能的序列作为转录本。最简单的方法是计算Collapse(...)是上面定义的映射的位置。尽管在字符序列上训练模型,我们的模型仍然能够学习隐式语言模型,并且能够非常熟练地拼出单词的语音(见表1)。模型的拼写性能通常在字符级别测量,字符错误率(CER)从Levenshtein距离计算得出。我们观察到很多模型的预测错误都是没有出现在训练集中的词。因此,可以合理预期整体CER值将随着训练集大小的增加而继续提高。这种预期在DeepSpeech2的结果中得到了证实,其训练集包括超过12,000小时的语音数据。表1:《华尔街日报》评估数据集上的模型预测样本。我们特意选择了模型难以判断的示例。如图所示,添加语言模型约束基本上消除了在没有语言模型的情况下会发生的所有“拼写错误”。虽然我们的模型显示出非常好的CER结果,但该模型倾向于按语音拼写单词导致相对较高的单词错误率。我们可以通过包含从外部词典和语言模型派生的解码器来约束模型,从而提高模型的性能(WER)。根据[3,4],我们发现使用加权有限状态传感器(WFST)是完成此任务的一种特别有效的方法。我们观察到WSJ和Librispeech数据集上的WER值相对提高了25%。表2列出了使用华尔街日报(WSJ)语料库训练的各种端到端语音识别系统。为了测试“apple”(公司)和“apple”(水果)的识别结果,我们只选择使用WSJ数据集训练和评估的系统公开数据进行系统间比较。然而,结果表明,在同一数据集上训练和评估的混合DNN-HMM系统比使用纯深度神经网络架构的系统表现更好[6]。另一方面,结果表明,当训练集规模较大时,纯深度神经网络架构可以实现与混合DNN-HMM系统相同的性能[引自DS2]。表2:我们仅使用华尔街日报数据集训练和评估各种端到端语音识别系统的性能。CER(charactererrorrate)是指将模型得到的字符序列与实际转录的字符序列进行比较的字符错误率。LM指的是语言模型。最后一列是指使用重新评分、模型聚合等其他技术解码的示例。未来将CTC目标函数嵌入到语音识别模型的神经网络模型中的工作让我们第一次看到了这种纯DNN模型的能力。然而,最近,基于注意力机制增强的所谓编码器-解码器RNN模型正在成为使用CTC标准[4,5]训练的RNN模型的可行替代方案。替代计划。attention-basedencoder-decoder模型和CTC标准模型都经过训练,将声学输入序列(acousticinput)映射到字符/音素(character/phoneme)序列。如上所述,基于CTC标准的模型被训练为预测每一帧语音输入的字符,并搜索逐帧预测与目标序列序列之间可能的匹配。相比之下,基于注意力的编码器-解码器模型在预测输出序列之前首先读取整个输入序列。这种方法的概念优势是我们不必假设输出序列中的预测字符是相互独立的。CTC的算法基于这个假设,这是没有根据的——因为一个字符序列出现的顺序很大程度上取决于字符序列比之前出现得更早。最近的工作表明,与基于CTC的模型相比,LVCSR系统的基于注意力的编码器-解码器模型显着提高了字符错误率[4]。在将我们的两种方法集成到语言模型之前对其进行评估是正确的,支持基于注意力的模型是比基于CTC的模型更好的声学模型的说法。然而,值得指出的是,当使用语言模型来确定单词错误率时,这种性能差异就会消失。我们正在研究Neon,一种用于ASR系统的基于注意力的编码器-解码器网络,欢迎各种贡献。代码可以在https://github.com/NervanaSystems/deepspeech.git找到。
