《Machine Learning is Fun Part 6: How to do Speech Recognition with Deep Learning》译文

最近看到一篇介绍语音识别的《博客》,感觉写得不错,正好自己也在搞语音识别,就把它翻译成中文,希望对语音识别感兴趣的同学有所帮助。(囧:原来网上早就有翻译了,白浪费两天时间翻译,大家选择性围观)

语音识别正在占领我们生活的各个方面,手机、游戏手柄和智能手表中都会发现它的身影。同时它也在使我们的家庭更加智能,只需要花费50美元我们就可以买到亚马逊的Echo Dot—一个可以帮我们订披萨,获得天气预报,甚至可以购买垃圾袋的魔盒,我们需要做的就是大声对它说:Alexa, order a large pizza!(译者注:这背后的技术包括麦克风阵列,语音唤醒,语音识别和语义理解等。)
这里写图片描述
语音识别算不上新技术,发展也有几十年了,但是之前为什么没有引起主流媒体的注意呢?原因在于深度学习,深度学习使语音识别的准确率高到可以脱离非常局限的应用场景。
吴恩达曾做出这样的预测:当语音识别的准确率由95%提高到99%时,语音识别就可以成为人与计算机交流的主要方式。即使准确率只有4%的差异,但这也是语音识别不可用与可用的区别。但是有了深度学习,我们很有可能在不久的将来使语音识别达到真正可用的程度。
好,下面我们开始学习基于深度学习的语音识别。

机器学习不总是黑盒

如果你了解神经机器翻译,你可能认为我们只需要把录音灌进神经网络,训练它输出文字而已:
这里写图片描述
上面的流程确实就是基于深度学习的语音识别,但是太过简单了。语音识别最大的问题在于说话速度的可变性。某人可能会很快地说“hello!”,但是另外一个人可能会这样说“heeeelllllllllllllooooo!”,与前一个人相比就会产生更长的声音文件。不管怎样发音,两个人说的都需要识别成相同的文本—“hello!”。将变长的语音转变成定长的文字是一个超级难的问题。
为了解决这个难题,除了用到深度学习之外,我们还需要一些其他的特殊技巧和预处理。下面就介绍这些技巧。

将声音量化

语音识别的第一步显而易见—我们需要把声音存储到计算机中。在《系列文章3》中,我们了解到可以将一张图片看成一个数字数组,然后将该数组直接输入到神经网络中进行识别:
这里写图片描述
图像就是像素数组,但是声音是波形数据。我们该怎样将声音转换成数字序列呢?看下面一段表示“hello”的波形:
“hello”的波形
声音是一维数据。在每一个时刻,声音都会有一个独立的值。我们将波形的一段进行放大:
这里写图片描述
为了将这段声音转换成数字序列,我们等间隔对波形的高度值进行记录:
这里写图片描述
上述过程叫做采样。我们每秒都上千次等间隔记录波形的高度值形成数字序列。所有未压缩的wav文件都是按照这种方式存储的。
CD音质的音频通常的采样率是44.1KHz,但是针对语音识别,16KHz的采样率已经足够分辨人类的频率范围。我们对“hello”的波形按照16000次每秒进行采样,获得的前100个样本如下:
这里写图片描述
每一个点表示每1/16000秒所对应的声音幅值。
数字采样小知识
大家可能会产生这样的疑问:采样只是原始声音的一个近似,因为它只是离散的采样点,采样点之间的间隔会导致信息丢失,是这样吗?
这里写图片描述
采样是否能还原原始信号?采样之间的间隔该怎么处理?幸好有尼奎斯特定理的存在,我们可以利用离散的采样点完美恢复原始信号—前提是采样率至少是原始信号中最大频率的两倍。提到采样定理的原因是很多人错误地认为采样率越高音质越高,但这是不对的。(译者注:和声音中最大频率相关,如果最大频率固定,采样率再高也无用。)

采样数据的预处理

经过采样之后,我们获得了一个数组,数组的每一个值表示每1/16000s对应的声音采样幅值。我们可以立即将这些数据灌进神经网络,但是直接识别这些原始数据非常困难,通常会首先对这些数据进行一个预处理,使问题更加简单。
我们将20ms的语音数据归为一个数据包(包含320个采样点):
这里写图片描述
绘制上面20ms语音数据可以获得原始声音的一个大概描述:
这里写图片描述
虽然只有1/50s,但是这段录音也是包含不同频率声音的一个杂烩(mish-mash)。这里面既包含低频声音,也包含中等频率的声音,甚至还有高频声音。但正是这些不同频率的声音构成了复杂的人声。
为了使神经网络更容易处理声音数据,我们将其分解成不同频率波形的分量,低频部分、次低频部分等等。统计出这些不同频率分量的能量,我们就得到该段声音某种程度上的指纹。
例如,你有某人弹奏的一段C大调钢琴曲,它包含三个音符—C,E和G,三个音符混合构成了这段复杂的钢琴曲。现在将钢琴曲再分解,识别出它弹奏了C,E和G三个音符,这个过程和上面对声音的处理一模一样。
这个操作在数学上叫做傅里叶变换,它可以将复杂的声音分解成简单正弦波的叠加。一旦我们获得了这些正弦波,就可以通过将每个正弦波按照其能量相加恢复出原始声音。傅里叶分解的结果是每个频率的重要性(就是每个频率的幅值)。下面的数字表示上面20ms声音片段每50hz频率的能量值:
这里写图片描述
将上面的数据按照能量强弱画出来可能更直观:
这里写图片描述
可以看出,上面的片段在低频部分能量很强,高频部分能量较弱,是一段典型的男生音频。将整段声音每20ms按照上面的步骤进行处理,我们可以得到整段声音的一个频谱图:
“hello”片段的频谱图
频谱图非常有用,从中可以看出不同的音符和其他音高组合的模式。相比原始声音,神经网络更容易从频谱数据中发现模式,所以我们就将这种数据灌入神经网络。

从短音频中识别字符

将音频进行频谱转换后,我们就可以利用神经网络对其进行识别。输入是20ms声音变换之后的频谱,神经网络会尝试从频谱中找到这段声音对应的字符。
这里写图片描述
上图中使用的神经网络叫做RNN—是一种具有影响未来预测模块的神经网络。采用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”出现更频繁,所以它最可能是用户想表达的,我们就选择它作为我们最后的输出。这就完成了语音到文本的转换!

Wait a second

你可能会想:用户确实说的是“Hullo”该怎么办呢?事实上,“Hullo”也是一个合法的单词,这种情况下“Hello”就是错误地转换。
“Hullo! Who dis?”
用户确实可能会说“Hullo”而不是“Hello”,但一个语音识别系统可能永远不会输出“Hullo”,因为用户说“Hullo”的概率远低于说“Hello”的概率。所以不论你怎么强调“U”,系统总是会给你返回“Hello”。(译者注:这就是集外词(OOV)问题。)
不信你可以试一下!如果你手机的语言设置是英文,你可以试着让你的语音助手识别“Hullo”,它绝对识别不出来,总是会输出“Hello”。不能识别“Hullo”也还算是一个合理的选择,毕竟它出现的概率太低了。但是,有时手机就是不能识别一个正确的单词,这就特别令人气恼。正是因为这个原因,语音识别的模型总是在不停地更新以解决这些边界问题。

我可以构建自己的语音识别系统吗?

机器学习最激动人心的一点是它有时非常简单:获得一些数据,然后用机器学习算法进行学习,就会获得一个可以运行在游戏机上的AI系统,真的是这样吗?
上面的话对有些情景是正确的,但是真的语音不适用。语音识别是一个非常难的问题。你需要克服非常多的困难:低质量录音,背景噪音,混响和回声,重口音等等一系列问题。所有这些问题都必须在训练数据中体现出来,以确保训练的神经网络能处理这些问题。再考虑另外一个例子:当你在一个很大的房间里说话的时候,你会不自觉地提高自己说话的音量以便自己的声音可以盖过噪声。我们人类可以很容易地分辨你说的(译者注:这叫做鸡尾酒效应),但是神经网络必须经过特殊训练才能处理这种情形,所以我们需要利用含有人说话噪声的数据训练神经网络。
构建一个工业级的语音识别系统(如Siri,Google Now!,或者Alexa),我们需要大量的训练数据—至少得需要雇佣几百人的规模来采集才行。用户不可能忍受低质量的识别系统,所以获得大量训练数据是必须的。像Google和Amazon这样的公司,他们有数十万小时的训练数据。正是这些数据量才使他们的识别系统远远好于自己搭建的小系统。我们在手机上可以免费试用Google Now!或者Siri,以及$50美元买个Alexa之后就无需其他费用的原因是他们都在一刻不停地收集用户的语音数据。这些数据会被用来训练新的语音识别系统。
如果你在寻找一个创业点,我不建议你搭建自己的语音识别系统来和Google竞争。你首先需要做的是让用户自愿给你提供他们自己的语音数据。

更多资料

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值