2019-06-30 17:06:07 weixin_38358881 阅读数 587
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5915 人正在学习 去看看 杨波

语音识别

LibriSpeech ASR corpus

LibriSpeech 数据集
共将近1000个小时的数据集。分为clean和other两类。具体见链接。

WER评价指标

WER means " word error rate"
对于语音识别的预测结果,需要对此结果进行替换删除、插入某些词使之和标注词序列完全相同。修改的总词数比上标注词序列的个数即为WER,此项指标越低越好。具体计算公式如下,其中替换误差加权为1,删除和插入的误差加权为0.5
在这里插入图片描述
WER的取值范围是最小是0,最大可以大于1。此外,类似的评价指标还有SER,CER,仅仅是粗细粒度不同,计算方式相同。

2019-09-06 11:10:12 u013498583 阅读数 45
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5915 人正在学习 去看看 杨波

这篇文章主要是对CMU Sphinx系列教程的第一篇文章的主要内容做一些总结。学习某个知识,掌握这些知识的基本概念是必要的。不了解这些基本概念和他们的英文表述,对于代码(kalid)和论文的阅读都会存在一些障碍。对这些基本概念是否了解,是检验一个人是否入门语音识别的一个标志。

原文如下:

https://cmusphinx.github.io/wiki/tutorialconcepts/

语音构成

image

语音是一个连续的音频流,由大部分的稳态和小部分的动态组成,怎么对它进行建模呢。

语音可以认为是由多个词(word)构成,而每个词又是由多个音素(phones,在语言学中也称为 phonemes)构成。一个音素对应的波形(wave form)的声学特征的变化会受上下文,说话人等影响。需要被放到上下文中进行考虑,音素与音素相邻(过渡)部分可能比稳定部分蕴含更多的信息。所以,我们把一个音素分为几个不同的子状态(substates)。这就是多音素建模的思想。这些在上下文中的音素被称为三音素(triphones)甚至是五音素。三音素是常用的,对于三个状态也很好解释,音素的第一部分依赖于它的前一个音素,中间的是稳定的自身的部分,第三部分依赖于它的下一个音素。

波形中除了语音还有其他非语音的声音(non-linguistic sounds),这些声音又被称为填充物(filler)。语音和非语音一起构成了语音片段(utterances)。在语音识别中,一个帧长可以认为是一段utterances。目前通用的语音识别方式如下:有一段波形,通过静音(silences)将它分割成若干个语音片段(utterances),然后识别每一个语音片段说的是什么

特征

用帧frames去分割语音波形,从帧提取特征,一般使用MFCC或FBANK

模型

在语音识别中有3个模型

1. 声学模型(acoustic model) 

表示某段语音是某个词或音素的概率。现在一般使用神经网络

2.发音词典(phonetic dictionary)

发音字典包含了从词到音素的映射关系。

3.语言模型(language model)

语言模型用于限制词的搜索范围。定义了哪个词可以跟在前一个已经被识别出来的词的后面。最广泛使用的语言模型就是n-gram语言模型

解码器

解码器就是对以上3个模型构成的Lattice进行搜索匹配。一般使用WFST。Lattice是用于表示所有识别可能的有向图(directed graph)

特征、模型和解码器三部分构成了一个语音识别系统。

评价指标

-词错误率(Word error rate)

假设我们有一个原始的文本以及长度为N个词的识别文本。I是插入词(inserted words)的数量,D是删除词(deleted words),S表示替换词(substituted words)

WER=(I+D+S)/N

-准确率(Accuracy) 

Accuracy=(N−D−S)/N

-实时率(real time factor) 

度量自动语音识别系统解码速度的值。当实时率等于或小于1时我们说该处理是实时的。详见百度百科:https://baike.baidu.com/item/rtf/15874401?fr=aladdin

-ROC曲线

对于一个检测任务,检测会出现误报和命中两种情况。ROC曲线就是用来评价检测性能的。

 

参考文献

1. https://blog.csdn.net/xm1076709179/article/details/82218262

2. https://blog.csdn.net/zouxy09/article/details/7941055

 

 

2019-12-01 20:03:24 weixin_42697449 阅读数 23
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5915 人正在学习 去看看 杨波

                                                   软件测试之语音识别(ASR)测试

**写在前面:测试不是一种目的,而是一种保证软件质量的手段**

一、语音识别(ASR)评估指标

    在测试语音识别的过程中,衡量识别内容的准确性,一般通过如下指标进行评估

  •     WER(Word Error Rate,词错率)

    定义:为了使识别出来的词序列和标准的词序列之间保持一致,需要进行替换、删除或者插入某些词,这些插入、替换或删除的词的总个数,除以标准的词序列中词的总个数的百分比,即为WER

    WER=(S+D+I)/N

    S:substitution,替换

    D:Deletion,删除

    I:Insertion,插入

    N:标准词序列中词的总个数

   (S+D+I)=识别出来的词序列与标准的词序列之间的编辑距离

    注意:因为有插入词(Insertion),所以可能会出现WER>1的情况,不过,WER>1时,表明识别出来的词序列和标准的词序列相差很大,识别效果特别差

  •   SER(Sentence Error Rate,句错率)

    定义:句子中如果有一个词识别错误,那么这个句子被认为识别错误,句子识别错误的个数,除以总的句子个数即为SER

    SER=SE/N

    SE:识别出来的序列中,识别错误的句子个数(即WER!=0的句子个数)

    N:标准序列中总句子个数

 

二、语音识别(ASR)思路

    (1)、语音识别的测试点主要包括如下几点:

    i.输入测试语音

    (中间过程:语音识别模块接收到测试语音,执行语音转文字操作,并将识别文字输出)

   ii.验证识别文字内容的准确性

   iii.语音识别耗时

   (2)、 测试语音的输入,主要包括以下几个方面:

    ①语音输入离拾音设备的距离:近距离、远距离

    ②拾音设备:移动端(安卓、IOS)原生麦克风、PC端原生麦克风、日常用耳机麦克风、专业设备麦克风(罗技等)

    ③语音输入与拾音设备的相对位置:正对拾音口,背对拾音口

    ④语音输入的环境:办公环境、会议室环境

    ⑤语音输入时的语速:正常语速、语速较快、语速较慢、时快时慢、断断续续

    ⑥语音输入时的音量:正常音量、音量较大、音量较小,时大时小

    ⑦语音输入时的音色:男声、女声

    ⑧语音输入的音频类型:自然人声、录音、广播、变声等

    (3)、测试识别内容,主要包括以下几个方面:

    ①支持识别的语种:普通话、英文、方言等

    ②支持的应用场景:日常对话、尽职调查、娱乐访谈等

    ③支持的对话模式:单人对话,多人对话,同一时间只有一个人说话,同一时间多人一起说话

    ③覆盖的词库内容:根据应用场景,是否包含了应用场景(比如金融、娱乐领域)对应的词库训练

    (4)、验证识别内容的准确性

    统计识别文字的WER、SER指标

    (5)、关注语音识别耗时

    ①短语音的识别耗时

    ②长语音的识别耗时

    

三、WER、SER指标的计算

    ①计算识别的词序列与标准的词序列之间的编辑距离

    ②计算WER

    ③计算SER

    

  

2019-07-22 16:04:42 NIeson2012 阅读数 2229
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5915 人正在学习 去看看 杨波

目录

1.背景

2.孤立词识别

2.1 特征提取

2.2 动态弯算法

2.3 GMM(Gaussian mixture model)

2.4 HMM(Hidden markov model)

2.5 EM训练算法

2.6 语音识别基本方程

3.连续语音识别

3.1 语言模型

3.2 大词汇量

3.3 语音识别系统结构

3.4 评价指标:WER

4. 潘多拉魔盒

4.1 上下文有关模型

4.2 区分式训练

4.3 说话人适应

4.4 二次打分

5.结语

参考文献


1.背景

在讲解每一个知识或者技术之前,我们通常先说到它的概念,当然语音识别技术也不例外。那么什么是语音识别呢,语音识别就是把语音转换成文字。科大讯飞的输入法就是一个典型的语音识别的例子,我们可以在不方便打字又不想让别人听到自己声音的时候,就可以使用这种方法,它可以把语音信号转化成文字。全球有很多种语言,怎么让不同语言的信号转换成其对应的文字呢。这就衍生了语音识别的一些相关课题。

元数据识别:就是无论说话人说的是中文还是外语,我都可以将它转换成对应的汉子或者外国文字,而且更加神奇的是,它还知道在一句话的什么地方该加标点符号,这都属于元数据的识别范畴;语音增强与分离:在很多语音中挣钱并分离出自己需要的语音信号,最典型的的例子就是鸡尾酒宴会,意思就是在这个宴会上会有很多声音音乐声,不同的人的说话声,这时我想从这些混杂的语音中提取小明的声音以及他说话的内容,这时我们就可以用到语音增强与分离技术,这个可以用SVD实现;语音合成与转换:语音合成是语音识别的逆过程,也就是说语音合成是把文字转化成语音信号;自然语言处理的应用场景也非常多,像Siri或者win10上的小娜都是基于NLP的。说完概念,接下来说一说语音识别的应用。

语音识别技术在我们生活中见得非常多,比如语音助手、导航系统等等。这里就不多介绍。说完这些,我们就将进入语音识别技术的前世今生的前世部分。

这是两个带着红领巾的少先队员,为什么以这个图片为背景呢,我猜测可能和语音识别技术的历史有关。因为语音识别技术的前世是在20世纪80年代兴起的,而那时,也就是上世纪八九十年代,带着红领巾的少先队员正是风靡全国,曾经作为一名少先队员,我骄傲。既然说到这里,我就大致说下语音识别技术的发展史:1952年贝尔实验室的Davis等人研究成功了世界上第一个能识别10个英文数字发音的实验系统;20世纪70年代孤立词识别取得实质性的进展;1987年李开复开发世界上第一个‘非特定人连续语音识别系统’,(是的,就是那个创新工场的李开复,人家不仅能当总裁,还是一个科技大牛,不得不服呀,而且,王博士跟李开复是一个实验室的),用统计的方法提升了语音识别率;2011年微软的DNN深度神经网络模型在语音识别领域取得成功。具体的发展史可以看参考文献1中的小视频。

 

2.孤立词识别

每一个单词都有模板,用于待预测语音与它进行比较,如上图所示,右边蓝色的语音信号到底是说的Yes还是No。我们直观的看一下,可能感觉它是Yes的可能性更大,因为Yes的信号波形中有两个包,No只有一个包,而待预测的信号也是有两个包,从波形上我们可以大概判断出待预测信号是Yes的可能性更大一些,当然这种看波形的方法实不可取的,更是不科学的。那么我们应该怎么做呢,就是计算待预测信号与模板信号的距离,其实也就是相似程度,距离越短,相似程度越高。但是信号的距离该怎么比较呢,是通过把信号转换成特征向量,然后比较向量之间的欧式距离或者其他的距离,接下来,就来到了特征提取的部分。

2.1 特征提取

对于一段语音信号,我们通常是一段一段的分析,我们提取一帧信号,它的长度通常为20~50ms,一帧信号要至少包含2~3个周期,那你怎么知道20~50ms就能有至少2~3个周期呢,因为人说话的频率是在100Hz左右,所以语音信号的周期就是10ms,微观上我们感觉一帧信号特别长,竟然包含几个周期,但其实,50ms也就是0.05s,比一眨眼的的时间还短。

接下来我们就需要分析这一帧信号,对一帧信号做傅里叶变换,这样可以得到信号的频域的信息。有关傅里叶变换的知识可以看参考文献2,讲的非常通俗易懂。经过傅里叶变换之后,我们会得到这一帧信号的频谱,它由两部分组成,其中蓝色的线表示的是精细结构反应的是音高,在汉语中比较常用,用来识别汉字的声调,但是在外语中用处相对较小;红色的线表示的是包络,也就是频谱的大致幅度,它反映的是音色,包含主要的信息。可以看到,包络的峰要比精细结构少很多,只是在500Hz、1700Hz和2500Hz的地方有峰值。像精细结构这样的多峰的波形分析起来比较复杂,其实可以直接用包络表示这段语音信号,虽然不能丝毫不差的表示,但是它包含了这段信号的大部分信息。但是,我们通常不会直接用包络表示语音信息,那么我们应该怎么做呢,就是对精细结构进行滤波,继续往下看。

我们对一帧信号进行三角滤波,中间那副图片中的蓝线表示的就是精细结构,红线表示的就是三角滤波器。可以看到,左边的三角滤波器比较密,这是跟人耳的频率特性相关的,人耳对低频信号比较敏感,所在低频部分的分辨率较高,高频部分的分辨率就相对较低。经过三角滤波后,我们得到最下边的成为滤波器组输出的图像,可以看出,Filterbank output的峰的个数相对精细结构也变少了,我们再一看,它和频谱的包络在形状上很相似,实际上,他就是频谱包络的一种近似。最下边这幅图的横坐标表示三角滤波器的标号,此示例中用了40个三角滤波器,纵坐标表示信号的能量,可以看出频谱精细结构在500Hz处有个高峰,所以在500Hz处的三角滤波器中的能量比较大,500Hz大约对应第12个三角滤波器,在下图可以看到,横坐标在12处有个高峰。其实这个Filterbank output就基本可以作为这一帧语音的特征了,但是我们还通常会进一步做数学变换来达到数据压缩的目的,继续往下看。

通常情况下我们会对Filterbank output做一个对数变换或者离散余弦变换,这样就可以吧Filterbank output压缩为一个13维的特征向量,称为MFCC。经过一系列处理之后,我们得到了一帧语音信号的特征向量,那么怎么对整个一段语音信号进行处理呢,我们继续往下看。

对于一段语音信号,我们通常利用类似于滑动窗口的方法沿着时间的维度一帧帧的将信号堆叠起来,窗宽就是一帧信号的长度,两个窗口之间通常会有10ms的重叠以防信息的泄漏,这样把一帧帧信号按列堆叠起来,形成了中间的语谱图,横坐标为帧的序号,纵坐标为评率,右边的Colorbar表示信号的能量,自下向上能量越来越大,对语谱图进行数学变换之后,我们可以得到MFCC序列,它就表示语音信号中的有用特征。接下来看看特征提取的一些特点。

在语音识别领域中MFCC序列是最常用的特征,他主要描述的是频谱包络,也就是音色。它的优点就是排除基频也就是精细结构;一帧语音信号通常会有成百上千个采样点,而MFCC序列只需要一个13维的特征向量就可以表示这一帧信号的主要特征信息,所以有维度低的特点;符合听觉就是指在低频处三角滤波器密集而在高频处三角滤波器稀疏。万物都有两面性,MFCC序列有优点就会有缺点,它一次只能看一帧也就是20~50ms的信号,即视野小;还有就是受噪声、回声影响等。关于它的改进部分就不多说了。

2.2 动态弯算法

在文章的开头说过,需要计算待预测语音与模板语音之间的距离,从而判断它想要表达的内容。经过特征提取之后我们将语音信号编程了一个个13维的特征向量,那么我们该怎么计算两个特征序列之间的距离呢。这里用到了DWT算法,将待识别语音中的每一帧与模板中最相似的一帧匹配,同时要保证顺序不要改变。因为一个词或者一句话顺序改变,意思也会完全改变。在上图中我们用一个竖条表示一帧语音信号的特征向量,通过DTW算法将待识别语音的特征向量与模板特征向量对齐之后,计算待识别语音中的每一帧语音与模板中每一帧的欧式距离,然后总距离为所有帧的欧式距离之和。通过计算待识别语音与Yes模板和No模板的欧式距离,取两者中距离小的那个为最终识别结果即可。其实到此,孤立词识别问题就已经解决了,但是人总是不满足的, 总是想找到更好的方法,那么我们继续往下看。

2.3 GMM(Gaussian mixture model)

我们知道,同一个人或者不同的人说一个汉字或者单词的发音是存在区别的,那么我一个词比如Yes只录一个模板的话,那么最后的识别正确率会降低。这就要求我们需要多录几个模板,在上图中,中间的五个特征向量为待识别语音,上下分别为待识别语音的模板,那么经过DTW算法之后,我们把对齐的几个特征向量整合在一块,这样原来的模板就变成了右边的有五个状态的模型,然后我们就让待识别语音与模型中的每个状态进行对齐,这样的话,识别的准确率会大大提升。接下来我们需要使用GMM来拟合每个状态中特征向量的分布,顾名思义,GMM其实就是多个高斯分布叠加而成的一种模型,如右下角的图形就是在二维空间下的GMM,可以看到,它的形状有点像地理中的等高线,这其实是一个轮廓图,经过GMM后,可以得出特征向量的概率密度并以此代替欧式距离。训练好GMM后,我们怎么用模型识别未知语音呢,继续往下看。

我们首先用DTW算法把待识别语音与模型中的状态对齐,计算每一个特征向量在模型中的概率密度,并以此来代替向量间的欧式距离。然后把每一帧的概率密度(这里一帧和一个特征向量是一样的,都是用一个竖线表示)相乘得到了在模型下待识别语音的概率,这里假设各帧之间是独立的。最后取P(待识别语音|模型)最大的模型为识别结果。还是以文章开头的例子为说明,计算待识别语音中的每一帧分别在Yes模型和No模型中的每一状态中的概率密度,最后相乘得到P(待识别语音|Yes模型)和P(待识别语音|No模型),取两者中较大的值对应的模型就是待识别语音最后的结果。

2.4 HMM(Hidden markov model)

接下来就轮到了前世中的主角闪亮登场了,也就是隐马尔可夫模型(HMM),它将模型完全概率化,概率可以为我们提供更多的信息,比如我想知道明天是晴天还是阴天或者下雨,告诉你结果,不如告诉你这三者中每一个发生的概率,其实我们也经常在天气预报中听到,某某地区的降水概率是多少,这显然比直接告诉我们明天是下雨或者晴天包含的信息更多。HMM在GMM的基础上增加了转移概率。什么是转移概率呢,如上面的图中所示,初始状态为第一个状态,那么它的下一状态还为第一状态的概率为0.7,下一状态为第二状态的概率为0.3,这里的0.7和0.3就是从当前状态转移到下一状态的概率,也就是转移概率。我们可以看到,待识别语音的每一帧与模型中的状态对齐之间也有个概率,也就是0.016,0.028这些值,这些值可以由GMM计算得出,也就是观测概率。我们把GMM测得的观测概率和HMM的转移概率相乘,就得到了在某模型下,语音和对齐方式的联合概率。接下来看看,HMM的特点。

HMM主要有两个特点,第一个就是特征序列由隐状态产生,隐状态也就是上面说到的五个状态,为什么称之为隐状态呢,是因为每帧特征向量和状态之间的对齐方式是未知的;另一个特点就是马尔可夫性,这里就不多说了。有关GMM,HMM,包括下面将要说的EM的相关知识,我推荐大家可以看一下悉尼科技大学的徐亦达老师在优酷的一个自频道,里面详细的讲解了概率统计的一些知识,并且每一个概念都有详细的公式推导,值得一看,教学视频见参考文献3。说完模型的特点,接下来说一下模型的参数,实际上HMM是有三个参数的:转移概率,观测概率以及初始概率。但是上面示例中的HMM是单向的,所以初始状态默认为第一个状态,所以,模型的参数就变成了两个:转移概率和观测概率。

接下来就看看HMM在语音识别领域中是如何使用的。HMM的三大问题:第一个问题就是求值问题,也就是给定模型参数和待识别语音,求概率,因为对齐方式是事前不知道了,所以我们就需要枚举每种对齐方式,由前面讲到的公式P(语音,对齐方式|模型) = GMM观测概率*HMM转移概率可以算出联合概率P(语音,对齐方式|模型),然后对所有对齐方式求和,联合概率就变成了边缘概率P(语音|模型),但是对齐方式是多种多样的,对枚举每一种对齐方式是很困难的,所以这里就引入了动态规划算法中的前向算法,个人对动态规划的算法不了解,所以这里就不多进行说明;第二个问题就是解码问题,也就是给定模型参数和语音,求最佳对齐方式的问题,那么什么才是最佳的对齐方式呢,最佳对齐方式就是使联合概率P(语音,对齐方式|模型)最大的那种对齐方式,这里用到了动态规划的算法中的Viterbi,这个算法其实就是DTW算法的升级版本,最佳对齐方式的概率可以作为总概率的近似,这里说明一下它的意思,比如我有1000种对齐方式,那么最佳对齐方式只是其中的一种,如果假设对齐方式服从均匀分布的话,当然这时候也就没有了最佳而言,因为每一种对齐方式的概率都是一样的都是0.1%,这显然跟总概率相差甚远,实际上并不是这样了,通常情况下最佳对齐方式的概率跟非最佳对齐方式的概率不是一个数量级,也就是说我最佳概率可能为90%,而你其他999中非最佳的概率和才占10%,所以,这种情况下,可以把最佳概率作为总概率的近似;最后一个问题就是训练问题,训练问题就是给定语音和模型结构,求模型参数的问题。将在下面的内容中详细的讲解。

2.5 EM训练算法

最大期望算法(Expectation-maximization algorithm,EM)在统计中被用于寻找,依赖于不可观察的隐性变量的概率模型中,参数的最大似然估计。我们事先是不知道对齐方式的,但是我们可以随机假设一种对齐方式,假设Yes这个词的发音一共有15帧信号,那么我们可以这样分割,前五帧代表Y的发音,中间五帧代表e的发音,最后五帧代表s的发音,然后以这种对齐方式求得模型的参数,然后再反过来更新对齐方式,这里没有再使用DTW,而是使用Viterbi或者Forward-backward算法,一直这样不断更新下去,直到收敛为止。

2.6 语音识别基本方程


最后讲一下语音识别的基本方程。这个方程其实就是语音识别技术要解决的问题,它是求得在已知X也就是待识别语音的条件下它被识别为任意一个单词W的概率,比如我们说段语音,它可以被识别为Yes也可以被识别为No或者其他,语音识别要做的就是找出被识别为某一个词最大的概率,也就是W*。P(W|X)是条件概率,我们把它经过贝叶斯公式变换一下得到P(X|W)P(W)/P(X),其中P(X|W)称为likelihood也就是似然函数,在这里它是指的声学模型,根据这个式子P(W|X)=P(X|W)P(W)/P(X)而言,要想使P(W|X)最大,我们要做的无非就是让分子尽量大,分母尽量小。因为给定了X以后P(X)就可以认为是固定了,那么最大化式子P(W|X)=P(X|W)P(W)/P(X),就变成了最大化式子P(W|X)=P(X|W)P(W),那么就需要让似然函数也就是声学模型P(W|X)和先验概率P(W)尽量大,声学模型我们可以用GMM和HMM训练得到,而且上一张PPT中,EM训练算法可以最大化似然函数也就是P(W|X)。那么什么是先验概率呢,先验概率就是一个人说某一个词或字的概率,比如我们一天中说“我吃米饭“”的次数比较多,那么它们的概率就比较大,而说“饭米吃我”的次数极少,那么它们的概率就小,那么这些概率就是所谓的先验概率,当似然函数也就是声学模型不能给我们提供足够的信息的时候,也就是P(W|X)很小的时候,我们就会通过先验概率P(W)来判断这个语音说的是什么,对于一段待识别语音,我们会更倾向与把它识别为“我吃米饭”而不是“饭米吃我”,当然这个我举的这个例子是一句话了,不是单个的孤立词,但是意思是一样的。那么,到目前为止,有关孤立词识别的内容就全部讲完了,接下来,将讲解连续语音识别的相关内容。

3.连续语音识别

什么是连续语音识别呢,我们把上面的孤立词都变成句子就是连续语音识别了。W和就不再表示一个词,而是表示一句话;同样的孤立词的似然也就是声学模型也变成了句子的声学模型,它可由一个个单词的声学模型串联起来,但是一定要保证顺序。最后的孤立词的先验概率P(W)也变成了句子的先验概率,也就是我们上面举的例子,“我吃米饭”与“饭米吃我”,哪一个更像我们正常人说的话,那么我们也称作句子的先验概率为语言模型。接下来,我们将详细介绍语言模型。

3.1 语言模型

在语言模型中,会经常用到链式法则,其实就是概率论中的乘法公式,即某一句话出现的概率等于第一个字出现概率乘以已知第一个字出现的条件下第二个字出现的概率乘以已知前两个字出现的概率下第三个字出现的概率依次类推。我们以“皮卡皮卡丘”这句话为例,链式法则用公式表示就是P(皮卡皮卡丘) = P(皮)*P(卡|皮)*P(皮|皮卡)*P(卡|皮卡皮)*P(丘|皮卡皮卡)。但是通常情况下,当我们说皮卡后,下一个字是皮的概率很小,也就是P(皮|皮卡)很小,而且不容易计算。为了解决问题,提出了n-gram模型,这是一种什么样的存在呢,也就是说每个词只与前n-1个词有关,当每个词只与前1个词有关时,我们称之为Bigram,这其实就跟Markov模型是一样的了,我们怎么计算这样的概率呢,这需要搜集大量的语料,以P(丘|卡)为例,我们需要搜集卡*出现的次数,然后搜集卡丘出现的次数,用卡丘出现的次数除以卡*的次数就是P(丘|卡);同样的,当每个词只与前两个词有关的时候,我们称之为Trigram。还有一些最大熵和神经网络的语言模型,它们比较复杂,我本人也不太懂,所以不多介绍。接下来,我们主要看下Bigram模型。

正如我上面所说的。Bigram实际上就是马尔可夫模型,下一个词只与当前词有关,可以可到,这里它不再像孤立词中的HMM一样,这里的模型它是双向,也称为是遍历的,它们之间的状态可以相互转移,上图为例,“皮”转移到“卡”的概率为0.5,转移到“丘”的概率为0.3,还是“皮”的概率为0.2。那么我们把语言模型看做一个马尔可夫模型有什么好处呢,其实这样的话,它就可以与单词的声学模型进行复合。什么意思呢,我们以上图中下边这个状态转移图为例进行简要的说明。如上图所示,把每个字都分成了3个状态,前两个状态只能在这个顺序字内转移,也就是说皮1不能直接到皮3或者到卡以及丘的内部状态中,但是第三个状态可以在字间或者字内转移。以皮3为例,假设皮3转移到自身的概率为0.6,那么它转移到其它转态的概率为0.4,这里的0.4包括字内转态转移和字间转态转移,因为字间转移只能由第三个状态完成,在这里也就是皮字转移到其它字只能由皮3完成,我们在上边那个三角形的转移图中可以看到,皮字转移到卡的概率为0.5,那么0.5*0.4 = 0.2就是皮3转移到卡1的概率;同样的0.3*0.4 = 0.12就是皮3转移到丘1的概率,0.4*0.2 = 0.08就是皮3转移到皮1的概率。因为语音信号的顺序问题,比如“卡”字的发音是按照卡1---卡2---卡3这样的顺序完成的,所以字间转移,也就是第三转态只能转移到本字或者其他字的第一状态。我们可以将待识别语音在复合模型中遍历,让待识别语音跟复合模型中的状态进行匹配,计算状态的观测概率,寻找最佳路径,然后将最佳路径上的单词按照顺序排列起来就得到了连续语音信号的识别。我们通常说的语音都是大词汇量的,那么我们该怎么去识别大词汇量的语音呢,继续往下看。

3.2 大词汇量

我们前边讲到的是为每一个单词训练单独的HMM,也就是每一个单词录不同的模板组成模型。但是语言库中的汉字或者单词都是上万级别的,如果为每个汉字或者单词都录入几个不同的模板的话,这样的工作量就太大了,所以这种方法是不可取的。我们知道汉语是按照拼音进行发音的,我们可以为字母表中的拼音训练HMM,同样的我们可以为英语中的音标训练HMM,这样我们就把每个单词训练的HMM变为了为每个因素训练HMM。这样之前原来的复合模型就变成了上图中更加庞大的一个复合模型,我我们得到了这个模型,那么我们应该怎么训练它呢,请继续往下看。

训练的过程和之前的训练是相同的,它在音素串内部的HMM仍然是单向的,我们还是采用EM算法。这里就不多说了,接下来就是解码的过程,当给定一门语言的解码器(这包括语言模型,词典(词典的作用就是把音素拼接为一个单词)和声学模型)和一条语音,我们就可以使用Viterbi算法求得最佳路径,最佳路径其实还是回归到概率问题,概率最大的路径就是最佳路径,路径上的单词就是识别的结果。那么我们就完成了大词汇量的连续语音信号的识别问题,接下来我们看看语音识别系统的一个整体结构框架。

3.3 语音识别系统结构

首先是将一段语音信号经过特征提取的操作后把信号变成了一个MFCC序列,特征提取也称为前端,那么后端主要是由解码器组成的,解码器又包括声学模型、词典和语言模型。声学模型也就是似然,它描述的是单词或者音素的发音情况,主要由GMM和HMM来完成,词典可以把音素拼接起来组成单词或者汉字,语言模型就是把单词整合成符合人类说话习惯的连续的语音,也就是把单词整合成一句话,最后将结果输出就是我们最终想要得到的识别结果。模型都有评价指标,这个模型到底好不好,我们该怎么去评价它呢,接下来我们就讲解语音识别系统的评价指标。

3.4 评价指标:WER


语音识别系统常用的额评价指标就是词错误率,英文是word error rate,简写为WER。那么怎么计算呢,PPT中写的很详细,我在这里就不多说了。例子也不说了。

我们可以看到,这张PPT中的对齐方式跟上一张不太一样,但是最终的词错误率是一样的,所以最优对齐方式不一定是唯一的。词错误率有一个缺陷就是它只能发现词是对是错,却不能说明词错误的程度,比如我说“小狗”,它识别成了“小巩”或者识别成“小猫”的词错误率都是50%,但是很明显,把“小狗”识别成“小猫”的错误程度更大,但是语音识别中还是通常使用词错误率作为评价指标而不会去在意那些细节性的东西。还有一点就是WER可能高于100%,这是因为你错的词的个数比正确的答案句子的长度还要多,这就会导致WER高于100%,如上边的例子所示。

这两幅PPT主要是讲解的WER的发展史,这里就不多做介绍。

4. 潘多拉魔盒

这么长时间内语音识别的框架没有发生改变,并不是说技术没有进步,只是人们把框图中的每个人部分更加优化了,解决的方法更好了。下面主要讲后端部分的优化。

4.1 上下文有关模型

上下文有关模型实际上就是在说同样的音素在前后音素发音不同时,中间的音素的发音也有微小的不同,上边的PPT以five和nine为例说明了这个问题,在英语中大约有50个音素,每个因素有3个状态的话,这样也就是有150个状态,但是有了上下文有关音素之后,这个音素受它的上一个音素、下一个音素以及它本身这三个音素的影响,每一个音素有50种情况,那么一种有50*50*50种情况,也就是125000种情况,这显然是非常多的。于是就有了上下文聚类的一种方法,这样最终的状态数会在几千的数量级,这对于我们来说还是可以接受的。

4.2 区分式训练

4.3 说话人适应

4.4 二次打分

5.结语

至此,语音识别技术前世今生之前世的内容就讲完了,下一篇文章将继续讲解语音识别技术前世今生之今生的内容。

语音识别技术的前世今生【今生篇】

 

参考文献

1、语音识别技术的前世今生:https://www.bilibili.com/video/av19158521/

2、傅里叶变换:https://zhuanlan.zhihu.com/p/19763358

3、徐亦达自频道:http://i.youku.com/i/UMzIzNDgxNTg5Ng==?spm=a2hzp.8253869.0.0
 

2014-02-26 10:24:58 tianshi_1105 阅读数 5757
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5915 人正在学习 去看看 杨波

如果你实在闲的蛋疼,不妨拿起你的 iPhone 用标准的四川话对 Siri 说,“放心巴适得很绝对正宗 ”,当然来自美帝国的 Siri 是不可能听明白四川话的(但她可以听懂粤语......)。事实上不仅是 Siri,市面上的语音助手类产品,几乎没有听得懂四川话的。不过这一现象将很快得到改善,科大讯飞率先发布了四川话语音识别技术

国内目前做方言识别技术的公司不多,其中最大困难就在于国内的方言实在是太多了,需要建立不同的识别模型。而且各个方言缺乏足够多的语料,训练不足,导致识别准确性不高。所以优先只能够解决使用人数比较多,或者是范围比较广的方言,例如很多语音类产品都可以识别粤语。

科大讯飞的解决办法是,主要是通过深度神经网络等技术,做出一个方言语音识别引擎,用于方言口音适配。同时跟国家语委合作,征集到了足够多的方言语音数据来训练识别引擎,通过大量的预料训练,提升方言识别的准确性。据科大讯飞宣称,他们的四川话语音识别引擎,识别准确率超过 85%。

据科大讯飞向36氪透露,四川话语音识别技术将率先应用于输入法产品,很快将发布支持四川话语音输入的讯飞输入法将。此前讯飞输入法已经支持普通话、英语、粤语语音输入。除了手机输入外,方言音识别技术还是有比较丰富的使用场景,例如语音驾驶导航、智能电视、可穿戴设备都用得上;甚至还可以成为教育教学、考试考评的公众平台;另外,在聆听京剧、川剧、昆曲、黄梅戏等戏曲时,提供普通话意思“翻译”......

虽然不像普通话这么有普世意义,但四川话总是有非常独特的魅力。而且据不完全统计,在全球大约有 1 亿 2 千万人说四川话,是一个非常庞大的群体。而且随着智能语音技术的普及,非要让四川的同学说普通话才能够享受到,这是非常不科学的...... 所以干脆研发四川话语音识别技术来得比较实在。

除了四川话,科大讯飞正在研发的东北话、上海话等方言语音识别技术也将在年内陆续发布。

【敬请添加微信公众帐号:数据堂 微信号:datatang】

没有更多推荐了,返回首页