让音视频学习变得简单之音频深度学习(5):自动语音识别

实践教程,直观的音频深度学习系列

用通俗易懂的语言讲解语音通话转文字的算法和架构,包括梅尔频谱图、MFCCs、CTC Loss和解码器。


布鲁斯·玛斯Bruce mars)Unsplash上传的照片

在过去几年里,随着Google Home、Amazon Echo、Siri、Cortana(这些都是非常典型的自动语音识别(ASR)的例子)等的普及,人们已经开始普遍使用语音通话助手。这类应用以某种语言的口语音频片段开始运行,从中提取语音中的单词作为文本。因此,它们也被称为语音到文本算法。

当然,刚刚提到的Siri和其他应用程序的功能是更加完善的。因为它们不仅能提取文本,还能解释和理解所讲内容的语义,从而做出回答或根据用户的命令实施行动。

在这篇文章中,我将着重介绍音视频深度学习中语音通话转文本的核心能力。和之前一样,我的目标不仅是要了解事物运行的原理,还要了解它工作的动因。

我的音视频深度学习系列还有几篇文章,可能会对你有用。它们探讨了这个领域的其他迷人的话题,包括我们如何为深度学习准备音频数据,为什么我们要为深度学习模型使用梅尔频谱图,以及如何生成和优化它们。

1.最先进的技术-本文(声音及其数字化方式。在日常生活中深度学习音频会遇到那些问题?什么是声谱图,为什么它们对使用语音聊天室至关重要?)

2.为什么梅尔频谱图的性能更好(在Python中处理音频数据。什么是梅尔频谱图以及如何生成它们)

3.功能的优化和增强(增强频谱图功能可通过超参数调整和数据增强实现最佳性能)

4.音频分类(端到端的示例和用于对普通声音进行分类的体系结构。适用于语音聊天室使用的各种场景。)

5.自动语音识别(语音转文本算法和体系结构,使用CTC Loss和解码来对齐序列)

语音转文本

我们都知道,人类语言是我们日常工作和生活的基础,而语音转文字功能在我们的生活中起很大的作用。人们可以用它来转录客户支持或销售电话的内容,还可用于面向语音通话的聊天机器人,或者记录会议以及其他讨论的内容。

基本的音频数据由声音和噪音组成,人类语音是其中的一个特例。因此,我在之前文章中谈到的概念,如我们如何将声音数字化、处理音频数据,以及为什么我们要将音频转换成频谱图,同样适用于理解语音。因为语音要对语言进行编码,所以语音看起来更加复杂。

像音频分类这样的问题,要先从一个声音片段开始,然后从给定的类别集合中预测其声音的类别。对于语音转文本问题,你的训练数据包括。

  • 输入特征( X ):语音的音频片段
  • 目标标签(y):说话内容的文本转录

1_KXnbS38oDC94f6S7UFDzWQ
自动语音识别将声波作为输入特征,将文本转录作为目标标签(图片由作者提供)。

该模型的目标是学习如何接收输入的音频并预测其单词和句子的文本内容。

数据预处理

在声音分类的文章中,我逐步解释了用于处理深度学习模型的音频数据的转换。对于人类语音,我们也采用了类似的方法。有几个Python库提供了这样的功能,其中librosa是最受欢迎的一个。

将原始音波转换为频谱图像,输入到深度学习模型中(图片由作者提供)。

加载音视频文件

  • 先输入数据,这些数据由“.wav”或“.mp3”等音频格式的语音音频文件构成。

  • 从文件中读取数据并将其加载到一个2D Numpy数组中。这个数组由一连串的数字组成,每个数字都代表了在某一特定时刻对声音的强度或振幅的测量值。测量值的数量是由采样率决定的。例如,如果采样率是44.1kHz,Numpy数组将有44,100个数字代表1秒钟的音频。

  • 音频可以有一个或两个通道,通俗地讲,称为单声道或立体声。对于双声道音频,我们会有另一个类似的振幅数字序列用于第二声道。换句话说,我们的Numpy数组将是3D的,深度为2。

将采样率、通道和持续时间转换为统一维数

  • 我们的音频数据项目中可能有很多的变化,如片段的采样率不同、通道数量上的差异这或持续时间不同。正如上面所解释的,这意味着每个音频项目的维数是不同的。

  • 理想情况下,我们希望所输入的项目都有相似的大小,现在我们需清理一些数据步骤以规范我们音频数据的维数。我们对音频进行重新取样,使每个项目都有相同的采样率,将所有项目转换为相同数量的通道;所有项目也必须转换为相同的音频长度,这涉及到对较短的序列进行填充或对较长的序列进行截断。

  • 如果音频的质量很差,我们可能会通过消除噪音的算法来消除背景噪音,从而使我们能够专注于语音通话。

原始音频的数据增强

  • 我们可以使用一些数据增强技术,为我们的输入数据增加更多的种类,并帮助模型学习归纳出更广泛的输入。我们可以将我们的音频随机向左或向右移动一小段,或者更改一小段音频的音高或速率。

梅尔频谱图

  • 原始音频现在被转换为梅尔频谱图。频谱图通过将音频分解为一组频率,从而捕捉音频作为图像的性质。

MFCC

  • 特别是对于人类语音来说,有时还会多一个步骤,即将梅尔频谱图转换成MFCC(梅尔频率外频系数)。MFCC通过只提取最基本的频率系数,来产生一个用于表示的压缩梅尔频谱图,这些频率系数对应于人类说话的频率范围。

频谱图的数据增强

  • 我们现在可以在梅尔频谱图图像上应用另一个数据增强步骤,即使用SpecAugment的技术。这涉及到频率和时间屏蔽,随机屏蔽掉频谱图中的垂直(即时间屏蔽)或水平(即频率屏蔽)的信息带。注:我不确定这是否也能应用于MFCCs,也不确定结果是不是我们想要的。

现在,我们已经将原音频文件转化为经过数据清理和增强的梅尔频谱图(或MFCC)图像。

我们还需要从转录的文本中准备目标标签。这只是由简单句子组成的普通文本,所以我们为转录文本中的每个字符建立一个词汇表,并将它们转换成字符ID。

词汇表为我们提供了输入特征和目标标签。这些数据将输入到我们的深度学习模型中。

架构

用于ASR的深度学习架构有很多方法。两个常用的方法是。

  • 一个基于CNN和RNN的架构,使用CTC损失算法来划分语音中的每个字。例如。百度的深度语音模型。
  • 基于RNN的序列到序列网络,将频谱的每一个 "切片 "视为序列中的一个元素,例如谷歌的Listen Attend Spell(LAS)模型。

下面让我们选取以上第一种方法,更详细地探讨它是如何工作的。在高层次面上,该模型由以下这些块组成。

  • 一个由几个剩余CNN层组成的常规卷积网络,用于处理输入的频谱图像并输出这些图像的特征图。
    1_ShL-V8Xx3rg_IAw39-wdnA
    频谱图由卷积网络处理以产生特征图(图片由作者提供)。

  • 一个由几个双向LSTM层组成的常规递归网络,将特征图处理成一系列不同的时间段或 “帧”,对应于我们所需的输出字符序列。换句话说,它把作为音频的连续特征图转换成分散的。
    1_aWNhQwxlfUTHMFYkX2cJgA
    递归网络处理来自特征图的框架(图片由作者提供)。

  • 一个带有softmax的线性层使用LSTM的输出,为每个时间段的输出产生字符概率。

1_qZMAu-pKdvt63dllLbIv0A
线性层为每个时间段生成字符概率(图片由作者提供)。

  • 我们还有位于卷积和递归网络之间的线性层,它能帮助我们重塑一个网络的输出到另一个网络的输入。

因此,我们的模型采用频谱图图像,并为该频谱图中的每个时间段或 "帧 "输出字符概率。

对齐序列

稍思考一下你就会意识到,在我们的拼图中仍缺少一个重要的部分。我们的最终目标是将这些时间段或 "帧 "映射到我们的目标转录本中的各个字符。

1_dDDil4XKLyYMwXXY95v-vw
该模型对字符概率进行解码,以产生最终输出(图片由作者提供)。

但对于一个特定的频谱图,我们怎么知道到底应该有多少个帧?每个帧的边界在哪里?如何将音频与转录本中的每个字符对齐?

1_r-TZQCsbOD4cbCmaE-QdhQ
左边是我们需要的排列组合,那我们如何得到呢?(图片由作者提供)

音频和频谱图的图像没有预先分割,以至于无法给我们提供这种信息。

  • 在频谱图中,语音音频中每个字符的声音的持续时间可能是不同的。
  • 这些字符之间可能有空隙和停顿。
  • 几个字符可以合并在一起。
  • 例如,在 "苹果 "这个词中,我们如何知道音频中的 "p "声实际上是对应于文字转录中的一个还是两个 “p”?

1_wixr5MnnD5vHPVHxQPesTw
在现实中,口语对我们来说并不是整齐划一的 (图片有作者提供)

这实际是一个非常有挑战性的问题,也是ASR很难做好的原因。同时也是ASR区别于其他音视频应用(如分类等)的最大区别。

我们要使用一种巧妙的算法来解决这一问题,它有一个听起来很花哨的名字-连接主义时空分类,简称CTC。由于我不是 “花哨的人”,而且很难记住这个长长的名字,所以我将用CTC来指代它:smiley:

CTC算法–训练和推理

当输入是连续的,输出是离散的,并且没有明确的元素边界可以用来将输入映射到输出序列的元素时,CTC被用来对齐输入和输出序列。

它的特殊之处在于它能自动执行对齐,无需你手动提供这种对齐作为标记的训练数据的一部分,这将使创建训练数据集的成本非常高。

正如我们上面所讨论的,我们模型中卷积网络输出的特征图被切成独立的帧,并输入到递归网络中。每一帧对应于原始音频波的某个时间段。然而,帧的数量和每一帧的持续时间由你在设计模型时作为超参数选择。对于每一帧,递归网络连接着线性分类器,然后可以预测词汇表中每个字符的概率。

1_D_L6bqUP7hjSZbvsLgfqbw
连续的音频被切成离散的帧,并输入到RNN(图片由作者提供)。

CTC算法的工作是利用这些字符的概率,推导出正确的字符序列。

为了帮助它处理我们刚才讨论的对齐和重复字符的挑战,它在词汇表中引入了 "空白 “伪字符(用”-"表示)的概念。因此,网络输出的字符概率也包括每一帧的空白字符的概率。

需要注意的是,空白与 "空格 "不一样。空格是一个真实的字符,而空白意味着没有任何字符,有点像大多数编程语言中的 “空”。它只用于划分两个字符之间的界限。

CTC在两种模式下工作:

  • CTC损失(训练期间)。它有一个真实的目标成绩单,并试图训练网络以最大限度地提高输出该正确成绩单的概率。

  • CTC解码(推理过程中):这里我们没有目标转录本可以参考,所以我们必须预测最有可能的字符序列。

让我们再深度探讨一下以了解该算法的作用。我们将从比较简单的CTC解码开始。

CTC解码

  • 使用字符概率为每一帧挑选最接近的字符,包括空白。例如:“-G-o-ood”

1_fLSibJ3AgRB4suPmzS75qQ
CTC解码算法(图片由作者提供)。

  • 合并任何重复的且没有分隔符的字符。例如,我们可以将 "oo "合并成一个 “o”,但我们不能合并 “o-oo”。这就是CTC如何区分出有两个独立的 “o”,并产生用重复字符拼写的单词。

  • 最后,由于已经完成了合并,CTC就删除了所有的空白字符。 例如," Good "。

CTC损失

损失被计算为网络预测正确序列的概率。为了做到这一点,该算法列出了网络可以预测的所有可能的序列,并从中选择与目标转录本相匹配的子集。

为了从全部可能的序列中确定该子集,该算法将可能性缩小到以下程度。

  • 只保留目标转录单中出现的字符的概率,而放弃其他的。 例如,它只保留 “G”、“o”、"d “和”-"的概率。
  • 使用过滤后的字符子集,对于每一帧,只选择那些以与目标转录本相同的顺序出现的字符。 例如,尽管 "G "和 "o "都是有效的字符,但 "Go "的顺序是一个有效的序列,而 "OG "则是一个无效的序列。

1_hD3Up0mQvKcDRmvC-_6dIQ
CTC损失算法(图片由作者提供)。

有了这些约束条件,算法现在有了一组有效的字符序列,所有这些序列都将产生正确的目标转录。 例如,使用推理过程中使用的相同步骤,"-G-o-ood “和”-Go-od-"最终都会输出为 “Good”。

然后,它使用每一帧的单个字符概率,来计算产生所有这些有效序列的总体概率。该网络的目标是学习如何使该有效概率最大化,从而减少生成任何无效序列的概率。

严格来说,由于神经网络将损失降到最低,CTC损失被计算成所有有效序列的负对数概率。网络在训练期间通过反向传播使损失最小化,它调整所有的权重以产生正确的序列。

然而,要真正做到这一点,要复杂得多。具体挑战在于,有大量可能的不相关字符组合产生一个序列。简单举个例子,我们每一帧可以有4个字符、8个框架,这样就有了4 ** 8个组合(= 65536)。对于任何具有更多字符和更多框架的现实转录单,这个数字会以指数形式增加。这使得简单地列出有效的组合并计算其概率是不现实的。

有效解决这个问题是CTC的创新之处。这种算法很迷人,并且非常值得了解它是如何实现这一目标的细微差别的。这本身就值得写一篇完整的文章,我计划很快就会写。但现在,我们的重点是建立关于CTC的意识,而不是去研究它的工作原理。

衡量标准–单词错误率(WER)。

训练完我们的网络后,我们须对它进行评估。检验语音转文字问题的一个常用指标是词错误率(和字符错误率)。它将预测的输出和目标转录单逐字(或逐字符)进行比较,以计算出它们之间的差异数量。

差异可能是一个存在于转录单中但在预测中缺失的词(算作删除),一个不在转录单中但被添加到预测中的词(插入),或者一个在预测和转录单中却被篡改的词(替换)。

1_UdEVCwVO3CTxQYfdCsYYIQ
计算转录和预测之间的插入、删除和替换(图片由作者提供)。

衡量标准的公式是很直接的,它是相对于总字数的差异百分比。

1_Zhp0DMaFpSyXyDX14s1qAg
字词错误率的计算 (图片由作者提供)

语言模型

到目前为止,我们的算法已经将语音音频视为仅仅对应于某种语言的字符序列。但是,当把这些字符组合成单词和句子时,这些字符是否就真能表达出自己的意义呢?

NLP中的一个常见应用是建立一个语言模型。它捕捉到在一种语言中通常如何使用词语来构建句子、段落和文件。它可以是关于一种语言的通用模型,如英语或韩语,也可以是一个特定领域的模型,如医学或法律。

一旦你有了一个语言模型,它就可以成为其他应用的基础。例如,它可以被用来预测一个句子中的下一个词,辨别一些文本的情感(例如,这是一个积极的书评),通过聊天机器人回答问题,等等。

当然我们也可以通过引导模型产生按照语言模型更有可能的预测,并有选择地提高我们ASR输出的质量。

定向搜索

在描述推理过程中的CTC解码器时,我们隐晦地假设它总是在每个时间步中挑选出一个概率最高的字符。这就是所谓的贪心搜索。

然而,我们还可以使用一种叫做 "定向搜索 "的方法来获得更好的结果。

虽然定向搜索经常被用于一般的NLP问题,但它并不专门用于ASR,所以我在这里提到它只是为了补充一下。如果你想了解更多,请看我的文章,其中详细介绍了Beam Search。

定向搜索的工作原理

用浅显易懂的语言讲解定向搜索是如何增强预判的

towardsdatascience.com

towardsdatascience.com

总结

希望这能让你对解决ASR问题的基本要素和技术都有所了解。

在之前的深度学习日子里,通过经典的方法解决这类问题需要具备对音素等概念的理解和大量特定领域的数据准备和算法。

然而,在我们刚刚学到的深度学习,我们几乎不需要涉及任何音视频和语音知识特征工程,但它却能够产生出色的结果,不断带给我们惊喜!

最后,如果你喜欢这篇文章,你可能也会喜欢我其他相关文章以及强化学习的其他系列。

原文作者 Ketan Doshi

原文链接 https://towardsdatascience.com/audio-deep-learning-made-simple-automatic-speech-recognition-asr-how-it-works-716cfce4c706

推荐阅读
作者信息
AgoraTechnicalTeam
TA 暂未填写个人简介
文章
131
相关专栏
本专栏仅用于分享音视频相关的技术文章,与其他开发者和 Agora 研发团队交流、分享行业前沿技术、资讯。发帖前,请参考「社区发帖指南」,方便您更好的展示所发表的文章和内容。