在过去的几年里,随着Google Home,Amazon Echo,Siri,Cortana等的普及,语音助手已经无处不在。这些是自动语音识别 (ASR) 最著名的示例。此类应用程序从某种语言的语音音频剪辑开始,并将说出的单词提取为文本。因此,它们也称为语音转文本算法。
当然,像Siri和上面提到的其他应用程序,走得更远。他们不仅提取文本,而且还解释和理解所说的语义,以便他们可以用答案做出回应,或者根据用户的命令采取行动。
在本文中,我将重点介绍使用深度学习进行语音转文本的核心功能。我的目标不仅是了解某件事是如何工作的,而且是了解它为什么会这样工作。
在我的音频深度学习系列中,我还有一些文章可能会让你觉得有用。他们探讨了这个领域的其他引人入胜的主题,包括我们如何为深度学习准备音频数据,为什么我们将Mel频谱图用于深度学习模型以及如何生成和优化它们。
可以想象,人类语音是我们日常个人和商业生活的基础,语音转文本功能具有大量的应用。人们可以使用它来转录客户支持或销售电话的内容,用于面向语音的聊天机器人,或记下会议和其他讨论的内容。
基本音频数据由声音和噪音组成。人类语言就是其中的一个特例。因此,我在文章中谈到的概念,例如我们如何数字化声音,处理音频数据以及为什么我们将音频转换为频谱图,也适用于理解语音。但是,语音更复杂,因为它对语言进行编码。
音频分类等问题从声音剪辑开始,并从一组给定的类中预测该声音属于哪个类。对于语音转文本问题,训练数据包括:
自动语音识别使用音频波作为输入特征,文本脚本作为目标标签(图片来源:作者)
该模型的目标是学习如何获取输入音频并预测所说的单词和句子的文本内容。
在声音分类文章中,我将逐步解释用于处理深度学习模型的音频数据的转换。对于人类语言,我们也遵循类似的方法。有几个Python库提供了执行此操作的功能,librosa是最受欢迎的库之一。
现在,经过数据清理和增强,我们已将原始原始音频文件转换为Mel频谱图(或MFCC)图像。
我们还需要从成绩单中准备目标标签。这只是由单词句子组成的常规文本,因此我们从成绩单中的每个字符构建词汇表,并将它们转换为字符 ID。
这为我们提供了输入功能和目标标签。这些数据已准备好输入到我们的深度学习模型中。
ASR 的深度学习架构有许多变体。两种常用的方法是:
让我们选择上面的第一种方法,并更详细地探讨它是如何工作的。在高级别上,模型由以下块组成:
因此,我们的模型采用频谱图图像,并输出该频谱图中每个时间步长或“帧”的字符概率。
如果你稍微考虑一下,你就会意识到我们的拼图中仍然缺少一个主要的部分。我们的最终目标是将这些时间步或“帧”映射到目标成绩单中的单个字符。
该模型解码字符概率以产生最终输出(图片来自作者)
但是对于特定的频谱图,我们怎么知道应该有多少帧?我们如何确切知道每个帧的边界在哪里?我们如何将音频与文本成绩单中的每个字符对齐?
左边是我们需要的对齐方式。但是我们如何得到它呢?(图片来源:作者)
音频和频谱图图像没有预先分割以向我们提供此信息。
实际上,口语对我们来说并不整齐(图片来自作者)
这实际上是一个非常具有挑战性的问题,也是使ASR难以正确的原因。这是将 ASR 与其他音频应用(如分类等)区分开来的区别特征。
我们解决这个问题的方法是使用一种巧妙的算法,它有一个听起来很花哨的名字——它被称为连接主义时间分类,简称CTC。由于我不是“花哨的人”并且发现很难记住那个长名字,所以我只会用CTC这个名字来指代它。
当输入连续且输出是离散的,并且没有明确的元素边界可用于将输入映射到输出序列的元素时,CTC 用于对齐输入和输出序列。
它之所以如此特别,是因为它会自动执行此对齐,而无需手动提供该对齐作为标记训练数据的一部分。这将使创建训练数据集的成本非常高。
正如我们上面所讨论的,在我们的模型中,卷积网络输出的特征图被切成单独的帧并输入到循环网络。每一帧对应于原始音频波的某个时间步长。但是,在设计模型时,由您选择帧数和每个帧的持续时间作为超参数。对于每一帧,循环网络后跟线性分类器,然后从词汇表中预测每个字符的概率。
CTC 算法的工作是获取这些字符概率并导出正确的字符序列。
为了帮助它处理我们刚刚讨论的对齐和重复字符的挑战,它在词汇表中引入了“空白”伪字符(用“-”表示)的概念。因此,网络输出的字符概率还包括每帧空白字符的概率。
请注意,空白与“空格”不同。空格是真正的字符,而空白表示没有任何字符,有点像大多数编程语言中的“null”。它仅用于划分两个字符之间的边界。
CTC 以两种模式工作:
让我们进一步探讨这些内容,以了解算法的作用。我们将从CTC解码开始,因为它更简单一些。
CTC解码算法(图片来自作者)
损失计算为网络预测正确序列的概率。为此,该算法列出了网络可以预测的所有可能序列,并从中选择与目标转录本匹配的子集。
为了从完整的可能序列集中识别该子集,该算法按如下方式缩小了可能性范围:
CTC损失算法(图片来自作者)
有了这些约束,算法现在有一组有效的字符序列,所有这些字符序列都将生成正确的目标脚本。例如。使用推理期间使用的相同步骤,“-G-o-ood”和“ — Go-od-”都将产生“Good”的最终输出。
然后,它使用每个帧的单个字符概率来计算生成所有这些有效序列的总体概率。网络的目标是学习如何最大化该概率,从而降低生成任何无效序列的概率。
严格来说,由于神经网络将损失最小化,因此CTC损失计算为所有有效序列的负对数概率。由于网络在训练期间通过反向传播将损失最小化,因此它会调整其所有权重以产生正确的序列。
然而,实际做到这一点比我在这里描述的要复杂得多。挑战在于有大量可能的角色组合来产生序列。仅通过我们的简单示例,我们每帧可以有 4 个字符。用 8 帧给我们 4 ** 8 种组合 (= 65536)。对于任何具有更多字符和更多帧的逼真成绩单,此数字呈指数级增长。这使得简单地详尽列出有效组合并计算其概率在计算上是不切实际的。
有效地解决这个问题是CTC如此创新的原因。这是一个引人入胜的算法,非常值得了解它如何实现这一目标的细微差别。这本身就值得写一篇完整的文章,我计划很快写。但就目前而言,我们专注于建立对CTC工作的直觉,而不是研究它是如何工作的。
训练我们的网络后,我们必须评估它的性能。语音转文本问题的常用指标是单词错误率(和字符错误率)。它逐字(或逐个字符)比较预测输出和目标成绩单,以找出它们之间的差异数量。
差异可以是脚本中存在但在预测中缺少的单词(计为删除)、不在脚本中但已添加到预测中的单词(插入),或者在预测和脚本之间更改的单词(替换)。
计算成绩单和预测之间的插入、删除和替换(图片来自作者)
指标公式相当简单。它是相对于单词总数的差异百分比。
单词错误率计算(图片来自作者)
到目前为止,我们的算法已经将语音音频视为仅对应于某种语言的字符序列。但是,当这些字符组合成单词和句子时,这些字符是否真正有意义并有意义?
自然语言处理 (NLP) 中的一个常见应用是构建语言模型。它捕获了单词在语言中通常如何用于构造句子、段落和文档。它可以是关于英语或韩语等语言的通用模型,也可以是特定于特定领域(如医学或法律)的模型。
一旦你有了语言模型,它就可以成为其他应用程序的基础。例如,它可以用来预测句子中的下一个单词,辨别某些文本的情绪(例如,这是一篇积极的书评),通过聊天机器人回答问题,等等。
因此,当然,它也可用于通过指导模型生成更有可能根据语言模型的预测来选择性地提高 ASR 输出的质量。
在推理过程中描述 CTC 解码器时,我们隐含地假设它总是在每个时间步选择概率最高的单个字符。这被称为贪婪搜索。
但是,我们知道使用称为光束搜索的替代方法可以获得更好的结果。
虽然Beam Search通常经常用于NLP问题,但它并不是特定于ASR的,所以我在这里提到它只是为了完整。如果您想了解更多信息,请查看我的文章,其中详细介绍了Beam Search。
希望现在这能让您了解用于解决 ASR 问题的构建块和技术。
在深度学习之前的旧时代,通过经典方法解决这些问题需要理解音素等概念以及许多特定于领域的数据准备和算法。
然而,正如我们刚刚在深度学习中看到的那样,我们几乎不需要任何涉及音频和语音知识的特征工程。然而,它能够产生出色的结果,继续让我们感到惊讶!
最后,如果你喜欢这篇文章,你可能还会喜欢我关于变形金刚、地理定位机器学习和图像标题架构的其他系列。