语音识别——语言模型

本博客主要是摘写洪青阳教授的《语言识别-原理与应用》的笔记,不足之处还请谅解。

语音识别为:根据输入的观察值序列O,找到最可能的词序列 W ^ \hat{W} W^。按照贝叶斯准则,识别任务可做如下转化:
W ^ = argmax ⁡ W   P ( W ∣ O ) = arg ⁡   max ⁡ P ( W ) P ( O ∣ W ) P ( O ) \hat{W}= {\underset {W}{\operatorname {arg max} }}\,P(W|O)=\arg\,\max\frac{P(W)P(O|W)}{P(O)} W^=WargmaxP(WO)=argmaxP(O)P(W)P(OW)
其中, P ( O ) P(O) P(O)和识别结果 W W W无关,可忽略不急,因此 W ^ \hat{W} W^的求解可进一步简化为:
W ^ = arg max ⁡ W   P ( W ) P ( O ∣ W ) \hat{W}={\underset {W}{\operatorname{arg\,max}}}\,P(W)P(O|W) W^=WargmaxP(W)P(OW)
要找到最可能的词序列,必须使上式右侧两项的乘积最大。其中, P ( O ∣ W ) P(O|W) P(OW)由声学模型决定, P ( W ) P(W) P(W)由语言模型决定。

声学模型就是前面学过的,通过声音进行分析的模型。

语言模型用来表示词序列出现的可能性,用文本数据训练而成,是语音识别系统重要的组成部分,如下图所示。

请添加图片描述

上图即为我们熟知的语音识别框架。

语言模型用来表示词语序列出现的可能性,可以基于语法规则,也可 以基于统计方法

基于规则的语言模型:来源于语言学家掌握的语言学知识和领域知识,或者根据特定应用设定语法规则,一般仅能约束受限领域内的句子。

统计语言模型:通过对大量文本语料进行处理,获取给定词序列的概率分布,从而能够客观描述隐含的规律,适合于处理大规模真实文本。统计语言模型已被广泛应用于语音识别、机器翻译、文本校对等多个领域。

而要训练一个适用性强的统计语言模型,就需要大量的、不同的、能覆盖用户各种表达方式的文本语料。

请添加图片描述

请添加图片描述

所有的句子都有开始位置和结束位置,分别用<s>和</s>表示,可认为这两个特殊标记是两个词。语言模型刻画词与词之间的组合可能性,通过分词,将句子进一步转换为词与词之间的组合概率关系。

即统计语言模型的目标是计算出给定词序列 w 1 , ⋯   , w t − 1 , w t w_1,\cdots,w_{t-1},w_t w1,,wt1,wt的组合概率:
P ( W ) = P ( w 1 w 2 ⋯ w t − 1 w t ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 w 2 ) ⋯ P ( w t ∣ w 1 w 2 ⋯ w t − 1 ) P(W)=P(w_1w_2\cdots w_{t-1}w_t)\\ =P(w_1)P(w_2|w_1)P(w_3|w_1w_2)\cdots P(w_t|w_1w_2\cdots w_{t-1}) P(W)=P(w1w2wt1wt)=P(w1)P(w2w1)P(w3w1w2)P(wtw1w2wt1)
其中,条件概率 P ( w 1 ) , P ( w 2 ∣ w 1 ) , P ( w 3 ∣ w 1 w 2 ) , ⋯   , P ( w t ∣ w 1 w 2 ⋯ w t − 1 ) P(w_1),P(w_2|w_1),P(w_3|w_1w_2),\cdots,P(w_t|w_1w_2\cdots w_{t-1}) P(w1),P(w2w1),P(w3w1w2),,P(wtw1w2wt1)就是语言模型。

计算所有这些概率值的复杂度较高,特别是长句子的计算量很大,因此需做简化,一般采用最多n个词组合的n-gram模型。

n-gram模型

所谓n-gram模型,表示n个词之间的组合概率模型。在n-gram模型中,每个预测变量 w t w_t wt之与长度为n-1的上下文:
P ( w t ∣ w 1 ⋯ w t − 1 ) = P ( w t ∣ w t − n + 1 w t − n + 2 ⋯ w t − 1 ) P(w_t|w_1\cdots w_{t-1})=P(w_t|w_{t-n+1}w_{t-n+2}\cdots w_{t-1}) P(wtw1wt1)=P(wtwtn+1wtn+2wt1)
即n-gram预测的词概率值依赖于前n-1个词,更长距离的上下文依赖被忽略。考虑到计算代价,在实际应用中一般取 1 ≤ n ≤ 5 1\leq n \leq 5 1n5

当n=1,2和3时,相应的模型分别成为一元模型、二元模型和三元模型。

一元模型和多元模型有明显的区别,一元模型没有引入“语境”,对句子的约束最小,其中的竞争最多。而多元模型对句子有更好的约束能力,解码效果更好。

但相应地,n越大,语言模型就越大,解码速度也越慢。

而语言模型的概率均从大量文本语料估计得到。针对一元模型,可简单地计算词的出现次数。

假设有1000个句子,其中:

  • “我们”出现100次,“明年”出现30次,“日子”出现10次,······
  • 总共有21000个词标签,其中包括1000个结束符</s>

请添加图片描述

一元模型的计算如下:

  • P(“我们”) = 100/21000
  • P(“明年”) = 30/21000
  • P(“日子”) = 10/21000
  • P(</s>) = 1000/21000

一元模型的示意图如下:

请添加图片描述

而二元模型的计算如下。假设这1000句语料中出现下面两个词的组合情况如下:

  • 10句以“我们”开头,5句以“明天”开头,……
  • 2句以“日子”结尾,……
  • 1次出现“我们明年”,3次出现“我们彼此”,……

则二元模型计算如下:

  • P(“我们”|) = 10/1000
  • P(“明天”|) = 5/1000
  • P(</s>| “日子”) = 2/10 ,“日子”出现10次
  • P(“明年”|“我们”) = 1/100 ,“我们”出现100次
  • P(“彼此”|“我们”) = 3/100

得到下表:

请添加图片描述

所以,二元模型的组合图如下:

请添加图片描述

三元模型用来表示前后三个词之间的组合可能性,其概率计算公式为
P ( w 3 ∣ w 1 w 2 ) = c o u n t ( w 1 w 2 w 3 ) / c o u n t ( w 1 w 2 ) P(w_3|w_1w_2)=count(w_1w_2w_3)/count(w_1w_2) P(w3w1w2)=count(w1w2w3)/count(w1w2)
假设“我们明天”出现2次,“我们 明天 开始”出现1次,则
P ( 开 始 ∣ 我 们 明 天 ) = 1 / 2 P(开始|我们明天)=1/2 P()=1/2
当句子只有一个词,例如”是“,其实也表示三个词,即”<s>是</s>“,因此要单独识别"是",也得有这样一个词的句子。

三元模型的概率关系图如下:

请添加图片描述

评价指标——困惑度

给定句子S,其包含词序列 w 1 , w 2 , ⋯   , w T w_1,w_2,\cdots,w_T w1,w2,,wT,T是句子长度,则困惑度(Perplexity)表示为:
P P L ( W ) = P ( w 1 w 2 ⋯ w T ) − 1 T = 1 P ( w 1 w 2 ⋯ w T ) T PPL(W)=P(w_1w_2\cdots w_T)^{-\frac{1}{T}}=\sqrt[T]{\frac{1}{P(w_1w_2\cdots w_T)}} PPL(W)=P(w1w2wT)T1=TP(w1w2wT)1
Perplexity又称困惑度(PPL), PPL越小,𝑃(𝑤𝑖) 则越大,句子𝑆出现 的概率就越高。

理论上,困惑度越小,语言模型越好,预测能力越强。

请添加图片描述

平滑技术

由于统计语料有限,会存在数据稀疏的情况,这可能导致零概率或估计不准的问题,因此对语料中未出现或少量出现的词序列,需要采用平滑技术进行简介预测。

平滑技术分为三种:

  • 折扣法:从已有观察值概率调配一些给未观察值概率,如Good-Turing(古德-图灵)折扣法
  • 插值法:将高阶模型和低阶模型做线性组合,如Jelinek-Mercer插值法,也可做非线性组合,如Kneser-Ney插值法。
  • 回退法:基于低阶模型估计未观察到的高阶模型,例如Katz回退法。

Good-Turing折扣法

  • 设总词数为 N N N,平滑前出现1次的词数为 N 1 N_1 N1,出现 c c c次的词数为 N c N_c Nc
  • 平滑后,概率 P ∗ ( 出 现 0 次 的 词 ) = N 1 N P^*(出现0次的词)=\frac{N_1}{N} P(0)=NN1,出现次数 c ∗ = ( c + 1 ) N c + 1 N c c^*=\frac{(c+1)N_{c+1}}{N_c} c=Nc(c+1)Nc+1,对应概率为: P G T = c ∗ N P_{GT}=\frac{c^*}{N} PGT=Nc

例子:

分词后句子语料(假设只有2句):

  • “我们 明年 会 有 全新 的 开始”
  • “我们 彼此 祝福 着 等待 再见 那 一 天”

词频数:“我们”2次,“明年”1次,……,“天”1次

平滑前: N = 16 , N 1 = 14 , N 2 = 1 N = 16, N_1 = 14 , N_2 = 1 N=16,N1=14,N2=1

平滑后: N 0 ∗ = N 1 N = 14 16 , N 1 ∗ = ( 1 + 1 ) N 2 N 1 = 2 14 N^*_0=\frac{N_1}{N}=\frac{14}{16},N^*_1=\frac{(1+1)N_2}{N_1}=\frac{2}{14} N0=NN1=1614,N1=N1(1+1)N2=142
对应的概率为: P 0 ∗ = N 1 N = 14 16 , P 1 ∗ = c 1 ∗ N = 2 14 ∗ 16 P^*_0=\frac{N_1}{N}=\frac{14}{16},P^*_1=\frac{c^*_1}{N}=\frac{2}{14*16} P0=NN1=1614,P1=Nc1=14162

Jelinek-Mercer插值法

为了避免出现 P ( w ) = 0 P(w)=0 P(w)=0或接近于零的情况,可以用三元、二元和一元相对概率做插值。
P ^ ( w t ∣ w t − 2 w t − 1 ) = λ 1 P ( w t ∣ w t − 2 w t − 1 ) + λ 2 P ( w t ∣ w t − 1 ) + λ 3 P ( w t ) \hat{P}(w_t|w_{t-2}w_{t-1})=\lambda_1P(w_t|w_{t-2}w_{t-1})+\lambda_2P(w_t|w_{t-1})+\lambda_3P(w_t) P^(wtwt2wt1)=λ1P(wtwt2wt1)+λ2P(wtwt1)+λ3P(wt)
其中 λ 1 + λ 2 + λ 3 = 1 \lambda_1+\lambda_2+\lambda_3=1 λ1+λ2+λ3=1

Kneser-Ney插值法

当训练数据非常少的情况下,特别适合采用Kneser-Ney 插值法。Kneser-Ney 是一种非线性插值法,从Absolute discounting(绝对折扣)插值方法演变而来。

Absolute discounting

Absolute discounting方法充分利用高阶和低阶语言模型,把高阶的概率信息分配给低阶的一元模型。例如,针对二元语言模型,Absolute discounting平滑公式表示如下:
P a b s ( w t ∣ w t − 1 ) = m a x ( c ( w t − 1 w t ) − d , 0 ) ∑ w ′ c ( w t − 1 w ′ ) + λ P a b s ( w t ) P_{abs}(w_t|w_{t-1})=\frac{max(c(w_{t-1}w_t)-d,0)}{\sum_{w'}c(w_{t-1}w')}+\lambda P_{abs}(w_t) Pabs(wtwt1)=wc(wt1w)max(c(wt1wt)d,0)+λPabs(wt)
其中 c ( w t − 1 w ′ ) c(w_{t-1}w') c(wt1w)表示 w t − 1 w ′ w_{t-1}w' wt1w的组合次数, w ′ w' w是任意一个词, d d d是固定的一个折扣值, λ \lambda λ是一个规整容量。 P a b s ( w t ) P_{abs}(w_t) Pabs(wt)是一元模型,按单词出现次数统计。

P a b s ( w t ) P_{abs}(w_t) Pabs(wt)可能会存在异常偏大现象。比如“杯子”出现频次较高,因此单独的“杯子”按出现次数可能会比 “茶”多,即 P a b s ( 杯 子 ) > P a b s ( 茶 ) P_{abs}(杯子) > P_{abs}(茶) Pabs()>Pabs() ,这样会使Absolute discounting平滑公式因 P a b s ( w t ) P_{abs}(w_t) Pabs(wt)值过大出现“喝杯子”比“喝茶”概率高的奇怪现象。

Kneser-Ney

Kneser-Ney插值法对此做了改进,平滑公式如下:
P K N ( w t ∣ w t − 1 ) = m a x ( c ( w t − 1 w t ) − d , 0 ) ∑ w ′ c ( w t − 1 w ′ ) + λ ∣ { w t − 1 : c ( w t − 1 , w t ) > 0 } ∣ ∣ { w j − 1 : c ( w j − 1 , w j ) > 0 } ∣ P_{KN}(w_t|w_{t-1})=\frac{max(c(w_{t-1}w_t)-d,0)}{\sum_{w'}c(w_{t-1}w')}+\lambda\frac{|\{w_{t-1}:c(w_{t-1},w_t)>0\}|}{|\{w_{j-1}:c(w_{j-1},w_j)>0\}|} PKN(wtwt1)=wc(wt1w)max(c(wt1wt)d,0)+λ{wj1:c(wj1,wj)>0}{wt1:c(wt1,wt)>0}
其中 λ \lambda λ是规整的常量, d d d是固定的一个折扣值, w j − 1 w j w_{j-1}w_j wj1wj是任意两个词的组合。第一部分的分母可进一步表示为一元模型统计,因此Kneser-Ney 平滑公式还可简化为:
P K N ( w t ∣ w t − 1 ) = m a x ( c ( w t − 1 w t ) − d , 0 ) c ( w t − 1 ) + λ ∣ { w t − 1 : c ( w t − 1 , w t ) > 0 } ∣ ∣ { w j − 1 : c ( w j − 1 , w j ) > 0 } ∣ P_{KN}(w_t|w_{t-1})=\frac{max(c(w_{t-1}w_t)-d,0)}{c(w_{t-1})}+\lambda\frac{|\{w_{t-1}:c(w_{t-1},w_t)>0\}|}{|\{w_{j-1}:c(w_{j-1},w_j)>0\}|} PKN(wtwt1)=c(wt1)max(c(wt1wt)d,0)+λ{wj1:c(wj1,wj)>0}{wt1:c(wt1,wt)>0}

Katz回退法

采用Katz平滑技术的概率估计公式如下:
P ( w t ∣ w t − 2 w t − 1 ) = { C ( w t − 2 w t − 1 w t ) C ( w t − 2 w t − 1 ) , 当 C > C ′ d C ( w t − 2 w t − 1 w t ) C ( w t − 2 w t − 1 ) , 当 0 < C < C ′ b a c k o f f ( w t − 2 w t − 1 ) P ( w t ∣ w t − 1 ) P(w_t|w_{t-2}w_{t-1})= \begin{cases} \frac{C(w_{t-2}w_{t-1}w_t)}{C(w_{t-2}w_{t-1})}, &当C>C'\\ d\frac{C(w_{t-2}w_{t-1}w_t)}{C(w_{t-2}w_{t-1})}, &当0<C<C'\\ backoff(w_{t-2}w_{t-1})P(w_t|w_{t-1}) \end{cases} P(wtwt2wt1)=C(wt2wt1)C(wt2wt1wt),dC(wt2wt1)C(wt2wt1wt),backoff(wt2wt1)P(wtwt1)C>C0<C<C
其中 C C C C ( w t − 2 w t − 1 w t ) C(w_{t-2}w_{t-1}w_t) C(wt2wt1wt)的简写,表示三个词同时出现的次数, C ′ C' C是一个计数阈值,当 C > C ′ C>C' C>C时,直接采用最大似然方法估计概率;当 0 < C < C ′ 0<C<C' 0<C<C时,则采用Good-Turing折扣法, d d d是折扣系数。

b a c k o f f ( w t − 2 w t − 1 ) backoff(w_{t-2}w_{t-1}) backoff(wt2wt1)是回退权重,回退权重的计算如下:
b a c k o f f ( w t − 2 w t − 1 ) = 1 − ∑ P ( w ∣ w t − 2 w t − 1 ) ∑ P ( w ′ ∣ w t − 2 w t − 1 ) backoff(w_{t-2}w_{t-1})=\frac{1-\sum{P(w|w_{t-2}w_{t-1})}}{\sum{P(w'|w_{t-2}w_{t-1})}} backoff(wt2wt1)=P(wwt2wt1)1P(wwt2wt1)
其中 w w w是在训练语料中 w t − 2 w t − 1 w_{t-2}w_{t-1} wt2wt1之后出现的词, w ′ w' w是在训练语料中 w t − 2 w t − 1 w_{t-2}w_{t-1} wt2wt1之后未出现的词。

采用Katz回退法,训练好的语言模型格式如下:

请添加图片描述

其中, p r o _ 1 pro\_1 pro_1是一元模型(1-grams)单词的对数概率, p r o _ 2 pro\_2 pro_2是二元模型(2-gram)的对数概率, p r o _ 3 pro\_3 pro_3是三元模型(3-gram)的对数概率。一元模型和二元模型后面分别带有回退权重 b a c k _ p r o 1 back\_pro1 back_pro1 b a c k _ p r o 2 back\_pro2 back_pro2

如果要得到三个词出现的概率 P ( w 3 ∣ w 1 w 2 ) P(w_3|w_1w_2) P(w3w1w2),则根据以上的语言模型,其计算如下:

请添加图片描述

即,如果不存在 ( w 1 w 2 w 3 ) (w_1w_2w_3) (w1w2w3)的三元模型,则采用回退法,即结合回退权重 b a c k _ p r o 2 ( w o r d 1 , w o r d 2 ) back\_pro2(word1,word2) back_pro2(word1,word2)来计算:

b a c k _ p r o 2 ( w o r d 1 , w o r d 2 ) ∗ P ( w o r d 3 ∣ w o r d 2 ) back\_pro2(word1,word2)*P(word3|word2) back_pro2(word1,word2)P(word3word2)。如”拨打 郑州 局“这样的组合,如果语料库里没有,即没有相应的三元模型,则查找“拨打 郑州”和“郑州 局”的组合概率和回退概率(概率均为对数概率)。假设值如下:

请添加图片描述


P ( 拨 打 , 郑 州 , 局 ) = P ( 局 ∣ 拨 打 , 郑 州 ) = b a c k _ p r o 2 ( 拨 打 , 郑 州 ) ∗ P ( 局 ∣ 郑 州 ) = l n ( e − 0.4072262 ∗ e − 3.012735 ) = − 3.4199612 P(拨打,郑州,局)=P(局|拨打,郑州)=back\_pro2(拨打,郑州)*P(局|郑州)=ln(e^{-0.4072262}*e^{-3.012735})=-3.4199612 P(,,)=P(,)=back_pro2(,)P()=ln(e0.4072262e3.012735)=3.4199612

语言模型的训练

请添加图片描述

SRILM

  • SRILM由SRI实验室开发,诞生于1995年,包括最大似然估计和平滑算法。
  • SRILM主要有两个工具:ngram-count和ngram,用来估计语言模 型和计算困惑度。

递归神经网络语言模型(RNNLM)

𝑛-gram语言模型一般只能对前3-5个词建模,存在局限性。

针对任意长度的句子,我们可采用递归神经网络(RNN),使用 循环连接对上下文依赖关系进行建模。

请添加图片描述

这里的RNN模型的内部函数最好另外学习了,能更详细点。

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
语音识别是一种技术,它可以将人类语音转换为文本或指令。Python是一种流行的编程语言,可以用于实现语音识别系统。 在Python中实现语音识别通常需要使用一些库和工具。以下是一些常用的库和工具: 1. Google Speech Recognition:Google Speech Recognition是一个流行的开源语音识别库,它可以将音频文件转换为文本。您可以使用pip安装该库。 2. OpenCV:OpenCV是一个流行的计算机视觉库,它提供了许多功能,包括音频处理和语音分析。您可以使用OpenCV处理音频文件并提取语音信号,然后再使用其他语音识别库进行进一步处理。 3. NLTK:NLTK是一个流行的自然语言处理库,它提供了许多文本处理和分析工具,包括语音识别。您可以使用NLTK进行语音信号的预处理和特征提取,以便将其输入到语音识别库中。 4. TensorFlow:TensorFlow是一个流行的机器学习库,它提供了许多功能,包括语音识别。您可以使用TensorFlow构建自己的语音识别系统,或者使用现有的模型进行训练和部署。 一旦您选择了适当的库和工具,您就可以开始实现语音识别系统了。通常,您需要以下几个步骤: 1. 音频文件预处理:您需要将音频文件转换为适合语音识别的格式,并进行适当的预处理,例如去除噪声和背景噪音。 2. 特征提取:您需要从音频信号中提取特征,以便将它们输入到语音识别算法中。这些特征通常包括音频频率、时间序列等。 3. 模型训练:您可以使用训练数据集来训练语音识别模型,以便将其应用于未知的音频文件。通常,您需要使用机器学习算法来训练模型并优化其性能。 4. 文本生成:一旦您获得了文本输出,您需要将其发送给用户或将其保存到文件中。 需要注意的是,语音识别是一项复杂的技术,需要大量的数据和计算资源来训练和优化模型。因此,如果您是初学者或需要快速实现语音识别系统,建议使用现有的开源库和工具,并逐步学习和探索更高级的技术和方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值