语音识别过程就是输入一段语音信号,找到一串文字(字或词)序列的过程,
语音输入
O =o1,o2,o3,...,ot
对应的标注
W =w1,w2,w3,...,wn
这个过程一般用概率来表示,用O表示语音信号,用W表示文字序列,则是要解决下面这个问题:
由贝叶斯公式
展开,可得
由于
P(O|W )P(W ) /
P(O)
是对每个句子进行计算的,而对每个句子来说
P
(
O
) 是不变的,
所以可以改写成如下
即:
其中P(O|W )
称做观测最大释然,由声学模型计算可得
其中P(w)称做先验概率,由语言模型模型计算可得
综上所述,语音识别就是解码(decoding)过程,如下图所示:
声学模型的任务是计算P(O|W ), 即给定文字之后发出这段语音的概率(最后利用贝叶斯,求P(O|W )是使用)。 首先第一问题: 怎么才能知道每个单词发什么音呢? 这就需要另外一个模块,叫做词典,看eesen的源码在数据准备阶段就是先求出词对应音素的dict, 它的作用就是把单词串转化成音素串,然后再求的语言模型和 训练声学模型(用lstm+ctc 训练声学模型).
有了dict的帮助,声学模型就知道给定的文字串该依次发哪些音了。不过为了计算语音跟音素串的匹配程度,还需要知道每个音素的起止时间。 这是利用动归来进行的,可以高效的找到音素的分界点,使得每一段语音与音素的匹配程度(用概率表示)之积最大。实际使用的算法称为viterbi算法,它不仅仅考虑了每一段语音和音素的匹配程度,还考虑了各个音素之间转换的概率(转换概率通过HMM估计) 实际中使用的比音素更小的单位,原理一样(不是很确定,值得是一帧数据(25ms)吗,一帧不到不到一个音素的长度?)
在求音素分界点的过程中,以及在有了分界点后计算
P
(
O
|
W
)时,声学模型都需要知道怎样计算一个音素与一段语音信号的匹配程度。要做这件事,需要找到一种合适的表示语音信号的方法。一般是把语音信号分成许多帧,对于每一帧,通过傅里叶变换等一系列操作,把它转换成一个特征向量。最常用的特征是MFCC,从训练数据中,我们可以提取出大量的特征向量,以及它们对应的音素;利用这些数据,就可以训练从特征到音素的分类器。前些年最常用的分类器是高斯混合模型(GMM),它的大致原理是估计出每个音素的特征向量的分布,然后在识别阶段,计算每一帧的特征向量
由相应音素
产生的概率
,把每一帧的概率相乘,就得到
P
(
O
|
W
)。现在,神经网络渐渐火了起来,它可以直接给出
,用贝叶斯公式可以转换成
,再相乘得到
P
(
O
|
W
)。