1. 概念理解
ASR是英文AutomaticSpeechRecognition第一个英文字母的缩写简称。意思是自动语音识别技术。是一种将人的语音转换为文本的技术。
ASR,或自动语音识别,是指让程序自动转录口语(语音到文本)的问题。我们的目标通常是在转录语音输入时,有一个模型,将Word错误率(WER)指标降至最低。换句话说,鉴于某些音频文件(例如包含语音的WAV文件),我们如何将其转换为相应的文本,并尽可能少地进行错误处理?
传统的语音识别采用生成方法,模拟语音声音生成方式的完整管道,以便评估语音样本。我们将从一个语言模型,封装最有可能的单词顺序生成(例如n-gram模型),到该顺序中每个单词的发音模型(例如发音表),到将这些发音转换为音频波形(例如高斯混合模型)的声学模型。
然后,如果我们收到一些口头输入,我们的目标是找到最有可能的文本序列,将导致根据我们的生成模型管道的给定音频。总的来说,通过传统的语音识别,我们尝试建模,并利用这个可能的成绩单。Pr(audio|transcript)*Pr(transcript)
随着时间的推移,神经网发展到传统语音识别模型的每个组件可以被性能更好且具有更大泛化潜力的神经模型所取代的地步。例如,我们可以用神经语言模型替换n-gram模型,用神经发音模型替换发音表,依次是。但是,每个神经模型都需要单独接受不同任务的培训,而流体中任何模型的错误都可能放弃整个预测。
因此,我们可以看到端到端ASR架构的吸引力:歧视性模型,只需接收音频输入并提供文本输出,并且其中架构的所有组件都一起训练以实现相同的目标。该模型的编码器类似于提取语音特征的声学模型,然后可以直接通过管道输送到输出文本的解码器。如果需要,我们可以集成一个语言模型,以改善我们的预测,
整个端到端的ASR模型可以同时进行训练——一个更容易处理的管道!
2. ASR工作原理
在过去几年中,语音助手已经无处不在,谷歌首页,亚马逊回声,Siri,Cortana等的受欢迎程度。这些是自动语音识别(ASR)的最知名示例。这一类应用程序从某些语言的口语音频剪辑开始,并提取已使用的单词作为文本。因此,它们也被称为语音到文本算法。我在我的音频深度学习系列中还有几篇文章,你可能会发现有用。他们探索这个领域的其他引人入胜的话题,包括我们如何为深度学习准备音频数据,为什么我们使用Mel光谱仪进行深度学习模型,以及如何生成和优化这些模型。像Siria和上面提到的其他应用程序,会走得更远。他们不仅提取文本,而且还解释和理解所讲内容的语义,以便他们能够回答,或根据用户的命令采取行动。在本文中,我将重点介绍通过深度学习对文本进行语音到文本的核心能力。我的目标将是不仅了解某样东西是如何工作的,而且了解为什么它这样工作。
- 最先进的技术(什么是声音,如何数字化。什么问题就是在日常生活中深入学习解决。什么是光谱图,为什么它们都很重要。
- 为什么梅尔光谱仪性能更好(在Python中处理音频数据。什么是梅尔光谱图以及如何生成它们)
- 数据准备和增强(通过超参数调整和数据增强增强光谱功能,实现最佳性能)
- 声音分类(端到端示例和架构,对普通声音进行分类。一系列方案的基础应用。
- 光束搜索(语音到文本和NLP应用程序常用的算法,以增强预测)
语音到文本
我们可以想象,人类言论是我们日常个人和商业生活的基础,语音到文本功能具有大量的应用。人们可以用它来转录客户支持或销售电话的内容,用于语音聊天机器人,或者记下会议和其他讨论的内容。基本音频数据由声音和噪音组成。人类言论就是一个特例。因此,我在文章中谈到的概念,如我们如何数字化的声音,处理音频数据,以及为什么我们转换音频到光谱仪,也适用于理解语音。然而,语音是更复杂的,因为它编码语言。
音频分类等问题从声音剪辑开始,并从给定类别中预测声音属于哪个类。对于语音到文本的问题,您的培训数据包括:
- 输入功能(X):口语音频剪辑
- 目标标签(y):发言内容的文本记录

数据预处理
在声音分类文章中,我逐步解释了用于处理深层学习模型音频数据的转换。在人类言语方面,我们也采取了类似的方法。有几个Python库提供这样做的功能,利布罗萨是最受欢迎的之一。
加载音频文件
- 从输入数据开始,这些输入数据由语音语音的音频文件组成,其音频格式为".wav"或".mp3"。
- 从文件中读取音频数据并将其加载到2DNumpy阵列中。此阵列由一系列数字组成,每个数字都表示在特定时间点测量声音的强度或振幅。此类测量的数量由抽样率决定。例如,如果采样速率为44.1kHz,Numpy阵列将有一排44,100个数字,用于1秒的音频。
- 音频可以有一个或两个通道,称为单声道或立体声,用共同的话说。有了双通道音频,我们将为第二个通道提供另一个类似的振幅数字序列。换句话说,我们的Numpy阵列将是3D,深度为2。
转换为均匀尺寸:样本率、通道和持续时间
- 我们的音频数据项目可能有很多变化。剪辑可能以不同的速率进行采样,或者具有不同数量的通道。剪辑很可能有不同的持续时间。如上所述,这意味着每个音频项目的尺寸将有所不同。
- 由于我们的深度学习模型期望我们所有的输入项目具有类似的大小,我们现在执行一些数据清理步骤,以标准化我们的音频数据的尺寸。我们重新调用音频,使每个项目都有相同的采样率。我们将所有项目转换为相同数量的通道。所有项目还必须转换为相同的音频持续时间。这涉及到填充较短的序列或截断较长的序列。
- 如果音频质量差,我们可以通过应用降噪算法来消除背景噪声来增强音频质量,以便我们能够专注于语音音频。
原始音频的数据增强
- 我们可以应用一些数据增强技术,为我们的输入数据增加更多多样性,并帮助模型学会推广到更广泛的输入中。我们可以随机将音频向左或向右随机移动一小部分,或将音高或音频速度更改少量。
MelSpectrograms
- 此原始音频现在转换为梅尔光谱仪。光谱图通过将其分解成包含在其中的一组频率来捕获音频作为图像的性质。
MFCC
- 特别是对于人类语音,有时需要再走一步,将梅尔光谱转换为MFCC(梅尔频率视点系数)。MFCC仅提取与人类说话频率范围相对应的最基本频率系数,从而产生梅尔光谱仪的压缩表示。
现在,我们可以使用一种称为"光谱"的技术,在Mel光谱仪图像上应用另一个数据增强步骤。这涉及到频率和时间遮蔽,随机遮蔽出任何垂直(即。时间面具)或水平(即。频率掩码)来自光谱仪的信息带。NB:我不确定这是否也可以应用于MFCC,以及这是否能产生良好的效果。
现在,在数据清理和增强后,我们已经将原始音频文件转换为Mel光谱仪(或MFCC)图像。
我们还需要从成绩单中准备目标标签。这只是由单词句子组成的常规文本,因此我们从成绩单中的每个字符构建一个词汇,并将其转换为字符ID。
这为我们提供了输入功能和目标标签。这些数据已准备好输入我们的深度学习模型。
建筑
ASR的深度学习架构有许多变化。两种常用的方法是:- CNN(共和神经网络)加上基于RNN的(经常性神经网络)架构,该架构使用CTC损失算法来标定语音中单词的每个字符。例如。百度的深度语音模型。
- 基于RNN的序列到序列网络,将光谱图的每个"切片"视为序列中的一个元素,例如。谷歌的听听拼写(LAS)模型。让我们选择上面的第一种方法,并详细探讨它是如何工作的。在高级级别上,该模型由以下方块组成:
- 一个常规的汇总网络,由几个残余CNN层组成,处理输入光谱图图像和输出这些图像的特征图。

- 由几个双向LSTM层组成的常规经常性网络,将特征地图处理为一系列不同的时间步骤或"帧",这些时间步骤或"帧"与我们所需的输出字符序列相对应。(LSTM是一种非常常用的经常性层,其完整形式是长期短期记忆)。换句话说,它采用音频的连续表示功能图,并将它们转换为离散表示。

- 带软磁体的线性层,使用LSTM输出为输出的每个时间步骤生成字符概率。

- 我们也有线性层,位于卷积和经常性网络之间,有助于将一个网络的输出重塑为另一个网络的输入。
对齐序列
如果你仔细想想,你就会意识到我们的谜题中还有一大块缺失。我们的最终目标是将这些时间步骤或"帧"映射到目标成绩单中的各个字符。


在语音音频中,因此在光谱图中,每个字符的声音可能具有不同的持续时间。
- 这些字符之间可能有间隙和暂停。
- 几个字符可以合并在一起。
- 某些字符可以重复。例如。在"苹果"一词中,我们怎么知道音频中的"p"声是否真的对应于成绩单中的一两个"p"?

我们解决这个问题的方式是使用一个巧妙的算法与一个花哨的名字-它被称为连接时间分类,或Ctc简称。因为我不是'花哨的人',发现很难记住那个长的名字,我只是用Ctc这个名字来称呼它。
CTC算法-培训和推理
- 当输入是连续的,输出是离散的,并且没有明确的元素边界可用于映射输出序列的输入时,CTC用于对齐输入和输出序列。
正如我们上面讨论的那样,我们模型中由汇集网络输出的特征地图被切成单独的帧并输入到经常性网络中。每个帧对应于原始音频波的某个时间步骤。但是,在设计模型时,您选择帧数和每个帧的持续时间作为超参数。对于每个帧,然后由线性分类器后继的经常性网络预测词汇中每个字符的概率。

为了帮助它处理我们刚才讨论的对齐和重复字符的挑战,它在词汇中引入了"空白"伪字符(由"-"表示)的概念。因此,网络的字符概率输出还包括每个帧的空白字符的概率。
请注意,空白与"空间"不同。空间是一个真正的字符,而空白意味着没有任何字符,有点像大多数编程语言中的"空"。它只用于划定两个字符之间的边界。
CTC以两种模式工作:
- CTC损失(培训期间):它有一个地面真实目标成绩单,并试图训练网络,以最大限度地提高输出正确成绩单的概率。
- CTC解码(推理期间):在这里,我们没有目标脚本可以参考,并且必须预测最有可能的字符序列。
CTC解码
使用字符概率为每个帧(包括空白)选择最有可能的字符。例如。"-G-o-ood"

最后,由于空白已达到其目的,它删除了所有空白字符。例如。"很好"。
CTC损失
- 损失被计算为网络预测正确序列的概率。为此,该算法列出了网络可以预测的所有可能序列,并从中选择与目标成绩单匹配的子集。
- 要从一整套可能的序列中识别该子集,该算法将可能性缩小为:
- 只保留目标成绩单中出现的字符的概率,然后丢弃其余的概率。它只保留"G"、"o"、"d"和"-"的概率。
- 使用每个帧的字符过滤子集,仅选择与目标脚本顺序相同的字符。例如。虽然"G"和"o"都是有效字符,但"Go"顺序是有效的序列,而"oG"是无效序列。

高效解决这个问题是反恐委员会如此创新的原因。这是一个迷人的算法,它非常值得理解它如何做到这一点的细微差别。这本身就值得我很快写一篇完整的文章。但是现在,我们专注于建立对CTC做什么的直觉,而不是深入研究它是如何运作的。严格地说,由于神经网络将损失降到最低,因此CTC损失被计算为所有有效序列的负日志概率。由于网络在训练期间通过反向传播将损失降到最低,因此它调整了所有重量以生成正确的序列。然而,要真正做到这一点,比我在这里描述的要复杂得多。挑战在于,要生成序列,可能会有大量字符组合。仅以我们简单的示例为例,我们每帧即可有4个字符。8帧,为我们提供4**8组合(=65536)。对于任何具有更多字符和更多帧的现实成绩单,此数字呈指数级增长。这使得简单地详尽地列出有效组合并计算其概率在计算上不切实际。
指标-单词错误率(WER)
培训我们的网络后,我们必须评估其性能。语音到文本问题的常用指标是单词错误率(和字符错误率)。它比较预测输出和目标成绩单,逐字(或逐字)计算出它们之间的差异数。
区别可能是在成绩单中出现但从预测中缺少的单词(算作删除),一个不在成绩单中但已添加到预测(插入)中的单词,或者一个在预测和成绩单(替换)之间更改的单词。


语言模型
到目前为止,我们的算法已经将口语音频视为仅对应某些语言中的字符序列。但是,当这些字符被拼凑成单词和句子时,这些字符真的有意义和意义吗?一旦你有一个语言模型,它可以成为其他应用程序的基础。例如,它可以用来预测句子中的下一个单词,来辨别某些文本的情绪(例如,这是一个积极的书评),通过聊天机器人回答问题,等等。自然语言处理(NLP)中的常见应用是构建语言模型。它捕获了单词通常在语言中如何用于构建句子、段落和文档。它可以是有关英语或韩语等语言的通用模型,也可以是特定领域(如医疗或法律)的模型。
因此,当然,它也可以用来通过引导模型生成根据语言模型更有可能的预测来选择性地提高ASR输出的质量。
光束搜索
在推理过程中描述CTC解码器时,我们隐含地假设它总是选择每个步骤中概率最高的单个字符。这称为贪婪搜索。
但是,我们知道,我们可以使用一种称为光束搜索的替代方法获得更好的结果。
虽然BeamSearch通常用于NLP问题,但它并非针对ASR,因此我在此处提及它只是为了完整性。如果您想知道更多,请查看我的文章,详细描述光束搜索。
3. 结论
- 希望,现在这能让您了解用于解决ASR问题的构建基块和技术。
- 在较旧的深造前,通过经典方法解决此类问题需要了解电话和许多特定域的数据准备和算法等概念。
- 然而,正如我们刚刚通过深入学习所看到的那样,我们几乎不需要任何涉及音频和语音知识的功能工程。然而,它能够产生优秀的结果,继续让我们感到惊讶!
- 最后,如果你喜欢这篇文章,你也可以享受我关于变形金刚,地理定位机器学习,和图像标题架构的其他系列。