现在,最令人振奋的发展之一就是seq2seq模型,在语音识别方面的准确性有了很大的提升。下面讲seq2seq模型是如何应用于音频数据的,比如语音。什么是语音识别问题呢?如有一个音频片段x,任务是自动地生成文本y。音频片段画出来是这样的:横轴是时间,纵轴代表气压随着时间变化的高低。麦克风的作用是测量出微小的气压变化,耳朵能听到声音也是因为检测到了微小的气压变化。
加入音频片段的内容是“the quick brown fox”,这时我们希望通过一个语音识别算法,输入这段音频,就能输出这段音频的文本内容。考虑到人的耳朵并不会处理声音的原始波形,而是通过一种特殊的物理结构来测量这些不同频率和强度的声波。音频数据的常见预处理步骤是运行这个原始的音频片段,生成一个声谱图。其横轴是时间,纵轴是声音的频率,而图中不同的颜色显示了声波能量的大小。也就是在不同的时间和频率上,这些声音有多大。通过这样的声谱图,伪空白输出也经常应用于预处理步骤。也就是在音频被输入到学习算法之前,而人耳所做的计算和这个预处理过程非常相似。
语音识别方面最令人振奋的趋势之一就是曾经有一段时间,语音识别系统是用音位来构建的,也就是人工设计的基本单元。语言学家过去把这些音位作为声音的基本单元写下来,把这些语音分解成基本的声音单元。那时候科学家认为用这些基本的音位单元来表示音频,是做语音识别最好的方法。不过在end-to-end模型中,我们发现这种音位表示法已经不再必要了。而是可以构建一个系统,通过向系统中输入音频片段然后直接输出音频的文本,而不需要使用这种人工设计的表示方法。
而使这种方法成为可能的一件事,就是用一个很大的数据集,所以语音识别的研究数据集可能长达300个小时。在学术界,甚至3000小时的文本音频数据集都被认为是合理的大小。大量的研究,大量的论文中所使用的音频有几千种不同的声音。而且最好的商业系统,现在已经训练了超过1万小时的数据,甚至10万个小时。并且它还会继续变得更大。在文本音频数据集中同时包含x和y,通过深度学习算法大大推进了语音识别的进程。
那么如何建立一个语音识别系统呢?在上一节中,我们谈到了注意力模型,所以一件能做的事就是在横轴上,也就是在输入语音的不同时间帧上,用一个注意力模型来输出文本描述。
还有一种效果也不错的方法就是用CTC损失函数来做语音识别。CTC就是connectionist temporal classification。算法思想如下:假设语音片段内容是某人说“the quick brown fox”,这时我们使用一个新的网络,结构如下,这里输入x和输出y的数量都是一样的。图中只是一个简单的单向RNN结构,在实际中可能是双向的LSTM结构或者双向的GRU结构,并且通常是很深的模型。但注意一下这里时间步的数量非常大,有1000步。
在语音识别中,通常输入的时间步数量要比输出的时间步的数量多出很多。举个例子,比如你有一段10秒的音频,并且特征是100赫兹的,即每秒有100个样本。于是这10秒的音频片段会有1000个输入,但可能输出就没有1000个字母了,或者说没有1000个字符。这时要怎么办呢?CTC损失函数允许RNN生成这样的输出:ttt_h_eee___(下划线)。这是一种特殊的字符,叫做空白符。CTC损失函数的一个基本规则是将空白符之间重叠的字符折叠起来。空白符和空格是不一样的,空格就代表真正的空格。通过把用空白符所分割的重复的字符折叠起来,就可以把这段字符折叠成the q……这样一来神经网络就可以有1000个输出了。因为有很多这种重复的字符和很多插入在其中的空白符,所以最后我们得到的文本会短上很多。所以“the quick brown fox”这句包括空格一共有19个字符,通过重复字符和空白符,使它强制输出成1000个字符。甚至可以输出1000个y值,来表示这段19个字符长的输出。