吴恩达教授曾经预言过,当语音识别的准确度从95%提高到99%的时候,它将成为与电脑交互的首要方式。web
下面就让咱们来学习与深度学习进行语音室识别吧!数据库
机器学习并不老是一个黑盒网络
若是你想知道神经机器翻译是如何工做的,你应该猜到了咱们能够简单地将一些声音送入神经网络,而后训练它使之生成文本:app
这是使用深度学习进行语音识别的最高追求,可是很遗憾咱们如今尚未彻底作到这一点(至少在笔者写下这一篇文章的时候尚未–我敢打赌,再过几年咱们能够作到)机器学习
一个大问题是语速不一样。一我的可能会很快的说出”Hello!”,而另外一我的可能很是缓慢的说”heeeelllllllllllllooooo’!’,产生了一个拥有更多数据也更长的声音文件。这两个文件都应该被识别为同一个文本–“Hello!”。而事实证实,把各类长度的音频文件自动对齐到一个固定长度的文本是很难的一件事情。学习
为了解决这个问题,咱们必须使用一些特殊的技巧,并进行一些深度神经网络之外的特殊处理。让咱们看看它是如何工做的吧!大数据
显然,语音识别的第一步是–咱们须要将声波输入到电脑中。ui
咱们应该怎么将声波转换为数字呢?让咱们使用我说的「hello」这个声音片断举个例子:翻译
声波是一维的,它在每一个时刻都有一个基于其高度的值。让咱们把声波的一小部分放大看看:3d
为了将这个声波转换成数字,咱们只记录声波在等距点的高度:
这被称为采样(sampling)。咱们每秒读取数千次,并把声波在该时间点的高度用一个数字记录下来。这基本上就是一个未压缩的 .wav 音频文件。
“CD 音质”的音频是以 44.1khz(每秒 44100 个读数)进行采样的。但对于语音识别,16khz(每秒 16000 个采样)的采样率就足以覆盖人类语音的频率范围了。
让咱们把“Hello”的声波每秒采样 16000 次。这是前 100 个采样:
每一个数字表明声波在一秒钟的16000分之一处的振幅。
由于声波采样只是间歇性的读取,你可能认为它只是对原始声波进行粗略的近似估计。咱们的读数之间有间距,因此咱们必然会丢失数据,对吧?
可是,因为采样定理(Nyquist theorem),咱们知道咱们能够利用数学,从间隔的采样中完美重建原始声波——只要咱们的采样频率比指望获得的最高频率快至少两倍就行。
我提这一点,是由于几乎每一个人都会犯这个错误,并误认为使用更高的采样率老是会得到更好的音频质量。其实并非。
咱们如今有一个数列,其中每一个数字表明 1/16000 秒的声波振幅。
咱们能够把这些数字输入到神经网络中,可是试图直接分析这些采样来进行语音识别仍然很困难。相反,咱们能够经过对音频数据进行一些预处理来使问题变得更容易。
让咱们开始吧,首先将咱们的采样音频分红每份 20 毫秒长的音频块。这是咱们第一个 20 毫秒的音频(即咱们的前 320 个采样):
将这些数字绘制为简单的折线图,咱们就获得了这 20 毫秒内原始声波的大体形状:
虽然这段录音只有 1/50 秒的长度,但即便是这样短暂的录音,也是由不一样频率的声音复杂地组合在一块儿的。其中有一些低音,一些中音,甚至有几处高音。但总的来讲,就是这些不一样频率的声音混合在一块儿,才组成了人类的语音。
为了使这个数据更容易被神经网络处理,咱们将把这个复杂的声波分解成一个个组成部分。咱们将分离低音部分,再分离下一个最低音的部分,以此类推。而后将(从低到高)每一个频段(frequency band)中的能量相加,咱们就为各个类别的音频片断建立了一个指纹(fingerprint)。
想象你有一段某人在钢琴上演奏 C 大调和弦的录音。这个声音是由三个音符组合而成的:C、E 和 G。它们混合在一块儿组成了一个复杂的声音。咱们想把这个复杂的声音分解成单独的音符,以此来分辨 C、E 和 G。这和语音识别是同样的道理。
咱们须要傅里叶变换(Fourier Transform)来作到这一点。它将复杂的声波分解为简单的声波。一旦咱们有了这些单独的声波,咱们就将每一份频段所包含的能量加在一块儿。
最终获得的结果即是从低音(即低音音符)到高音,每一个频率范围的重要程度。以每 50hz 为一个频段的话,咱们这 20 毫秒的音频所含有的能量从低频到高频就能够表示为下面的列表:
可是把它们画成图表时会更容易理解:
你能够看到,在咱们的 20 毫秒声音片断中有不少低频能量,然而在更高的频率中并无太多的能量。这是典型「男性」的声音。
若是咱们对每一个20毫秒的音频块都重复这个过程,咱们最后会获得一个频谱图(从左到右每一列都是一个29毫秒的音频块)
频谱图很酷,由于你能够在音频数据中实实在在地看到音符和其余音高模式。对于神经网络来讲,相比于原始声波,从这种数据中寻找规律要容易得多。所以,这就是咱们将要实际输入到神经网络中去的数据表示方式。
从短音频中识别字符
如今咱们已经让音频转变为一个易于处理的格式了,如今咱们将要把它输入深度神经网络。神经网络的输入将会是 20 毫秒的音频块。对于每一个小的音频切片(audio slice),神经网络都将尝试找出当前正在说的声音所对应的字母。
咱们将使用一个循环神经网络——即一个拥有记忆,能影响将来预测的神经网络。这是由于它预测的每一个字母都应该可以影响它对下一个字母的预测。例如,若是咱们到目前为止已经说了「HEL」,那么颇有可能咱们接下来会说「LO」来完成「Hello」。咱们不太可能会说「XYZ」之类根本读不出来的东西。所以,具备先前预测的记忆有助于神经网络对将来进行更准确的预测。
当经过神经网络跑完咱们的整个音频剪辑(一次一块)以后,咱们将最终获得一份映射(mapping),其中标明了每一个音频块和其最有可能对应的字母。这是我说那句「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」这样的转写结果。用户说「Hullo」,它老是会认为你在说「Hello」,不管你发「U」的声音有多重。
试试看!若是你的手机被设置为美式英语,尝试让你的手机助手识别单词「Hullo」。这不行!它掀桌子不干了,它老是会理解为「Hello」。
不识别「Hullo」是一个合理的行为,但有时你会碰到使人讨厌的状况:你的手机就是不能理解你说的有效的语句。这就是为何这些语音识别模型老是处于再训练状态的缘由,它们须要更多的数据来修复这些少数状况。