作者:Adam Geitgey
原文:https://medium.com/@ageitgey/machine-learning-is-fun-part-4-modern-face-recognition-with-deep-learning-c3cffc121d78
翻译:拼命先生
转载请联系译者!
语音识别正在侵入我们的生活。它内置于我们的手机,游戏机和智能手表中。它甚至可以使我们的家庭自动化。只需50美元,您就可以获得一个Amazon Echo Dot 魔术盒,它可帮您订购披萨,获取天气预报甚至购买垃圾袋,只需大声说出:Alexa, 订购一个大号的披萨!
Alexa,订一个大号的比萨!
但语音识别已经存在了几十年了,那为什么它现在才成为主流呢?原因在于深度学习最终使语音识别足够准确,足以在实验室环境之外的场景使用。
吴恩达Andrew Ng长期以来预测,随着语音识别从95%准确到99%准确,它将成为我们与计算机交互的主要方式。这就是说,这4%的差距,就是“很不靠谱”和“非常有用”的差异。感谢深度学习,我们终于达到了顶峰。
让我们学习如何通过深度学习进行语音识别!
机器学习并不总是黑盒子
如果你知道神经机器翻译是如何工作的,你可能会想到我们可以简单地将录音输入神经网络并训练它来产生文本:
这是深度学习语音识别的圣杯,但我们还没有达到(至少在我写这篇文章的时候 - 我打赌我们将会在几年内)。
最大的问题是语音速度不同。一个人可能会很快说“Hello!”而另一个人可能会非常缓慢地说“Heeeelllllllllllllooooo!”,从而生成一个包含更多数据的更长声音文件。两个声音文件都应该被识别为完全相同的文本 - “Hello!”,而自动将各种长度的音频文件对齐到固定长度的文本相当困难。
要解决这个问题,除了深度神经网络之外,我们还必须使用一些特殊的技巧和额外的动作。让我们看看它是如何工作的!
把声音变成比特
语音识别的第一步显而易见 - 我们需要将声波输入计算机。
在第3章中,我们学习了如何拍摄图像并将其视为数字数组,以便我们可以直接将其提供给神经网络以进行图像识别:
图像只是图片中每个像素深度的数字编码序列
但声音是以波浪的形式传播的。我们如何将声波转换为数字?让我们用我说的“hello”这个声音片段举个例子:
我说的"hello"的波形
声波是一维的。在每个时刻,他们都有一个基于波浪高度的高度值。让我们放大声波的一小部分,看看:
要将此声波转换为数字,我们只需在等间距点记录波的高度:
采样声波
这称为采样(sampling)。我们每秒读取数千次读数,并记录表示该时间点声波高度的数字。这基本上都是一个未压缩的.wav音频文件。
“CD质量”音频采样为44.1khz(每秒读数为44,100)。但对于语音识别,16khz(每秒16,000个采样)的采样率足以覆盖人类语音的频率范围。
让我们每秒16,000次采样我们的“Hello”声波。这是前100个样本:
每个数字表示声波1/16000秒的间隔的振幅
数字采样小助手
您可能认为采样只是创建原始声波的粗略近似值,因为它只是偶尔读取。我们的读数之间存在差距所以我们必须丢失数据,对吧?
数字采样能否完美地重现原始的模拟声波?那些差距怎么办?
但是由于采样定理(奈奎斯特Nyquist theorem定理),我们知道我们可以根据间隔采样数据,使用数学来完美地重建原始声波,只要我们采样的速度至少是我们想要记录的最高频率的两倍。
我之所以提到这一点,只是因为几乎每个人都错了,并假设使用更高的采样率总能带来更好的音质。其实并不是这样。
预处理我们的声音采样数据
我们现在有一个数字数组,每个数字代表声波的振幅,以1/16,000秒为间隔。
我们可以将这些数字直接输入神经网络。但是试图通过直接处理这些样本来识别语音模式是困难的。相反,我们可以通过对音频数据进行一些预处理来简化问题。
让我们首先将我们的采样音频分组为20毫秒长的块。这是我们之前的20毫秒音频(即我们的前320个样本):
将这些数字绘制为简单的折线图,可以在20毫秒的时间内粗略估计原始声波:
该记录的长度只有1/50秒,但即便是这么短的录音也是一种不同频率声音的复杂混合物。有一些低音,一些中音,甚至还有一些高音。但是把它们放在一起,这些不同的频率混合在一起,构成了复杂的人类语音。
为了使神经网络更容易处理这些数据,我们将把这个复杂的声波分解成一个个组成部分。我们将分离低音部分,再分离次低音调部分,以此类推。然后通过计算每个频段(从低到高)的能量,我们为此音频片段创建了指纹(fingerprint )。
想象一下,你有一个人在钢琴上演奏C大调和弦的录音。那个声音是三个音符C,E和G的组合,所有音符都混合成一个复杂的声音。我们希望将复杂的声音分解为单个音符,以此分辨C,E和G,这是和语音识别是完全相同的倒立。
我们使用称为傅立叶变换(Fourier Transform)的数学运算来完成此操作。它将复杂的声波分解成简单的声波。一旦我们获得了那些简单的声波,我们就会把每个声波中包含的能量相累加。
最终结果是从低音到高音,每个频率范围的重要性得分。下面的每个数字代表我们20毫秒音频剪辑的每个50赫兹频段的能量:
列表中的每个数字表示那 50Hz 的频段所含的能量
不过,把它们画成这样的图表会更加清晰:
如果我们在每20毫秒的音频块上重复这个过程,我们最终得到一个频谱图(从左到右的每个列都是一个20ms的块):
“hello”声音片段的完整频谱图
频谱图很酷,因为您实际上可以在音频数据中看到音符和其他音高模式。对于神经网络来说,相比原始声波,在这种数据中更容易找到规律。所以这就是我们实际输入到神经网络中的数据表示方式。
从短声音识别字符
现在我们有了格式易于处理的音频,我们将把它输入到深度神经网络中去。神经网络的输入将会是 20 毫秒的音频块。对于每个小的音频切片(audio slice),神经网络都将尝试找出当前正在说的声音所对应的字母。
我们将使用循环神经网络(RNN) - 即具有影响未来预测的记忆能力的神经网络。这是因为它预测的每个字母都会影响它预测下一个字母的可能性。例如,如果到目前为止我们已经说过“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”作为我们的最终结果而不是其他。完成!
等一等!
你可能会想“但如果有人说' Hullo '怎么办?这是一个有效的词。也许'hello'是错误的结果!“
喂,是谁?
当然有人可能会说“Hullo”而不是“hello”。但像这样的语音识别系统(受美国英语训练)基本上不会产生“Hullo”的结果。对于用户而言,与“hello”相比,无论你多么强调“U”声,它总是会认为你在说“hello”。
试试看!如果您的手机设置为美式英语,请尝试让手机的语音助理识别“Hullo”。这肯定不行!它拒绝!它总是将其理解为“hello”。
不识别“Hullo”是一种合理的行为,但有时你会发现烦人的情况,你的手机总是拒绝理解你说的有效的东西。这就是为什么这些语音识别模型总是被不断训练,需要更多的数据来修复这些少数情况。
我可以建立自己的语音识别系统吗?
关于机器学习最酷的事情之一就是它有时看起来有多简单。你获得了大量数据,将其输入到机器学习算法中,然后神奇地得到了一个可以运行在你游戏笔记本电脑显卡上的世界级的AI系统...... 对吗?
在某些情况下,这种情况确实如此,但不适用于语音识别。言语识别是一个难题。您必须克服几乎无穷无尽的挑战:质量差的麦克风,背景噪音,混响和回声,重音变化等等。所有这些问题都需要存在于您的训练数据中,以确保神经网络能够处理它们。
这里有另一个例子:你知道吗,当你在一个嘈杂的房间里说话时,你会无意识地提高你的声音,以便能够盖过噪音?无论哪种方式,人类对你的理解都没有问题,但需要训练神经网络来处理这种特殊情况。因此,您需要人们大声讲话的训练数据!
要构建一个在Siri,Google Now!或Alexa级别上执行的语音识别系统,您将需要大量的培训数据 - 如果你不雇佣数百人为您录制,这将远远超过您能够获得的数据。由于用户对低质量语音识别系统的容忍度较低,因此您不能吝啬这一点。没有人想要一个只有80%的时间可以正常工作的语音识别系统。
对于像谷歌或亚马逊这样的公司来说,在现实生活中记录的数十万小时的语音就是黄金。这是世界级语音识别系统与您的系统拉开距离的地方。让你免费使用 Google Now 或 Siri,或是只要 50 美元购买 Alexa 而没有订阅费的意义就是:让你尽可能多地使用它们。您对其中一个系统说的每一件事都会被永久记录下来,并用作未来版本的语音识别算法的训练数据。这就是整场比赛!
不相信我?如果你有一部带有Google Now的Android手机!,点击这里聆听自己曾经对它说过的每一个愚蠢的事情:
您可以通过Alexa应用程序访问Amazon的相同内容。不幸的是,Apple不允许您访问Siri语音数据
因此,如果你正在寻找一个创业的想法,我不建议你尝试建立自己的语音识别系统来与 Google 竞争。相反,你应该想个办法,让人们把自己讲了几个小时的录音交给你。这种数据可以是你的产品。
路在远方……
这个用来处理不同长度音频的算法被称为连接时序分类(Connectionist Temporal Classification)或 CTC。你可以阅读这篇 2006 年文章。
百度的亚当·科茨(Adam Coates)在湾区深度学习学校做了关于「深度学习语音识别」的精彩演讲。你可以在 YouTube 上观看这段视频。强烈推荐。