您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

语音识别算法原理不完全归纳

时间:2021-08-11 10:05:37  来源:  作者:语音之家

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

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

语音识别算法原理不完全归纳

语音识别 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 序列, 获取后验概率最大的序列, 即

语音识别算法原理不完全归纳

 

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

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

2. 传统 ASR 算法原理

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

根据 Bayes 公式

语音识别算法原理不完全归纳

 

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

语音识别算法原理不完全归纳

 

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

语音识别算法原理不完全归纳

 

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

语音识别算法原理不完全归纳

 

2.1 动态展开的解码

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

语音识别算法原理不完全归纳

 

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

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

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

2.2 引入 WFST 的静态图解码

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

语音识别算法原理不完全归纳

 

可以看到, 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 作为声学模型,对于某一个观测序列  ,其似然概率的计算方式为:

语音识别算法原理不完全归纳

 

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

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

语音识别算法原理不完全归纳

 

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

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

语音识别算法原理不完全归纳

 

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

语音识别算法原理不完全归纳

 

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

语音识别算法原理不完全归纳

 

2.3.2 基于 CTC 的声学模型

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

语音识别算法原理不完全归纳

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


语音识别算法原理不完全归纳

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

2.4 语言模型

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

语音识别算法原理不完全归纳

 

3. 端到端 ASR 算法原理

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

语音识别算法原理不完全归纳

 

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

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

 

3.1 CTC-based E2E 模型

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

语音识别算法原理不完全归纳

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

可以得到:

语音识别算法原理不完全归纳

 

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

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

语音识别算法原理不完全归纳

 

3.2 RNN-Transducer、RNA、Neural Transducer 等

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

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

语音识别算法原理不完全归纳

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

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

语音识别算法原理不完全归纳

 

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

语音识别算法原理不完全归纳

 

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

语音识别算法原理不完全归纳

 

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] 等。

语音识别算法原理不完全归纳

 


语音识别算法原理不完全归纳

 

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

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

语音识别算法原理不完全归纳

 

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

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

语音识别算法原理不完全归纳

 

上式中,每一项  由 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 解码器,区别在于声学模型的建模单元不再是状态或音素,而是更大粒度的字、子词。其优化过程可以写作

语音识别算法原理不完全归纳

 

式中指代 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


Tags:语音识别算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
语音识别的研究历史悠久,出现了许多著名的算法和工具。从事语音算法工作两年期间,我在语音识别方向做了一点工作,对此有一些体会。面对诸多的算法如何学习掌握呢?我认为一个不错...【详细内容】
2021-08-11  Tags: 语音识别算法  点击:(76)  评论:(0)  加入收藏
如上图,我们通过微信发送了一段语音,在对语音进行转文字时。语音识别引擎首先会将把这段语音进行分帧(切分成若干小段),然后利用声学模型将提取的每一帧的声学特征识别为一个个...【详细内容】
2020-12-23  Tags: 语音识别算法  点击:(419)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(9)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(19)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(13)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(37)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条