语音识别与隐马尔可夫模型(HMM)

 

目录

一、语音识别

二、隐马尔可夫模型

三、前向—后向算法

四、Baum-Welch算法

五、孤立词识别


       公元2035年,机器人在人类社会中充当着十分重要的角色,它们可以送快递,为人类提供家政服务,甚至帮主人可以遛狗……这是电影《机械公敌》中的场景,这要是放在十几年前,可能还是有点异想天开,但是现在,原先的很多设想都已经初步实现了,例如可以跟人对话的聊天机器人,某些酒店和餐厅里的服务机器人等等。MC君在这篇文章中会谈谈聊天机器人的一个非常重要的技术——语音识别,希望能用最浅显的语言解析语音识别的基本原理。

一、语音识别

       语音识别,其实可以理解为说话的逆过程,我们平常说话是怎么说的?脑子里先想好一段内容,然后通过声音表达出来,而语音识别就刚好相反,计算机通过分析一段声音,来推测这段声音的内容是什么。最基本的语音识别是孤立词识别,也就是每次只能识别一个词,我们接下来通过一个简单的例子来说一下孤立词识别的原理。

       假如我现在要做一台校园导航机器人,其中一个功能是要识别用户说出的地名,如教学楼、饭堂、音乐厅、体育馆等,这些地名就是一个个孤立词,我们需要设计一个算法来让计算机来识别这些孤立词的语音,怎么做呢?我们知道声音其实是一种波,在信息学里面声音就是信号,是可以用具体的数字表达的,如果按照时间顺序将语音分割成一小段一小段,那么一段语音就可以表示成一个信号串 O = (o_{1},o_{2},\cdots ,o_{T} )。那么,孤立词的语音识别问题可以理解为:给定一个信号串O,找出最可能与之匹配的孤立词 w_{i},写成概率的形式即:

                                                                      w = \underset{w_{i}}{argmax}P(w_{i}|O)

      那其实就是求每个孤立词 w_{i} 的条件概率P(w_{i}|O),这个概率似乎比较难计算,我们不妨利用贝叶斯公式进行一下转换:

                                                                     P(w_{i}|O)=\frac{P(O|w_{i})P(w_{i})}{P(O)}

      上式中,P(O)P(w_{i})很明显都是已知的,所以问题的关键就是求P(O|w_{i}),即给定一段信号O,求出O与孤立词 w_{i} 匹配的概率。那这个概率应该怎么求呢?这时候就要用到著名的隐马尔可夫模型(Hidden Markov Model),简称HMM

二、隐马尔可夫模型

       隐马尔可夫模型是关于序列的概率模型,前面所说的信号串O = ( o_{1},o_{2},\cdots ,o_{T} \right \})在这个模型中有个名字,叫做观测序列,顾名思义,也就是可以直接观测到的序列。既然有可观测的序列,自然就有不可观测的序列,HMM定义:观测序列中,任意时刻t的观测 o_{t} 对应着一个隐状态s_{t},这些隐状态合在一起就形成了状态序列S= ( s_{1},s_{2},\cdots ,s_{T} \right \}),所以这个模型叫做 隐”马尔可夫模型。举个具体的例子,我们说出一个词如“教学楼”,就形成了一段语音,这段语音每一时刻的信号就是o_{t},而其对应的隐状态s_{t}是观测不到的,它可以是“教学楼”这个词的音标:ji,ao,x,ue,l,ou,当然也可以是其他东西,其实我们也不需要知道这些隐状态具体是什么,只需要知道一点:任意时刻t的观测 o_{t} 跟隐状态 s_{t} 是一一对应的。

       所以现在回到刚才那个问题,求P(O|w_{i})。如果孤立词 w_{i} 对应的模型参数是\lambda _{i},那么P(O|w_{i})就可以写成P(O|\lambda _{i}),因为现在多了一个状态序列S,所以我们得想办法将S塞进P(O|\lambda _{i})里面,怎么办呢?这就需要用到边缘分布的概念,P(O|\lambda _{i})可以表达为以下式子:

                              P(O|\lambda _{i})=\sum_{S}^{ }P(O,S|\lambda _{i})=\sum_{S}^{ }P(o_{1},o_{2},\cdots ,o_{T} \right \},s_{1},s_{2},\cdots ,s_{T} |\lambda _{i})   

      上面这条长串的式子看起来就很复杂,所以为了把问题简单化,马尔可夫同志提出了两个假设:     

     (1)任意时刻t的观测o_{t}只与该时刻的状态s_{t}有关,与其他时刻的状态和观测无关(独立),即:

                                 P ( o_{t}|o_{1},s_{1},\cdots,o_{t-1},s_{t-1},s_{t},o_{t+1},s_{t+1},\cdots,o_{T},s_{T} \right \})=P ( o_{t}|s_{t} \right \})

     (2)任意时刻t的状态s_{t}只与前一个时刻的状态s_{t-1}有关,与其他时刻的状态和观测无关(独立),即:

                                              P ( s_{t}|o_{1},s_{1},o_{2},s_{2}\cdots,o_{t-1},s_{t-1} \right \})=P ( s_{t}|s_{t-1} \right \})

       有了以上两个假设,我们就可以把那条长串的式子写成下面这个样子(具体的推导比较简单,就不再赘述了):

                                               P(O|\lambda _{i})=\sum_{S}^{ }P(s_{1})\prod_{t=1}^{T}P(o_{t}\right \}|s_{t})\prod_{t=2}^{T}P(s_{t}\right \}|s_{t-1})             →1式

       细心的朋友可能会发现,等式左边的模型参数 \lambda _{i} 消失了,那是因为在等式右边的P(o_{t}\right \}|s_{t})P(s_{t}\right \}|s_{t-1})P(s_{1})就是模型参数,所以可以直接把\lambda _{i}去掉。所以,现在问题就变成了求P(o_{t}\right \}|s_{t})P(s_{t}\right \}|s_{t-1})P(s_{1})这三个参数,需要说明的是:o_{t}s_{t}都是随机变量,而并非具体的数值!所以要求这三个参数,必须知道o_{t}s_{t}所有可能取到的值,假设o_{t}s_{t}都是离散型随机变量,那么我们可以设Q是隐状态s_{t}一切可能取值的集合(共有N个取值);V是观测o_{t}一切可能取值的集合(共有M个取值),即:

                                             Q=\left \{ q_{1}, q_{2},\cdots ,q_{N}\right \},\;\, \, \, \, \, \, \, \, V=\left \{ v_{1}, v_{2},\cdots ,v_{M}\right \}

      我们先看P(s_{t}\right \}|s_{t-1}),因为s_{t-1}s_{t}的可能取值都有N个,那么P(s_{t}\right \}|s_{t-1})可以写成一个N\times N的矩阵

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值