语音识别问题数学模型
语音识别系统的目的,是把语音转换成文字。具体来说,是输入一段语音信号,要找一个文字序列(由词或字组成),使得它与语音信号的匹配程度最高。这个匹配程度,一般是用概率表示的。用
X
X
X表示语音信号,
W
W
W表示文字序列,则要求解的是下面这个问题:
W
∗
=
arg
max
W
P
(
W
∣
X
)
W^{*}=\arg \max_{W}P(W|X)
W∗=argWmaxP(W∣X)
一般认为,语音是由文字产生的(可以理解成人们先想好要说的词,再把它们的音发出来),所以上式中条件概率的顺序就比较别扭了。没关系,我们有贝叶斯公式,可以把条件和结论拧过来:
W
∗
=
arg
max
W
P
(
X
∣
W
)
P
(
W
)
P
(
X
)
=
arg
max
W
P
(
X
∣
W
)
P
(
W
)
W^{*}=\arg \max_{W}\frac{P(X|W)P(W)}{P(X)}=\arg \max_{W}P(X|W)P(W)
W∗=argWmaxP(X)P(X∣W)P(W)=argWmaxP(X∣W)P(W)
第二步省略分母是因为我们要优化的是
W
W
W,而
P
(
X
)
P(X)
P(X)不含
W
W
W,是常数。
上面这个方程,就是语音识别里最核心的公式。可以这样形象地理解它:我们要找的 W W W,需要使得 P ( W ) P(W) P(W)和 P ( X ∣ W ) P(X|W) P(X∣W)都大。 P ( W ) P(W) P(W)表示一个文字序列本身的概率,也就是这一串词或字本身有多“像话”; P ( X ∣ W ) P(X|W) P(X∣W)表示给定文字后语音信号的概率,即这句话有多大的可能发成这串音。计算这两项的值,就是语言模型和声学模型各自的任务。
语言模型
语言模型一般利用链式法则,把一个句子的概率拆解成其中每个词的概率之积。设
W
W
W是由
w
1
,
w
2
,
⋯
,
w
n
w_1,w_2,\cdots,w_n
w1,w2,⋯,wn组成的,则
P
(
W
)
P(W)
P(W)可以拆成:
P
(
W
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
P
(
w
3
∣
w
1
,
w
2
)
⋯
P
(
w
n
∣
w
1
,
w
2
,
⋯
,
w
n
−
1
)
P(W)=P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)\cdots P(w_n|w_1,w_2,\cdots ,w_{n-1})
P(W)=P(w1)P(w2∣w1)P(w3∣w1,w2)⋯P(wn∣w1,w2,⋯,wn−1)
每一项都是在已知之前所有词的条件下,当前词的概率。
不过,当条件太长的时候,概率就不好估计了,所以最常见的做法是认为每个词的概率分布只依赖于历史中最后的若干个词。这样的语言模型称为n-gram模型,在n-gram模型中,每个词的概率分布只依赖于前面n-1个词。例如在bigram(bi-是2的前缀)模型中,是拆成 P ( W ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 2 ) ⋯ P ( w n ∣ w n − 1 ) P(W)=P(w_1)P(w_2|w_1)P(w_3|w_2)\cdots P(w_n|w_{n-1}) P(W)=P(w1)P(w2∣w1)P(w3∣w2)⋯P(wn∣wn−1),n-gram模型中的n越大,需要的训练数据就越多。一般的语音识别系统可以做到trigram(n=3);Google似乎可以做到n=7。
为了利用到历史中比较久远的信息,人们还创造了许多种其它的语言模型,例如基于神经网络的语言模型。由于训练数据量的限制,这些模型单独使用时性能一般并不好,需要跟n-gram模型结合使用。
声学模型
声学模型的任务是计算 P ( X ∣ W ) P(X|W) P(X∣W),即给定文字后,发出这段语音的概率。首先第一个问题就是:怎么才能知道每个单词应该发什么音呢?这就需要另一个模块,叫作词典(lexicon),它的作用就是把单词串转换成音素串。词典一般认为是跟声学模型、语言模型并列的模块。词典中会遇到一词多音的问题,但这里就不节外生枝了。
有了词典的帮助,声学模型就知道给定的文字串该依次发哪些音了。不过,为了计算语音与音素串的匹配程度,还需要知道每个音素的起止时间。这是通过动态规划算法来进行的,利用动态规划算法,可以高效地找到音素的分界点,使得每一段语音与音素的匹配程度(用概率表示)之积最大。实际使用的算法称为Viterbi算法,它不仅仅考虑了每一段语音与音素的匹配程度,还考虑了在各个音素之间转换的概率;后者是通过隐马尔可夫模型(HMM)估计出来的。(实际系统中使用的是比音素更小的单位,不过原理是一样的,也不展开了)
在求音素分界点的过程中,以及在有了分界点后计算 P ( X ∣ W ) P(X|W) P(X∣W)时,声学模型都需要知道怎样计算一个音素与一段语音信号的匹配程度。要做这件事,需要找到一种合适的表示语音信号的方法。一般是把语音信号分成许多帧,对于每一帧,通过傅里叶变换等一系列操作,把它转换成一个特征向量。最常用的特征是MFCC。从训练数据中,我们可以提取出大量的特征向量,以及它们对应的音素;利用这些数据,就可以训练从特征到音素的分类器。前些年最常用的分类器是高斯混合模型(GMM),它的大致原理是估计出每个音素的特征向量的分布,然后在识别阶段,计算每一帧的特征向量 x t x_t xt由相应音素 s i s_i si产生的概率 P ( x t ∣ s i ) P(x_t|s_i) P(xt∣si),把每一帧的概率相乘,就得到 P ( X ∣ W ) P(X|W) P(X∣W)。现在,神经网络渐渐火了起来,它可以直接给出 P ( s i ∣ x t ) P(s_i|x_t) P(si∣xt),用贝叶斯公式可以转换成 P ( x t ∣ s i ) P(x_t|s_i) P(xt∣si),再相乘得到。
从上面的叙述来看,求文字串、计算语言模型概率、求音素串、求音素分界点、计算声学模型概率几个步骤似乎是依次进行的。其实不然,因为文字串、音素分界点都有非常多种可能,枚举是不现实的。实际中,这几个步骤同时进行并互相制约,随时砍掉不够优的可能,最终在可接受的时间内求出最优解 W ∗ = arg max W P ( W ∣ X ) W^{*}=\arg \max_{W}P(W|X) W∗=argmaxWP(W∣X).
作者:王赟 Maigo
链接:https://www.zhihu.com/question/35833334/answer/67944671
来源:知乎