用深度学习做语音识别

徐大白
3个月前 阅读 421 点赞 2

吴恩达曾经预测当语音识别的准确率从95%上升到99%时,语音识别将会成为人类与计算机交互的新方式。归功于深度学习,这4%的准确率的提升使得语音识别从难以实际应用的技术变成有无限的应用潜力的技术。本文深入浅出介绍了怎样用深度学习做语音识别。

语音识别正在进入我们日常生活的方方面面。语音识别技术内置在我们的手机、游戏机和智能手表中,它甚至能将我们的整个家庭智能化。只需50美元就能买到一个Amazon Echo Dot,它像一个魔术盒子,可以帮你订购比萨,向你播报天气预报等等,你只需大声对它说:


“Alexa,order a large pizza!”


语音识别技术已经发展了几十年,近年突然变得炙手可热,这归功于深度学习终于使得语音识别的准确率提升到足矣让这项技术在实验测试以外的实际场景中应用。

吴恩达曾经预测当语音识别的准确率从95%上升到99%时,语音识别将会成为人类与计算机交互的新方式。这4%的准确率的提升使得语音识别从难以使用到潜力无限。多亏深度学习的发展,我们终于到达语音识别的顶点。

让我们一起来了解怎样用深度学习做语音识别。


机器学习并不总是黑盒

如果你对神经机器翻译的工作机制已经有所了解,你可能会想到,我们可以简单地将声音作为输入喂进神经网络,然后训练网络产生文本:



上图是使用深度学习做语音识别的最佳机制,但我们目前还没有达到这一步。

一个很大的问题是语速不同。某些人说“hello!”会很快速,有些人会拉得很长地说“heeeelllllllllllllooooo!”,这会产生更长的声音文件和更多的数据。这两个声音文件应该被识别为完全相同的文本——“hello!”这里面的难点在于把不同长度的音频文件自动对齐为一个同样长度的文本结果。

要解决这个问题,我们需要使用一些特殊的技巧,在深度神经网络之上增加一些额外的处理。


将声音转换为位元

语音识别的第一步显然是——将声音馈送到计算机。

在图像识别技术中,我们可以将图像视为数字的阵列,直接将数字喂入神经网络进行图像识别,如图:


图像被视为数字的排列,这些数字是对每个像素的强度进行解码的结果。


但声音是通过波(wave)传输的。怎样将声波转换为数字呢?让我们使用“Hello”这个声音片段作为例子:


“Hello”的声波


声波是一维的。每个时刻的声波只有一个单一的值,这个值的大小基于波的高度。让我们放大上述声波的一小片段看看:

为了将这段声波转换成数字,我们需要记录等间隔点的波的高度:


对一段声波采样


这个过程叫做采样(sampling)。我们每秒读数千次,并记录下代表该时间点的声波高度的数字。这基本上是一个未压缩的.wav音频文件。“CD质量”的音频以44.1khz(每秒读取44100次)进行采样,但对于语音识别来说,16khz(每秒16000次采样)的采样率已经足以覆盖人类语音的频率范围。


我们对“Hello”这个声波进行了16000次/秒的采样,这里是前100个样本:


每个数字代表间隔1/16000秒的声波的振幅


数字采样重建原始声波

你可能认为采样只是原始声波的粗略近似,因为它只是偶然的读数。我们的读数之间有间隔,所以我们必定会丢失一些数据,是这样吗?


(左)原始模拟信号;(右)采样的数字信号


但是,由于Nyquist定理,我们其实可以使用数字信号从有间隔的样本完全重建原始的声波——只要我们采样的频率至少比我们想要记录的最高频率高两倍。

我提到这点是因为几乎每个人都会在这一点上弄错,会认为使用更高的采样率能得到更好的音频质量。其实不是的。


预处理采样的音频数据

我们现在已经有一组数字阵列,每个数字代表声波间隔1/16000秒的振幅。

我们可以把这些数字馈送入神经网络,但是试图直接处理这些样本来识别语音模式是很困难的。相反,通过对音频数据进行一些预处理能让问题更容易。

让我们先把采样的音频以20毫秒长的块来分组。以下是第一个20毫秒的音频(即前320个样本):


将这些数字绘成图,得出20毫秒时间段的原始声波的粗略近似:



这样一个记录的长度只有1/50秒,但这样一个短录音已经包含复杂的不同频率的声音,有低音,有中音,甚至还有一些高音。但总的来说,这些不同的频率混合在一起,组合成复杂的人类语音。

为了让这些数据更容易为神经网络处理,我们把这些复杂的声波分解为一个个组成部分。我们将它分解为低音部分,更低音部分,等等,然后将每个频带(从低到高)的能量相加,为该音频片段创建一个有排序的识别码。

我们使用傅立叶变换运算来实现这点,它能将复杂的声波分解为简单的声波。当我们有了这些单独的声波,可以将每一个部分所包含的能量加在一起。最终得到的结果是从低音到高音的每个频率范围的重要程度得分。下图的每个数字表示这段20毫秒的音频中每个50Hz的频带的能量:



把这些数字绘制成图表:


可以看到,这段20毫秒的声音片段中有很多低频能量,而更高的频率没有太多能量。这是典型的男性声音。


如果我们对每个20毫秒的音频片段重复这个过程,最终能得到一个频谱图(每一列从左到右是一个20ms的片段):


“Hello”音频的完整频谱图


这个谱图很酷,因为你能够实际看到音频数据中的音符以及其他音高模式。神经网络在这种形式的数据中能够比从原始声波数据更容易找到模式。因此,这种数据呈现是我们实际馈送给神经网络的输入。


从短音频中识别字符

现在我们将格式易于处理的音频数据输入到深度神经网络中,这些输入是20毫秒的音频片段。对于每个片段,神经网络将试图找出对应于当前声音的字母。



我们使用一个循环神经网络来预测每个字母对下一个字母的影响可能性。例如,如果我们已经识别到“HEL”,那么很可能接下来的字母是“LO”,以完成“Hello”,而不太可能是“XYZ”之类的字母。因此,具有先前预测的记忆有助于神经网络进行更准确的预测。

在我们通过神经网络(每次一个片段)处理完整个音频后,我们将最终得到每个音频片段和最可能的字母的映射。下图是“Hello”的映射的样子:



神经网络预测我说的一个可能是“HHHEE_LL_LLLOOO”。但它也认为有可能我说“HHHUU_LL_LLLOOO”甚至“AAAUU_LL_LLLOOO”。

我们有一些步骤来使输出更干净。首先,我们需要用单个字符替换重复的字符:


  • HHHEE_LL_LLLOOO变为HE_L_LO
  • HHHUU_LL_LLLOOO变为HU_L_LO
  • AAAUU_LL_LLLOOO变为AU_L_LO


然后,删除所有空格:


  • HE_L_LO变为HELLO
  • HU_L_LO变为HULLO
  • AU_L_LO变为AULLO


于是,我们得到三个可能的转录:“hello”,“Hullo”和“Aullo”。如果你大声读出来,这几个声音都和“hello”相似。因为神经网络一次预测一个字符,因此会得出这些试探性的转录。例如,如果你说“He would not go”,它可能转录为“He wud net go”。

解决办法是根据文本(书籍、新闻报道等)数据库,对这些基于发音的预测进行打分。初步输出的转录可能与音频的真实语义相差很远,但经过处理后能得到最接近的转录文本。

在神经网络得出的可能的转录“Hello”,“Hullo”和“Aullo”中,显然“Hello”出现在文本数据库中的频率更高(更不用说在原始的音频训练数据中的频率),因此“Hello”更可能是正确的。所以我们选择将“Hello”作为最后的转录结果。

你可能会想“但是,如果有人真的说了‘hullo’呢?这是一个有效的词,但机器转录成‘hello’是错误的!”

当然可能有人说“hullo”,而不是“hello”。语音识别系统(用美式英语数据训练)基本上永远不会产生“hullo”的转录。只是这是可能性很低的情况,不管你说“hullo”时多么强调‘U’的发音,系统总是会认为你在说“hello”。

这就是为什么这些语音识别模型总是需要用更多的数据进行大量的训练,以更好的处理这些极端情况。

| 2
评论 ( {{ comments.total }} )

还没有人发表评论...

{{ o.content }}
赞 {{ o.likes_count ? o.likes_count : '' }} 回复 {{ o.created_at }}