快捷搜索:  汽车  科技

语音识别实现的技术路径(语音识别算法原理不完全归纳)

语音识别实现的技术路径(语音识别算法原理不完全归纳)而求最优 过程与 无关,因此有根据 Bayes 公式,我们常会以 字(Char) 或 词(word)来作为 Token,此时表示字序列或词序列,表示所有可能的 Token 序列。语音识别也可以看成是一个搜索任务,搜索的排序准则是序列后验概率最大,这样一个搜索过程我们称之为 ASR 的解码。传统 ASR 算法基于 Bayes 法则,将后验概率的求解分解成先验概率和修正系数(似然概率)的形式,从而将 ASR 系统模块化,并且引入了 WFST 来简化各模块的实现。

语音识别的研究历史悠久,出现了许多著名的算法和工具。从事语音算法工作两年期间,我在语音识别方向做了一点工作,对此有一些体会。面对诸多的算法如何学习掌握呢?我认为一个不错的方法是归纳不同算法的异同,形成体系。由于个人的知识有限,这里说的归纳也是不完全的归纳。但我相信,随着知识面不断拓展,个人的认知会逐渐从偏到全。

本文主要讨论如何从 ASR 的原始的优化目标出发,以一个较为统一的视角看待传统 ASR 算法和端到端 ASR 算法,各类算法的具体实现和训练优化留到以后文章再讨论。现代成熟的语音识别系统包含音频采集、前处理、识别、后处理等模块,本文关注的也仅仅是识别模块。

语音识别实现的技术路径(语音识别算法原理不完全归纳)(1)

语音识别 pipeline 本文关注点在于 ASR Model

本文目录 1. 语音识别问题形式化 2. 传统 ASR 算法原理 2.1 动态展开的解码 2.2 引入 WFST 的静态图解码 2.3 声学模型 2.3.1 基于 HMM 的声学模型 2.3.2 基于 CTC 的声学模型 2.4 语言模型 3. 端到端 ASR 算法原理 3.1 CTC-based E2E Models 3.2 RNN-Transducer、RNA、Neural Transducer 等 3.3 Attention-based E2E Models 3.4 引入了 WFST 的端到端算法 3.5 拓展思考 4. 总结 5. 参考资料1. 语音识别问题形式化

语音识别可以看做是语音内容理解的一个子任务,目的是获取一段语音中包含的文本内容。可以这样定义语音识别:根据特征帧序列,穷举所有可能的 Token 序列, 获取后验概率最大的序列 即

语音识别实现的技术路径(语音识别算法原理不完全归纳)(2)

我们常会以 字(Char) 词(word)来作为 Token,此时表示字序列或词序列,表示所有可能的 Token 序列。

语音识别也可以看成是一个搜索任务,搜索的排序准则是序列后验概率最大,这样一个搜索过程我们称之为 ASR 的解码

2. 传统 ASR 算法原理

传统 ASR 算法基于 Bayes 法则,将后验概率的求解分解成先验概率和修正系数(似然概率)的形式,从而将 ASR 系统模块化,并且引入了 WFST 来简化各模块的实现。

根据 Bayes 公式

语音识别实现的技术路径(语音识别算法原理不完全归纳)(3)

而求最优 过程与 无关,因此有

语音识别实现的技术路径(语音识别算法原理不完全归纳)(4)

在传统 ASR 算法中, 建模似然概率 的模型称为声学模型,先验概率 则由语言模型建模。为了让系统更加模块化,可以进一步细化建模单元为音节/音素。此时需要增加词典模型来建模 ,优化目标转化为:

语音识别实现的技术路径(语音识别算法原理不完全归纳)(5)

其中 表示序列 的所有可能发音序列。在工程实现上,我们可以用最大概率的一个发音序列来近似上式,并取 log,即

语音识别实现的技术路径(语音识别算法原理不完全归纳)(6)

2.1 动态展开的解码

上式的一种穷举方法是分步骤求解,对于每个序列 ,根据语言模型求 ,然后根据词典模型求最大概率的序列 的得分 ,再声学模型得到该发音序列 的声学得分 ,汇总得分后取得分最高的一个序列即为 。

语音识别实现的技术路径(语音识别算法原理不完全归纳)(7)

另一种穷举方式是遍历每一个发音序列 ,先根据声学模型计算声学得分 ,然后获取发音对应的 Token 序列与得分 ,最后每个序列得分 。

我们刚才说到,这里声学模型的建模单元是发音,因此也相当于额外假设了每一帧输入 可以描述一个发音 ,但是对于每一个Token ,需要多帧 才能描述,并且每个人再说同一个字词的时候语速都不一样,因此这个长度 无法确定,第一种穷举方式在连续语音识别实现起来过于复杂,几乎是不可行的,只有在孤立词、关键词检测等 长度固定、数量有限的任务里还可以考虑考虑这种方法。

在传统 ASR 算法里用的是第二种穷举方法。由于输入序列 是按时间逐个输入的,随着 的不断输入,我们保留的中间结果也逐渐增多,相关的 序列不断地进行树状扩展,因此这种遍历方式可以称之为动态展开的解码。需要注意的是穷举的方式,暴力穷举的复杂度是指数级。幸好在 ASR 的解码过程中,当前时刻的结果可以认为只和之前时刻相关,可以通过动态规划的方式来穷举,可以把时间复杂度降低到多项式级别。

2.2 引入 WFST 的静态图解码

是否可以进一步简化、优化上述的解码过程呢?我们的前辈引入了一个相当高级的工具:加权有限状态转换机(Weighted Finite-State Transducer WFST)[1]。我们把要优化的目标函数做一点修改,

语音识别实现的技术路径(语音识别算法原理不完全归纳)(8)

可以看到, WFST 视角下的 ASR 是一个从输入音频特征帧序列 到词序列 的一个转换任务。ASR 系统中的每一个模块可以用不同的 WFST 来表示,其信息可以编码到 WFST 的跳转弧上。声学模型对应的 WFST 把声学模型建模单元的 id 序列转化为对应的发音序列 ,得分用跳转弧权重表示 。词典模型对应的 WFST 把发音单元 id 序列转化为 Token 序列, 。语言模型对应的 WFST 主要编码词序列的语言得分, 。

之前说的几个模块动态展开的穷举,通过 WFST 的合并操作(Compose)可以简化为单一的 WFST 的静态图搜索,可以说在很大程度上简化了 ASR 的解码。同时,运用 WFST 的一些优化操作,可以优化搜索路径,让这个搜索过程效率更高。

实际上这里代表描述了声学模型得分、声学建模单元与发音之间的关联,如果采用 HMM 声学模型则,如果采用 CTC-based 声学模型,则。其中和编码的都只是声学建模单元与发音之间的关联。

那 中的声学得分在哪呢?在解码过程中, (在 kaldi 中以 Lattice 形式存储)的跳转弧权重包含两个值,一个是预留的"声学得分" acoustic_cost,由声学模型计算并动态赋值。另一个是由词典得分、语言得分经过 FST Compose 之后合并成了静态的"图得分" graph_cost。

2.3 声学模型

2.3.1 基于 HMM 的声学模型

目前 kaldi [14] 是采用隐马尔可夫模型(HMM)[2] 来实现声学模型,并且 kaldi 的声学模型建模的是比音素更细粒度的单元,即 HMM 状态。不同音素可以用不同的 HMM 来描述,每一个 HMM 都包含指定数量的状态。采用 HMM 作为声学模型,对于某一个观测序列 ,其似然概率的计算方式为:

语音识别实现的技术路径(语音识别算法原理不完全归纳)(9)

其中 表示 HMM 拓扑中所有可能的状态序列, 表示以 为初始状态的概率, 表示从状态 到状态 的转移概率, 为状态 发射概率。

此时 ASR 总的优化目标可以表示为

语音识别实现的技术路径(语音识别算法原理不完全归纳)(10)

其中,状态之间的跳转关系通过 WFST 表示,也就是 ,初始概率、转移概率以权重编码在跳转弧上,最终成为图得分 graph_cost 的一部分。

我们通常看到的 GMM-HMM、DNN-HMM 里的 GMM、DNN 建模的是发射概率,解码过程中动态赋值的也是发射概率(转移概率等已经编码成了图得分了,这个设计很好地抽象出了声学得分的接口)。其中 GMM 通直接过统计数据分布的方式建模,DNN 对状态后验概率 建模,并通过以下公式近似得到 HMM 发射概率

语音识别实现的技术路径(语音识别算法原理不完全归纳)(11)

另外,在实现上,常常考虑发音单元的上下文关联/协同发音,把建模的发音单元从上下文无关的单音素(Context-Independent Phoneme CI-Phone),更改为上下文相关音素 (Context-Dependent Phoneme CD-Phone),并增加一个上下文音素转换为单音素的 WFST。

语音识别实现的技术路径(语音识别算法原理不完全归纳)(12)

因此我们最常见的传统 ASR 系统架构如下图所示:

语音识别实现的技术路径(语音识别算法原理不完全归纳)(13)

2.3.2 基于 CTC 的声学模型

CTC 拓扑可以看作是一种特殊的 HMM 结构,不过由于其特殊性,这里单独列出来讨论。例如清华大学提出的 CTC-CRF 模型,建模直接为单音素 ,并且用一个 WFST 来描述音素、blank之间的跳转关系。

语音识别实现的技术路径(语音识别算法原理不完全归纳)(14)

CTC-CRF 中的 CTC 拓扑结构[4]

语音识别实现的技术路径(语音识别算法原理不完全归纳)(15)

不同的 HMM,CTC 可以看作特殊的 HMM [5]

2.4 语言模型

ASR 中用到的语言模型在形式上较简单,建模的是根据历史 Token 预测下一个 Token 的概率。常用的有 RNN 语言模型和 n-gram 语言模型,建模方式分别为:

语音识别实现的技术路径(语音识别算法原理不完全归纳)(16)

3. 端到端 ASR 算法原理

端到端 ASR 算法直接求解后验概率

语音识别实现的技术路径(语音识别算法原理不完全归纳)(17)

即:序列整体的后验概率可以通过 Token 的后验概率累积得到。但这里也做了简化,假设当前 Token 只依赖于之前出现的 Token ,这个假设在我看来是合理的。

从这个观点出发看不同的端到端算法。

3.1 CTC-based E2E 模型

基于 CTC [6] 的模型,通过引入 blank Token 实现软对齐,并且假设每一帧之间的 Token 相互独立,

语音识别实现的技术路径(语音识别算法原理不完全归纳)(18)

序列 CAT 的所有可能的软对齐路径

可以得到:

语音识别实现的技术路径(语音识别算法原理不完全归纳)(19)

其中 是将软对齐序列转换为最终序列的操作,包含去除相邻重复 Token 和去除 blank, 是序列 的所有可能的对齐序列, 是其中一个序列。

上述是针对某一个已知序列 的后验概率,但是在解码的时候, 是待求解的未知量,求解的方法是先求最大概率的对齐序列 ,再转换得到 。

语音识别实现的技术路径(语音识别算法原理不完全归纳)(20)

3.2 RNN-Transducer、RNA、Neural Transducer 等

这里讨论一下 RNNT 和CTC-based Models 的区别。

首先,RNNT 也包含软对齐,但是它和 CTC-based Models 对齐的方式/topo 不同;

语音识别实现的技术路径(语音识别算法原理不完全归纳)(21)

不同算法的软对齐的状态机表示[7]

其次,RNNT 引入了语言模型和一个 JointNet 用于融合声学和语言得分,其解码过程的计算可以写作下式

语音识别实现的技术路径(语音识别算法原理不完全归纳)(22)

式中的 t 是解码过程中动态确定的,因为 RNNT 设计的解码算法中,一帧输入是可以对应多个输出的。式中每一个 Token 的后验概率计算过程为:先由 Encoder(声学模型)、PredictorNet(语言模型)独立计算得到声学特征和语言特征:

语音识别实现的技术路径(语音识别算法原理不完全归纳)(23)

最后由 JointNet 融合两者得到最终结果

语音识别实现的技术路径(语音识别算法原理不完全归纳)(24)

RNNT 通过 PreditorNet 和 JointNet 引入了 Token 之间的相关性,可以看到,RNNT 的优化目标和 ASR 最初的目标是很接近的,这也是它优于 CTC-based Models 的内在原因。

RNA、Neural Transducer 这两种模型[8]是基于 RNNT 的:

  • RNA 放弃不确定的 ,假设每一帧只输出一个 Token 。
  • Neural Transducer 则以特征帧序列 window 作为输入,而不是一帧一帧输入,每接受一个 window ,依然可以对应多个输出。
3.3 Attention-based E2E Models

Attention-based 模型的常见架构为 Encoder-Decoder ,例如 LAS[9]、Transformer [10] 等。

语音识别实现的技术路径(语音识别算法原理不完全归纳)(25)

语音识别实现的技术路径(语音识别算法原理不完全归纳)(26)

Encoder 用于提取音频的高层次特征

Decoder 有两种不同的模式,自回归(AutoRegressive)模式的根据高层特征和历史输出进行解码

语音识别实现的技术路径(语音识别算法原理不完全归纳)(27)

非自回归(Non-AutoRegressive)的模型需要对 Encoder 的输出做进一步处理得到初步结果,Decoder 大多只作为一个纠错或重打分模块,这里暂时不展开叙述。

我们看自回归的解码计算过程,可以归纳为

语音识别实现的技术路径(语音识别算法原理不完全归纳)(28)

上式中,每一项 由 Decoder 直接建模,比 RNNT 更简洁。这与我们描述的端到端 ASR 最初的优化目标如出一辙,因此我认为这一类模型在理论上最好地阐释了“端到端”概念的。

However unlike the RNN transducer in which the encoder and the prediction network are modeled independently and combined in the joint network an attention-based model uses a single decoder to produce a distribution over the labels conditioned on the full sequence of previous predictions and the acoustics.[11]

在具体实现上,Encoder,Decoder 可以采取不同的模型结构。LAS 模型采用了 BLSTM 实现 Encoder LSTM 实现 Decoder。近几年,出现更多的是采用基于自注意力机制的网络结构实现 Encoder Decoder,现在最有名气的莫过于 Transformer 了。

3.4 引入了 WFST 的端到端算法

端到端 ASR 模型引入语言模型的方式有几种,包括在解码过程中加入语言得分的 On-the-fly Rescore 的方式、对 n-best 结果 Rescore 的方式、以及采用 WFST 解码图的方式。

目前开源的项目中,采用 WFST 解码图的有 ESSEN[13]、WeNet[12],它把 Ngram 语言模型得分、词典(字->词)得分、以及 CTC topo 都编码在的跳转弧上,声学模型的作用是提供声学得分给解码,这很好地借鉴了传统 ASR 解码器,区别在于声学模型的建模单元不再是状态或音素,而是更大粒度的字、子词。其优化过程可以写作

语音识别实现的技术路径(语音识别算法原理不完全归纳)(29)

式中指代 Token 序列,如字序列、子词序列等,描述不同 Token 之间的跳转方式,上面介绍的 CTC-CRF 类似。

3.5 拓展思考

端到端 ASR 算法的解码也可以用 WFST 搜索的形式来描述,但原始的搜索图是没有经过优化的,其结构仅仅类似于。从这个角度看,传统 ASR 和端到端 ASR 的解码都可以用 WFST 框架来描述,可见 WFST 确实是一个强大的工具。

4. 总结

围绕求解最大后验概率的问题,传统 ASR 算法将求解过程分解成多个步骤,将系统模块化后分别优化,各模块任务明确;端到端 ASR 算法则直接求解后验概率,系统更加简洁。不同的算法包含了不同的前提假设,前提不同,那么算法的适用场景就会有所区别,因此不能简单地说孰优孰劣。

在文章末尾,我也提到,不同的 ASR 算法在实现上都可以用同一个框架来描述,是否可以说,众多的 ASR 算法从同一个起点出发,走不同的路,最终又殊途同归了呢?

参考资料
  1. WFST: https://cs.nyu.edu/~mohri/postscript/csl01.pdf
  2. HMM: https://cogsci.ucsd.edu/~ajyu/Readings/Tutorials/hmm.pdf
  3. 传统ASR架构: 3人半年打造语音识别引擎--58同城语音识别自研之路
  4. 清华大学CTC-CRF: http://oa.ee.tsinghua.edu.cn/~ouzhijian/pdf/ctc-crf.pdf
  5. Chain topo: http://www.danielpovey.com/files/2018_interspeech_end2end.pdf
  6. CTC: Sequence Modeling with CTC
  7. e2e topo: HMM CTC和RNN-Transducer对齐方式的差异
  8. 李宏毅 e2e: https://zhuanlan.zhihu.com/p/130899095
  9. LAS 模型: https://arxiv.org/abs/1508.01211v2
  10. Transformer: https://arxiv.org/abs/1706.03762v5
  11. Google e2e: https://www.isca-speech.org/archive/Interspeech_2017/pdfs/0233.PDF
  12. WeNet: wenet-e2e/wenet
  13. ESSEN: srvk/eesen
  14. Kaldi: kaldi-asr/kaldi

猜您喜欢: