“安静!吵到我用Hey, Github了”:AI语音识别的进展
发布时间:2022-11-14 07:00
摘 要
语音识别往往是人机交互的初始步骤,是将人类的自然语言转化为计算机可以读取的内容,一般就是人类也可以理解的文本,当然也允许其他的形式。传统的语音识别和语音合成一样,涉及到语言学、声学、数字信号处理等多门科学技术,是一项复杂的系统性工程。而人工智能的发展也大大提升了语音识别的准确性和易开发性,使得这项诞生已经半个世纪的技术在实际中得到了普遍的认可和广泛的应用。在之前的“‘Hello, world!’,说出口没那么容易”系列文章里我们分享了当前利用AI进行语音合成的关键步骤和做法,这次我们将聚焦其中的开端,也就是语音识别背后的奥秘。
背景介绍
大家在coding感到疲惫时候可能想过,要是能动动嘴代码自动来就好了。没错,现在Github也支持语音操作了,只要大吼一声“Hey, Github!”,伴随着你说出的一系列自然的语音命令,一行行美丽的代码就出现在你的面前,见下图,当然前提是别吵到你身边的小伙伴。这里Github不是简单的将你的语音识别出来并放在屏幕上,而是经过了更复杂的处理,使得很多时候你不需要记住某些代码的具体形式,你只要记得有有这样的操作就可以了,Github会自动给你写好正确的代码。
图片来源:https://githubnext.com/projects/hey-github
当然,再复杂的基于语音的人机交互系统目前都基于关键的几个步骤,即语音识别,自然语言处理,语音合成等。这次我们将讨论其中的第一步,也就是语音识别的进化史以及当代语音合成的经典算法。
语音识别,从0到1
语音识别,即自动语音识别(Automated Speech Recoginition, ASR),是指将人类的自然语言转化为计算机可以读取的内容,一般就是人类也可以理解的文本,当然也允许其他的形式,比如二进制编码。狭义来说,我们一般指的是语音到文本的转换,即Speech to Text (STT)。
最早的语音识别要追溯到1952年,在著名的贝尔实验室里,人们管这一刚刚诞生的技术起了个名字叫“Audrey”[1],它的功能极其有限——仅能识别人们说出的数字。在这之后的1960年代,由IBM的工程师打造的新技术“Shoebox”[2],可以识别算数命令,当然也可以识别数字。
到了70年代,一个全新的ASR模型被发明了出来,它就是著名的隐马尔可夫模型(Hidden Markov Model, HMM) [3]。HMM是一种关于时间序列的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态序列,在由这一序列生成观测序列。简而言之,这个ASR语音模型使用概率函数来转录它所决定的正确单词。通过隐马尔可夫模型,研究人员不再试图让计算机模仿人类理解语言的方式,而是开始使用统计模型让计算机解释语音[4]。尽管最初的技术效率不高,也不准确,但目前使用的ASR技术中,仍有相当一部分来自于这一原始模型。
这个创新使得语音识别在90年代开始被真正的应用,尽管那个时候这一技术仍然成本仍然很高,但到了2000年以后随着各种成本的不断降低它终于开始普及起来。
尽管基于隐马尔可夫模型的语音识别方法各式各样,但始终躲不开的一个问题是输入语音与输出文本的强制对齐(force alignment)问题。强制对齐简单来说就是需要对语音片段确定该片段中特定单词(音素)出现的时间点,而自动化实现强制对齐的精度并不高,因此这往往需要大量的人力来协助实现。这一困难,加上总体精度还不够高,每个模型需要单独训练等缺点,传统的语音识别模型仍然有较多缺陷。
端到端语音识别模型
所谓端到端语音识别模型其实主要解决的就是上述的语音与文本的强制对齐问题,而不是强调模型本身。端到端模型使得人们可以直接将一段语音和对应的文本输入给模型做训练,而无需强制对齐。尽管机器学习和深度学习技术在端到端技术出现前已经用在包含隐马尔可夫模型的混合模型中并提升了模型效果,但直到端到端的模型训练成为可能,人们才得以将深度学习模型进行大量的高精度的训练,从而大大提升了模型的精度。
一个典型的端到端的语音识别模型通常含有如下主要结构,包括前端特征提取器,CTC分支和attention分支。要实现语音转文本的功能,这三个结构并不都是必须的。前端特征提取器可以减少计算开销,提升识别效果,而CTC分支和attention分支有其中一条即可实现语音识别的基本功能。
图片来源:https://zhuanlan.zhihu.com/p/536647952
其中前端特征提取器通常由全连接和含有大于1的stride的卷积层组成,用于降低之后attention层的计算开销。
CTC分支则接收attention编码器的输出特征作为输入。它通过模型中引入空文字字符,在使用由全连接层等构成的网络输出文字预测后进行删除空文字字符和合并连续出现的相同字符等规整操作,最终产生合理长度的文字预测。
CTC分支对于文字的预测缺少上下文的关联信息,而Attention分支则解决了这一问题。它以文本作为输入,同时接收解码器输出的特征用于cross-attention操作。推理时先给Attention分支输入一个起始符,通过起始符产生第一个字符输出,再不断将新的输出输入回Attention分支,迭代产生文本。训练时为了还原这一迭代过程,需要在分支内进行self-attention操作时对于attention matrix添加下三角矩阵mask,使得每个输入的字符只能与之前已经产生的字符做attention计算,而不能与未来的字符发生关联,保证了和推理的逻辑的一致性。
端到端ASR训练及演化
在端到端语音识别模型中,CTC方法可以消除强制对齐。CTC方法在意的是模型给出的文本预测是否和真实的文本相近,而不关心预测的文本在序列山是否和输入的序列完全对齐。为了做到这一点,它引入了blank空字符,对于一段语音,CTC允许模型给出包含大量blank的预测,它会去掉这些blank以及相邻的重复预测,最后输出处理后的字符与对应文本做比较。在处理的过程中CTC方法会有多种路径产生与对应文本相同的结果,如下图所示,x1~x6是由编码器模型传递过来的预测结果,CTC解码器会寻找所有会产生正确结果的的中间路径,并且它会将这些所有正确路径的概率求和作为这次预测正确的最终概率。这一做的好处就是它要求语音识别模型本身产生与对应文本尽可能“相近”的预测而非在时序上严格对应的精确预测,因而人们可以更自由地利用深度学习技术设计和训练相对简洁的大模型而不依赖于对语音和文本的各式各样基于该领域知识的复杂处理。
CTC 解码方法[4]
图片来源:https://distill.pub/2017/ctc/
CTC在端到端语音识别中起到了巨大的作用,但它仍然包含一个不合理的假设,即标签之间相互独立,这无法体现语言系统天然存在的上下文关联。而RNN-Transducer结构则可以弥补这一问题。
RNN-Transducer与CTC的不同结构[4]
图片来源:https://distill.pub/2017/ctc/
RNN-Transducer方法与CTC有很多相似之处,比如它也引入了blank符号,也计算了所有可能得到正确文本结果的概率和,但它的生成文本的路径搜寻方法和所依赖的搜寻概率计算方法都很不一样。由上图可以看到,它具有一个相对复杂的结构,包含了预测网络(Prediction Network),编码器(Encoder)和一个特殊的联合网络(Joint Network)。其中编码器接收自然语音,编码出隐变量后,要和上一次网络的输出字符经过预测网络产生的中间变量做联合,再产生当前的字符预测,这样就引入了文本的上下文关联性。
作为可以解决强制对齐问题的另一种算法,RNN-Transducer当然也定义了一种“软对齐”的decoding方式,这一方式十分特别:每当有一个时间步的语音信号x输入后,模型都会产生一个字符输出,然后在下一次运算中仍然使用刚刚时间步的语音信号x,此时由预测网络接收到的字符当然已经是刚刚产生的新字符了,而网络会试图从旧的语音信号x和新的字符输入y中再次产生下一个新的字符y’,直到产生一个空字符“-”为止。一旦产生了空字符,算法就会读取下一个时间步的新的输入x‘,然后继续这种循环。这种特别的方式很容易让人想到一个事实就是RNN-Transducer可以用在输出内容比输入内容长度更长的情形,这在CTC方法中是做不到的。尽管在语音识别里这一场景不太可能出现,但这一特性使得RNN-Transducer相较于CTC可以被用在更广泛的任务中。
此外端到端ASR方法还包括LAS等,此处不再赘述。
端到端语音识别模型的推理
以上简单介绍了几种典型的端到端语音识别模型的总体做法,强调了训练时它们如何将输入语音和标签文本对应上。而这些模型在推理时又是怎样的呢?
例如对于上述的CTC分支来说,一种最容易的做法就是在任何时刻都采用当前预测概率最大的结果,一次连续的搜索就可以得到CTC方法处理前的文本,然后使用CTC的方法去掉空字符和重复字符后就完成了文本输出。这样做的计算代价很小,但显然会带来很强的局部最优效应,使得最后的识别正确率不佳。
一种容易想到的改进方法叫做集束搜索(beam search)。由于要找到真正的全局最优解需要的计算代价太大,在每次搜索时,我们可以折中保留概率最高的数个中间结果,这一数值叫做beam size,设为N,基于这些结果做下一次的预测,由每个结果预测出的下一次的内容同样保留概率最高的N个,这样我们就有了NxN个中间结果,再从NxN个结果中全局找出前N个结果,完成该步的推理,依次类推,如下图所示。
集束搜索[4]
图片来源:https://distill.pub/2017/ctc/
这里图中存在的一个问题是,在有限的“宝贵”集束中,有一些可能是重复的,比如图中的epsilon代表之前我们提到的“blank”特殊字符,在后续的处理中是需要直接去掉的,因此上方的两条路径本质上是一样的,浪费了本就不多的路径数。对于这个问题可以采用前缀集束搜索(prefix beam search)。如下图所示,对于beam size=3的情形,在T=2时刻大的三个蓝色节点会向后推理产生9条路径,与普通集束搜索不同的是,这里在这9条路径中寻找最佳的3条的时候会先将按CTC方法规整后内容相同的路径做合并(如上方的3条路径),作为1条路径合并入下次的结果中,同时这条合并后的路径的概率分数也要做相应的叠加,这样一来就使得集束所涵盖的搜索空间进一步扩大。
前缀集束搜索[4]
图片来源:https://distill.pub/2017/ctc/
小结
结合深度学习技术的端到端的语音识别克服了传统方法中的语音与文本的强制对齐问题,也避免了传统方法对于声学模型和语言模型的依赖,依靠当前算力与数据集的优势大大提升了语音识别的精度与速度,使得语音识别的应用达到了前所未有的广泛程度。这里我们介绍了传统方法的演进和端到端方法的总体架构,但事实上端到端方法的演进和变化也异常丰富,下次我们会以一些典型例子介绍其中的具体实现,敬请期待。
参考文献
[1] Juang, B. H.; Rabiner, Lawrence R. "Automatic speech recognition–a brief history of the technology development"
[2] Melanie Pinola (2 November 2011). "Speech Recognition Through the Decades: How We Ended Up With Siri". PC World. Retrieved 22 October 2018.
[3] "First-Hand:The Hidden Markov Model – Engineering and Technology History Wiki". ethw.org. 12 January 2015. Archived from the original on 3 April 2018. Retrieved 1 May 2018.
[4] https://distill.pub/2017/ctc/
上一个: 语言模型的顶梁柱:Transformer, GPT, BERT
下一个: 由简入繁探究机器视觉中的数据增强(下)
近期文章
通用AI模型的未来:深度强化学习(deep reinforcement learning)
2023-05-08
2023-04-24