编程技术网

关注微信公众号,定时推送前沿、专业、深度的编程技术资料。

 找回密码
 立即注册

QQ登录

只需一步,快速开始

极客时间

序列模型和注意力机制-语音识别(Speech recognition)

王智和 人工智能 2021-12-9 22:33 155人围观

腾讯云服务器

语音识别(Speech recognition)

现今,最令人振奋的发展之一,就是seq2seq模型(sequence-to-sequence models)在语音识别方面准确性有了很大的提升。这门课程已经接近尾声,现在我想通过剩下几节视频,来告诉你们,seq2seq模型是如何应用于音频数据的(audio data),比如语音(the speech)。

什么是语音视频问题呢?现在你有一个音频片段$x$(an audio clip,x),你的任务是自动地生成文本$y$。现在有一个音频片段,画出来是这样,该图的横轴是时间。一个麦克风的作用是测量出微小的气压变化,现在你之所以能听到我的声音,是因为你的耳朵能够探测到这些微小的气压变化,它可能是由你的扬声器或者耳机产生的,也就是像图上这样的音频片段,气压随着时间而变化。假如这个我说的音频片段的内容是:"the quick brown fox"(敏捷的棕色狐狸),这时我们希望一个语音识别算法(a speech recognition algorithm),通过输入这段音频,然后输出音频的文本内容。考虑到人的耳朵并不会处理声音的原始波形,而是通过一种特殊的物理结构来测量这些,不同频率和强度的声波。音频数据的常见预处理步骤,就是运行这个原始的音频片段,然后生成一个声谱图(a spectrogram),就像这样。同样地,横轴是时间,纵轴是声音的频率(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$,通过深度学习算法大大推进了语音识别的进程。那么,如何建立一个语音识别系统呢?

在上一节视频中,我们谈到了注意力模型,所以,一件你能做的事就是在横轴上,也就是在输入音频的不同时间帧上,你可以用一个注意力模型,来输出文本描述,如"the quick brown fox",或者其他语音内容。

还有一种效果也不错的方法,就是用CTC损失函数(CTC cost)来做语音识别。CTC就是Connectionist Temporal Classification,它是由Alex GravesSantiago FernandesFaustino Gomez、和Jürgen Schmidhuber提出的。(Graves A, Gomez F. Connectionist temporal classification:labelling unsegmented sequence data with recurrent neural networks[C]// International Conference on Machine Learning. ACM, 2006:369-376.

算法思想如下:

假设语音片段内容是某人说:"the quick brown fox",这时我们使用一个新的网络,结构像这个样子,这里输入$x$和输出$y$的数量都是一样的,因为我在这里画的,只是一个简单的单向RNN结构。然而在实际中,它有可能是双向的LSTM结构,或者双向的GIU结构,并且通常是很深的模型。但注意一下这里时间步的数量,它非常地大。在语音识别中,通常输入的时间步数量(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,这是一个特殊的字符,叫做空白符,我们这里用下划线表示,这句话开头的音可表示为heee\ _ _,然后这里可能有个空格,我们用这个来表示空格,之后是_ _ _qqq__,这样的输出也被看做是正确的输出。下面这段输出对应的是"the q"。CTC损失函数的一个基本规则是将空白符之间的重复的字符折叠起来,再说清楚一些,我这里用下划线来表示这个特殊的空白符(a special blank character),它和空格(the space character)是不一样的。所以thequick之间有一个空格符,所以我要输出一个空格,通过把用空白符所分割的重复的字符折叠起来,然后我们就可以把这段序列折叠成"the q"。这样一来你的神经网络因为有很多这种重复的字符,和很多插入在其中的空白符(blank characters),所以最后我们得到的文本会短上很多。于是这句"the quick brown fox"包括空格一共有19个字符,在这样的情况下,通过允许神经网络有重复的字符和插入空白符使得它能强制输出1000个字符,甚至你可以输出1000个$y$值来表示这段19个字符长的输出。这篇论文来自于Alex Grace以及刚才提到的那些人。我所参与的深度语音识别系统项目就使用这种思想来构建有效的语音识别系统。

希望这能给你一个粗略的理解,理解语音识别模型是如何工作的:注意力模型是如何工作的,以及CTC模型是如何工作的,以及这两种不同的构建这些系统的方法。现今,在生产技术中,构建一个有效语音识别系统,是一项相当重要的工作,并且它需要很大的数据集,下节视频我想做的是告诉你如何构建一个触发字检测系统(a rigger word detection system),其中的关键字检测系统(keyword detection system)将会更加简单,它可以通过一个更简洁的数量更合理的数据来完成。所以我们下节课再见。

腾讯云服务器

相关推荐

阿里云服务器
关注微信
^