Kaldi(A1)语音识别原理

Ref

语音识别的原理 https://www.zhihu.com/question/20398418
HTK Book http://www.ee.columbia.edu/ln/LabROSA/doc/HTKBook21/HTKBook.html
如何用简单易懂的例子解释隐马尔可夫模型? https://www.zhihu.com/question/20962240/answer/33438846
《统计学习方法》第10章 隐马尔可夫模型

强烈建议先看完以上资料


语音识别的原理

语音识别的过程可以理解为找路:
一个朋友告诉你他从杭州站走到杭州东经过了水、桥、广场,想让你猜猜他走的是哪条路,你该怎么办呢?

那我们就找这些特征所对应的建筑吧,分别是公园、高架桥、娱乐广场,啊,在图上最可能的就是蓝色的这条线了! 于是我们就从朋友的特征描述得到了他的行走路径,这就相当于从音频得到了发出这些音频的文字,即语音识别。

Kaldi(A1)语音识别原理_第1张图片

上述过程有几个问题,包括

  • 这些特征对应的建筑有很多,水可以是公园也可以是池塘、湖、海等等;朋友也不可能先跑到火星再坐飞船到杭州东,所以我们找的时候是在较为可能的范围内找的,这对应了语音识别中的语言模型,它限定了我们语音识别的范围。
  • 包含上述水、桥、广场特征的路径有很多,我们需要将特征最可能对应的建筑给找出来,这对应了语音识别中的声学模型,它描述了我们发特定音对应某个单词的概率,例如我发音是 偷猫肉 ,显然,对应的单词是tomorrow的概率比tomato更大。

Observe值

在语音识别中,朋友告诉你的特征被称作Observe值,观测值,其提取的流程如下图所示


Kaldi(A1)语音识别原理_第2张图片
流程示意

音频波形 => (每一帧的)频域特征序列 => (每一帧的)Observe值

上图中这些圈圈是什么意思呢?

HMM:发音可能的路径

举一个具体的例子,比如我发了Hi这个单词(在计算机里面使用音素phone来表明这个单词是如何发音的,Hi对应于sil-h-ay-sil,sli指silence),下图为计算发音为sil-h-ay-h-ay-sil-h-ay-sil的概率

Kaldi(A1)语音识别原理_第3张图片

首先我们需要规定发音可能的路径,对Hi这个单词而言,发音只可能是 (sil-h)-(ay-sil)的组合,比如我把H拖得比较长,说的是HHHHHHi那就是 (sil-h)(sil-h)(sil-h)…-(ay-sil)啦,前面一长串的重复对应于上图中箭头指向自己,Hiiiiiiiii~~~同理。使用上图这种链式的 HMM就可以表示出这种发音的路径。真正的识别当然不止Hi这一条路径,还有Hello,Hey,Apple等等,是所有可能的状态路径的集合,语音识别就是从中找出一个对应于Observe序列最可能的状态路径出来(这里的 状态相当于找路中的 建筑)。那么怎么知道哪个是最可能的呢?这里先提出HMM相关的3个问题。

关于HMM的3个问题

问题1:已知模型和状态序列,求产生特定观测序列的概率

Kaldi(A1)语音识别原理_第4张图片
计算过程

解释一下上图中符号的含义:

  • π表示进入到这条路径的概率,朋友已经告诉你是从杭州站出发了,所以π=1
  • o表示观测值,即朋友告诉你的特征,“水”,“广场”等等;b(o)则代表这个特征属于某个建筑的概率,如在公园里出现水的概率比较大,则b公园(水)=0.8b公园(广场)=0.2
  • a则表示从一个状态走到下一个状态的概率,如公园之后更容易走到广场去,则a公园->广场=0.7

回到这个问题本身。最简单的,直接根据概率相乘计算;然后,其实这个直接算的过程可以优化,于是有了Forward Algorithm,向前算法,或者 Backward Algo,向后算法。后续的Baum-Welch Algo也会用到这个算法。

问题2:已知模型和观测序列,求这个观测序列对应的状态序列

相当于语音中的解码问题。最简单的,暴力破解,根据问题1算出所有状态序列产生这个观测序列的概率,找一个最大的。采用动态规划优化之后的算法为Viterbi Algo,维特比算法。

问题3:已知多个观测序列,求模型(即求模型的a b π参数)

若已知对应的状态序列,则为监督算法,根据频数进行估计。


Kaldi(A1)语音识别原理_第5张图片
监督学习

若并不知道对应的状态序列,则为无监督算法,Baum-Welch Algo。

GMM:特定Observe值对应于某一状态的概率b(o)

GMM对应于上图中的函数曲线b(o),是多个正态分布的叠加(如虚线所示),应用GMM进行计算的过程如下图所示(这里是问题1:已知模型和状态序列,求产生特定观测序列的概率):

Kaldi(A1)语音识别原理_第6张图片
计算过程

注意这里的0.7 0.4(就是a啦)对应于HMM部分中状态转移的概率(箭头上的概率),通过以上计算过程我们就能分别计算出Hi,Hello,Hey这些单词的概率来了,概率最大的就是识别出来的文本啦。
这里仅仅展示了Hey这一个单词的计算过程,而不同的单词概率密度函数( pdf)是不同的,如HTK Book里面的这张图所示:
Kaldi(A1)语音识别原理_第7张图片
不同的单词

针对所有待识别的单词需要都构建这样的一串函数(即图中的模型)然后才能选出最大概率的作为最终识别结果。
再来一个总体的图方便大家理解。
Kaldi(A1)语音识别原理_第8张图片
Yes对应的概率计算

HMM-GMM如何被构建出来?

以上过程有两个问题:

  • 路径是如何画出来的?
  • 函数是如何拟合出来的?

这里便对应问题3:已知多个观测序列,求模型,需要我们通过语料库里的语音进行训练,由Baum-Welch Algo得到整个模型的参数。它也是个EM算法,需要先设定一个初始值,HTK里面的做法是先将观测值均分,和整个句子的所有状态近似对应,计算出初始值,然后进行迭代得到更好的值,使在该模型下产生这个观测值的概率提高,最终状态值和观测值就能更好地对齐在一起(句子里面每个单词的状态对准到了相应的语音特征)。其中迭代优化的值包括π a b,还有一个中间参数Lj(t),他表示t时刻观测值对应于状态j的概率,这就和对齐alignment联系上啦。更详细的介绍参考HTK Book。

维特比(Viterbi)解码

当训练过程完成之后,要使用这个模型便对应问题2:已知模型和观测序列,求这个观测序列对应的状态序列,亦即已知wav文件对应的特征序列,求其对应的状态,而状态是单词的更小级别的展开,最终可以转换为单词实现语音识别。
Viterbi解码的算法如下图所示,

Kaldi(A1)语音识别原理_第9张图片
Viterbi算法

1代表开始的状态,6代表结束的状态,我们的任务就是沿着一条最可能发生的路径从1走到6,而路径上每个黑点的概率都是知道的,Viterbi算法便可以通过动态规划的方式找出这条道路。不过Kaldi里面有另外一种解码的方式,Lattice,这个后续再说。

总结

一张图作为收尾和下一章的开始:

Kaldi(A1)语音识别原理_第10张图片
HMM结构

b(o)特定观测值对应某一状态的概率不仅可以用GMM的方式计算,还可以通过DNN的方式,这就是声学模型。而Kaldi里用到的转移模型便是WFST,这又究竟是个什么呢?

你可能感兴趣的:(Kaldi(A1)语音识别原理)