语音识别 之 语言模型,声学模型

声学模型是对声学、语音学、环境的变量、说话人性别、 口音等的差异的知识表示,

语言模型是对一组字序列构成的知识表示。

语言模型表示某一字序列发生的概率,一般采用链式法则,把一个句子的概率拆解成器中的每个词的概率之积。设W是由w1, w2,...,wn组成的,则P(W)可以拆成(由条件概率公式和乘法公式):

P(W) = P(w1)P(w2/w1)P(w3/w1,w2)...P(wn/w1,w2,..wn-1),  每一项都是在之前所有词的概率条件下,当前词的概率。

由马尔卡夫模型的思想,最常见的做法就是用N-元文法,即假定某一个字的输出只与前面N-1个字出现的概率有关系, 这种语言模型叫做 n-gram模型(一般n取3, 即t rigram),  这时候我们就可以这么表示:

 P(W) = P(w1)P(w2|w1)P(w3|w1,w2)P(w4| w1,w2,w3)...P(wn/wn-1,wn-2,...,w1)   #条件太长的时候,概率就不好估计了,三元文法只取前两个词

         = P(w1)P(w2|w1)P(w3|w1,w2)P(w4| w2,w3)...P(wn/wn-1,wn-2) 

对于其中的每一项条件概率都可以用贝叶斯公式求出, 在所有的语料中统计出相邻的字发生的概率,再统计出单个字出现的概率, 代入即可。 

声学模型的任务是计算P(X/W), 即给定文字之后发出这段语音的概率(最后利用贝叶斯,求P(X/W)是使用)。 首先第一问题: 怎么才能知道每个单词发什么音呢? 这就需要另外一个模块,叫做词典,看eesen的源码在数据准备阶段就是先求出词对应音素的dict, 它的作用就是把单词串转化成音素串,然后再求的语言模型和 训练声学模型(用lstm+ctc 训练声学模型).

有了dict的帮助,声学模型就知道给定的文字串该依次发哪些音了。不过为了计算语音跟音素串的匹配程度,还需要知道每个音素的起止时间。 这是利用动归来进行的,可以高效的找到音素的分界点,使得没一段语音与音素的匹配程度(用概率表示)之积最大。实际使用的算法称为viterbi算法,它不仅仅考虑了每一段语音和音素的匹配程度,还考虑了各个音素之间转换的概率(转换概率通过HMM估计) 实际中使用的比音素更小的单位,原理一样(不是很确定,值得是一帧数据(25ms)吗,一帧不到不到一个音素的长度?)

asr是自动语音识别技术,首先要听到,这就是声学模型,其次要写下来,就是语言模型。就是这么个大致原理吧。求文字串、计算语言模型概率、求音素串、求音素分界点、计算声学模型概率几个步骤似乎是依次进行的。其实不然,在实际编码过程中,因为文字串、音素分界点都有非常多种可能,枚举是不现实的。实际中,这几个步骤同时进行并互相制约,随时砍掉不够优的可能,最终在可接受的时间内求出最优解。

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(自然语言处理)