自动语音识别鸟瞰


[In Progress…]

语音识别

语音识别简史

自动语音识别技术(Automatic Speech Recognition, ASR)主要是将人类语音中的词汇内容转换为计算机可读的输入,一般都是可以理解的文本内容,也有可能是二进制编码或者字符序列。狭义的语音识别技术即是将人类语音转成文本的技术。

GMM-HMM 时代

现代语音识别可以追溯到 1952 年,贝尔研究所 Davis 等人研制了世界上第一个能识别 10 个英文数字发音的实验系统,从此正式开启了语音识别的进程。

从上世纪 60 年代开始,CMU 的 Reddy 开始进行连续语音识别的开创性工作。但是这期间语音识别的技术进展非常缓慢,以至于 1969 年贝尔实验室的约翰•皮尔斯在一封公开信中将语音识别比作“将水转化为汽油、从海里提取金子、治疗癌症”等几乎不可能实现的事情。

上世纪 70 年代开始,计算机性能的大幅度提升,以及模式识别基础研究的发展,例如码本生成算法(LBG)和线性预测编码(LPC)的出现,推动了语音识别的发展。大规模的语音识别研究,在小词汇量、孤立词的识别方面取得了实质性的进展。IBM、贝尔实验室相继推出了实时的 PC 端孤立词识别系统。

到了 80 年代是语音识别快速发展的时期,其中两个关键技术是隐马尔科夫模型(HMM)的理论和应用趋于完善以及 N-Gram 语言模型的应用。研究的重点逐渐转从孤立词识别系统向大词汇量、非特定人连续语音识别系统发展。例如,李开复研发的 SPHINX 系统,是基于统计学原理开发的第一个“非特定人连续语音识别系统”。其核心框架就是用隐马尔科模型对语音的时序进行建模。

到了 90 年代,是语音识别基本成熟的时期,主要进展是语音识别声学模型的区分性训练准则和模型自适应方法的提出。这个时期剑桥语音识别组推出的 HTK 工具包对于促进语音识别的发展起到了很大的推动作用。此后语音识别发展很缓慢,主流的框架 GMM-HMM 趋于稳定,但是识别效果离实用化还有一定距离。

DNN-HMM 时代

语音识别的关键突破起始于 2006 年。这一年 Hinton 提出深度置信网络(DBN),促使了深度神经网络(Deep Neural Network,DNN)研究的复苏,掀起了深度学习的热潮。DNN 带来的好处是不再需要对语音数据分布进行假设,将相邻的语音帧拼接又包含了语音的时序结构信息,使得对于状态的分类概率有了明显提升,同时 DNN 还具有强大环境学习能力,可以提升对噪声和口音的鲁棒性。2009年,Hinton 以及他的学生将深度神经网络应用于语音的声学建模,在小词汇量连续语音识别数据库 TIMIT 上获得成功。2011 年,微软研究院俞栋、邓力等发表深度神经网络在语音识别上的应用文章,在大词汇量连续语音识别任务上获得突破。从此基于 GMM-HMM 的语音识别框架被打破,大量研究人员开始转向基于 DNN-HMM 的语音识别系统的研究。

端到端时代

2015年以后,由于“端到端”技术兴起,语音识别进入了百花齐放时代,语音界都在训练更深、更复杂的网络,同时利用端到端技术进一步大幅提升了语音识别的性能,直到2017年微软在 Swichboard 上达到词错误率 5.1%,从而让语音识别的准确性首次超越了人类,当然这是在一定限定条件下的实验结果,还不具有普遍代表性。

Historical Progress
图 1. 语音识别错误率的历史进程

语音识别另外两个技术部分:语言模型解码器,目前来看并没有太大的技术变化。

语言模型主流还是基于传统的 N-Gram 方法,虽然目前也有神经网络的语言模型的研究,但在实用中主要还是更多用于后处理纠错。比如滴滴出行的 asr 业务模型在解码过程中结合 LSTM 对候选序列重新排序来优化识别结果。解码器的核心指标是速度,业界大部分都是按照静态解码的方式进行,即将声学模型和语言模型构造成 WFST 网络,该网络包含了所有可能路径,解码就是在该空间进行搜索的过程。由于该理论相对成熟,更多的是工程优化的问题,所以不论是学术还是产业目前关注的较少。

基本框架

ASR
图 2. 语音识别的基本框架
无论是传统模型,还是当下火热的深度学习模型,主流的语音识别框架都没有脱离图 2 所示的基本思路。给定语音输入 $$Y$$, 框架试图找出最大可能性的文字序列 $$W$$,即求解以下公式:

W ∗ = arg max W P ( W ∣ Y ) W^* = \text{arg max}_W P(W|Y) W=arg maxWP(WY)

由贝叶斯法则,又可以得到:
W ∗ = arg max W P ( Y ∣ W ) P ( W ) / P ( Y ) W^* = \text{arg max}_W P(Y|W) P(W) / P(Y) W=arg maxWP(YW)P(W)/P(Y)

其中 P ( Y ) P(Y) P(Y) 表示出现当前语音的概率,这个值独立于文字序列的概率,可以在求解时忽略,进而得到
W ∗ ≈ arg max W P ( Y ∣ W ) P ( W ) W^* \approx \text{arg max}_W P(Y|W) P(W) Warg maxWP(YW)P(W)

其中第一部分表示给定一个文字序列出现这条音频的概率,它对应语音识别中的声学模型;第二部分表示出现这个文字序列的概率,它就是语音识别中的语言模型,其作用是根据语素等人类语言规律挑选同音字。直观的讲,声学模型负责挑选出与音频匹配的所有同音字,语言模型负责从所有同音字里挑出符合原句意思的字。

声学模型

粗略的讲,语音识别框架主要由声学模型、语言模型和解码器三部分构成。其中的两个技术部分:语言模型解码器,目前来看并没有太大的技术变化。语言模型主流仍然还是基于传统的 N-Gram 方法,虽然目前也有神经网络的语言模型的研究,但在实用中主要还是更多用于后处理纠错。比如滴滴出行的 asr 业务模型在解码过程中结合 LSTM 对候选序列重新排序来优化识别结果。解码器的核心指标是速度,业界大部分都是按照静态解码的方式进行,即将声学模型和语言模型构造成加权有限状态转换机(weighted finite-state transducers, wfst)网络,该网络包含了所有可能路径,解码就是在该空间进行搜索的过程。由于该理论相对成熟,更多的是工程优化的问题,所以不论是学术还是产业目前关注的较少。

而随着各种深度神经网络以及端到端技术的兴起,声学模型近几年的发展非常活跃,业界都纷纷发布自己新的声学模型结构,刷新各个数据库的识别记录。由于中文语音识别的复杂性,国内在声学模型的研究进展相对更快一些,主流方向是更深更复杂的神经网络技术融合端到端技术。

国内企业比较有代表性的几个声学模型:

  • 科大讯飞的深度全序列卷积神经网络(2018)。DFCNN 使用大量的卷积直接对整句语音信号进行建模,主要借鉴了图像识别的网络配置,每个卷积层使用小卷积核,并在多个卷积层之后再加上池化层,通过累积非常多卷积池化层对,从而可以看到更多的历史信息。
  • 阿里巴巴 Lower Frame Rate-Deep Feedforward Sequential Memory Networks(2018)。该模型将低帧率算法和 DFSMN 算法进行融合,语音识别错误率相比上一代技术降低20%,解码速度提升3倍。FSMN 通过在 FNN 的隐层添加一些可学习的记忆模块,从而可以有效的对语音的长时相关性进行建模。而 DFSMN 是通过跳转避免深层网络的梯度消失问题,可以训练出更深层的网络结构。
  • 百度截断注意力模型SMLTA。该模型是在 LSTM 和 CTC 的基础上引入了注意力机制来获取更大范围和更有层次的上下文信息。其中流式表示可以直接对语音进行一个小片段一个小片段的增量解码;多级表示堆叠多层注意力模型;截断则表示利用 CTC 模型的尖峰信息,把语音切割成一个一个小片段,注意力模型和解码可以在这些小片段上展开。在线语音识别率上,该模型比百度上一代 Deep Peak2 模型提升相对15%的性能。

在今天的主流语音识别系统中,声学模型是一个混合(hybrid)模型,它包括用于序列跳转的隐马尔可夫模型(HMM)和根据当前帧来预测状态的深度神经网络(深度神经网络代替了之前的 GMM)。

语言模型

语言模型的基石是 N-Gram 模型,N-Gram 是一种基于统计语言模型的算法。基本思想是将文本内容按照字节进行大小为 N 的滑动窗口操作,形成了长度是 N 的字节片段序列。每一个字节片段称为 gram,对所有 gram 的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键 gram 列表,也就是这个文本的向量特征空间,列表中的每一种 gram 就是一个特征向量维度。

该模型基于这样一种假设,第 N 个词的出现只与前面 N-1 个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计 N 个词同时出现的次数得到。常用的是二元的 Bi-Gram 和三元的 Tri-Gram。

解码

传统的语音识别解码都是建立在WFST的基础之上,它是将HMM、词典以及语言模型编译成一个网络。解码就是在这个WFST构造的动态网络空间中,找到最优的输出字符序列。搜索通常使用Viterbi算法,另外为了防止搜索空间爆炸,通常会采用剪枝算法,因此搜索得到的结果可能不是最优结果。在end-to-end的语音识别系统中,最简单的解码方法是beam search。尽管end-to-end的声学模型中已经包含了一个弱语言模型,但是利用额外的语言模型仍然能够提高识别性能,因此将传统的基于WFST的解码方式和Viterbi算法引入到end-to-end的语音识别系统中也是非常自然的。然而由于声学模型中弱语言模型的存在,解码可能不是最优的。文章[yuki Kanda, 2016]提出在解码的时候,需要将这个若语言模型减掉才能得到最优结果。

开源框架

HTK

HTK(HMM Tools Kit)是一个剑桥大学开发的专门用于建立和处理 HMM 的实验工具包,主要应用于语音识别领域,也可以应用于语音合成、字符识别和DNA排序等领域。HTK 经过剑桥大学、Entropic 公司及 Microsoft 公司的不断增强和改进,使其在语音识别领域处于世界领先水平,另外,HTK还是一套源代码开放的工具箱,其基于 ANSI C 的模块化设计方式可以方便地嵌入到用户系统中。

HTK 实际上并非严格意义上的开源,它的源码可以免费获取,用于科研或者教学,但不能再分发或者用于商业用处。 HTK 对后续的众多语音识别框架有很大影响, 比如 Kaldi 现今(2020.12.29)维护者 Daniel Povey 曾参与过 HTK 的开发。

HTK 目前已不再活跃,最近的一次更新时间是 2015.09,但流传下来的 HTK Book 仍值得参考,电子书(PDF)下载地址: https://www.researchgate.net/publication/236023819_The_HTK_book

Kaldi

当前,除了直接使用一些主流的深度学习框架实现语音识别以外,有很多用来实现语音识别的技术都是基于 Kaldi 进行开发的。Kaldi 是一个用 C++ 编写的语音识别工具包,它集成了包括数据预处理、声学特征提取、声学模型建模、声学解码、语言模型建模和并行计算与 Cuda 计算库等多种功能。对于多数传统的语音识别技术,Kaldi 均能胜任,而且在工业界也有广泛使用,比如阿里巴巴的 DFSMN 模型就是使用 Kaldi 实现的。Kaldi 提供了其他 ASR 工具不具备的可以在工业中使用的神经网络模型(DNN,TDNN,LSTM),这也是 Kaldi 在自动语音识别领域比较流行的重要原因之一。

Pytorch-Kaldi

Kaldi 是用 C++ 和各种脚本来实现的,它不是一个通用的深度学习框架。如果要使用神经网络来梯度 GMM 的声学模型,就需要用C++代码实现神经网络的训练与预测,这显然有些困难并且容易出错。PyTorch-Kaldi 应运而生,它可以利用 Kaldi 高效的特征提取、HMM 模型和基于 WFST 的解码器,同时也可又让用户使用熟悉的 PyTorch 来解决神经网络的训练和预测问题。

ASR
图 3. Pytorch-Kaidi 架构

PyTorch-Kaldi 的目的是作为 Kaldi 和 PyTorch 的一个桥梁,它能继承 Kaldi 的高效和 PyTorch 的灵活性。PyTorch-Kaldi 并不只是这两个工具的粘合剂,而且它还提供了用于构建现代语音识别系统的很多有用特性。比如,代码可以很容易的插入用户自定义的声学模型。此外,用户也可以利用预先实现的网络结果,通过简单的配置文件修改就可以实现不同的模型。PyTorch-Kaldi也支持多个特征和标签流的融合,使用复杂的网络结构。 它提供完善的文档并且可以在本地或者 HPC 集群上运行。

DeepSpeech

由 Mozilla 使用 Tensorflow 实现的 DeepSpeech 是一个基于百度 Deep Speech 研究论文 的开源语音识别框架。与以上两个框架不同的是,DeepSpeech 属于端到端自动语音识别的范畴。传统的 HMM-GMM 的语音识别系统非常复杂,有声学模型,语言模型,发音词典(模型),其中声学模型的训练又需要从 flat-start 到训练单因子再到三因子的模型。而 HMM-DNN 的模型只是把 GMM 替换成了一个DNN,其它的部分并没有变化。 端到端语音识别系统没有音素的概念,它的输入是语音的特征 (MFCC),输出即是字母。

注:网络上存在多个关于 DeepSpeech 的实现,比如这个基本 PaddlePaddle 平台的实现DeepSpeech2

参考资料

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值