美文网首页asr
Kaldi(A1)语音识别原理

Kaldi(A1)语音识别原理

作者: Seeker_zz | 来源:发表于2018-03-01 19:52 被阅读315次

    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章 隐马尔可夫模型

    强烈建议先看完以上资料


    语音识别的原理

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

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


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

    Observe值

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


    流程示意

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

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

    HMM:发音可能的路径

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


    首先我们需要规定发音可能的路径,对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:已知模型和状态序列,求产生特定观测序列的概率

    计算过程

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

    • π表示进入到这条路径的概率,朋友已经告诉你是从杭州站出发了,所以π=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 π参数)

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


    监督学习

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

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

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

    计算过程
    注意这里的0.7 0.4(就是a啦)对应于HMM部分中状态转移的概率(箭头上的概率),通过以上计算过程我们就能分别计算出Hi,Hello,Hey这些单词的概率来了,概率最大的就是识别出来的文本啦。
    这里仅仅展示了Hey这一个单词的计算过程,而不同的单词概率密度函数(pdf)是不同的,如HTK Book里面的这张图所示:
    不同的单词
    针对所有待识别的单词需要都构建这样的一串函数(即图中的模型)然后才能选出最大概率的作为最终识别结果。
    再来一个总体的图方便大家理解。
    Yes对应的概率计算

    HMM-GMM如何被构建出来?

    以上过程有两个问题:

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

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

    维特比(Viterbi)解码

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

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

    总结

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

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

    相关文章

      网友评论

        本文标题:Kaldi(A1)语音识别原理

        本文链接:https://www.haomeiwen.com/subject/joupoxtx.html