来源:Coursera吴恩达深度学习课程
现今,最令人振奋的发展之一就是seq2seq模型(sequence-to-sequence models)在语音识别(speech recognition)方面准确性有了很大的提升。我们来看看seq2seq模型是如何应用于音频数据(audio data)的,比如语音(the speech)。什么是语音识别问题呢?
有一个音频片段(audio clip)x,任务是自动地生成文本(transcript)y。一个音频片段,画出来是这样(横轴是时间)。一个麦克风的作用是测量出微小的气压(air pressure)变化,耳朵能够探测到这些微小的气压变化,于是我们可以听到声音,气压随着时间而变化。假如这个音频片段的内容是:"the quick brown fox"(敏捷的棕色狐狸),这时我们希望一个语音识别算法(speech recognition algorithm),通过输入这段音频,然后输出音频的文本内容。考虑到人的耳朵并不会处理声音的原始波形(row wave forms),而是通过一种特殊的物理结构来测量不同频率和强度的声波。音频数据的常见预处理步骤,就是运行这个原始的音频片段,然后生成一个声谱图(spectrogram),横轴(horizontal axis)是时间,纵轴(vertical axis)是声音的频率(frequencies),而图中不同的颜色,显示了声波能量的大小(the amount of energy),也就是在不同的时间和频率上这些声音有多大。通过这样的声谱图,伪空白输出(the false blank outputs)也应用于预处理步骤,也就是在音频被输入到学习算法之前,而人耳所做的计算和这个预处理过程非常相似。
曾经有一段时间语音识别系统是用音位(phonemes)来构建的,也就是人工设计的基本单元(hand-engineered basic units of cells),如果用音位来表示"the quick brown fox",在这里稍微简化一些,"the"含有"th"和"e"的音,而"quick"有"k" "w" "i" "k"的音,语音学家过去把这些音作为声音的基本单元写下来,把这些语音分解成这些基本的声音单元,而"brown"不是一个很正式的音位,因为它的音写起来比较复杂,不过语音学家(linguists)们认为用这些基本的音位单元(basic units of sound called phonemes)来表示音频(audio),是做语音识别最好的办法。不过在end-to-end模型中,我们发现这种音位表示法(phonemes representations)非必要,可以构建一个系统,通过向系统中输入音频片段(audio clip),然后直接输出音频的文本(a transcript),而不需要使用这种人工设计的表示方法。使用这种方法需要用一个很大的数据集,研究数据集可能长达300个小时,在学术界,甚至3000小时的文本音频数据集,都被认为是合理的大小。大量的研究,大量的论文所使用的数据集中,有几千种不同的声音,而且,最好的商业系统现在已经训练了超过1万个小时的数据,甚至10万个小时,并且它还会继续变得更大。在文本音频数据集中(Transcribe audio data sets)同时包含x和y,通过深度学习算法大大推进了语音识别的进程。那么,如何建立一个语音识别系统呢?
如上图,一种方法是结合之前的注意力模型(attention model),在输入音频的不同时间帧上(横轴),你可以用一个注意力模型,来输出文本描述,如"the quick brown fox",或者其他语音内容。
还有一种效果也不错的方法,就是用CTC损失函数(CTC cost)来做语音识别。CTC就是Connectionist Temporal Classification,它是由Alex Graves、Santiago Fernandes, Faustino Gomez、和Jürgen Schmidhuber提出的。具体可以参考论文:Connectionist temporal classification:labelling unsegmented sequence data with recurrent neural networks。
算法思想如下:
假设语音片段内容是某人说:"the quick brown fox",这时我们使用一个新的网络,结构像这个样子,这里输入x和输出y的数量一样,因为这里画的只是一个简单的单向RNN结构。然而在实际中,它有可能是双向的LSTM结构,或者双向的GRU结构,并且通常是很深的模型。但注意一下这里时间步的数量,它非常地大。在语音识别中,通常输入的时间步数量(the number of input time steps)要比输出的时间步的数量(the number of output time steps)多出很多。举个例子,有一段10秒的音频,并且特征(features)是100赫兹的,即每秒有100个样本,于是这段10秒的音频片段就会有1000个输入,就是简单地用100赫兹乘上10秒。所以有1000个输入,但可能你的输出就没有1000个字母了,或者说没有1000个字符。这时要怎么办呢?CTC损失函数允许RNN生成这样的输出:ttt,这是一个特殊的字符,叫做空白符(black character),我们这里用下划线表示,这句话开头的音可表示为h_eee_ _ _,然后这里可能有个空格,我们用这个(非下划线)来表示空格,之后是_ _ _qqq__,这样的输出也被看做是正确的输出。下面这段输出对应的是"the q"。CTC损失函数的一个基本规则是将空白符之间的重复的字符折叠起来,再说清楚一些,这里用下划线来表示这个特殊的空白符(a special blank character),它和空格(the space character)是不一样的。所以the和quick之间有一个空格符,所以我们要输出一个空格,通过把用空白符所分割的重复的字符折叠起来,然后我们就可以把这段序列折叠成"the q"。这样一来你的神经网络因为有很多这种重复的字符,和很多插入在其中的空白符(blank characters),所以最后我们得到的文本会短上很多。于是这句"the quick brown fox"包括空格一共有19个字符,在这样的情况下,通过允许神经网络有重复的字符和插入空白符使得它能强制输出1000个字符,甚至你可以输出1000个y值来表示这段19个字符长的输出。这篇论文来自于Alex Grace以及刚才提到的那些人。Andrew所参与的深度语音识别系统项目就使用这种思想来构建有效的语音识别系统。
以上是语音识别的粗略的理解(rough sense),理解语音识别模型是如何工作的,注意力模型是如何工作的,以及CTC模型是如何工作的,以及这两种不同的构建这些系统的方法。现今,在生产技术中,构建一个有效语音识别系统,是一项相当重要的工作(a pretty significant effort),并且它需要很大的数据集(data set),之后的课程Andrew将告诉我们如何构建一个触发字检测系统(rigger word detection system),其中的关键字检测系统(keyword detection system)将会更加简单,它可以通过一个更简洁的数量更合理的数据来完成。
说明:记录学习笔记,如果错误欢迎指正!转载请联系我。