2012-09-04 13:06:06 zouxy09 阅读数 47384
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波

语音识别的基础知识与CMUsphinx介绍

zouxy09@qq.com

http://blog.csdn.net/zouxy09

 

       语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的技术。

       基于语音识别芯片的嵌入式产品也越来越多,如Sensory公司的RSC系列语音识别芯片、Infineon公司的UnispeechUnilite语音芯片等,这些芯片在嵌入式硬件开发中得到了广泛的应用。在软件上,目前比较成功的语音识别软件有:NuanceIBMViavoiceMicrosoftSAPI以及开源软件HTK,这些软件都是面向非特定人、大词汇量的连续语音识别系统。

        语音识别本质上是一种模式识别的过程,未知语音的模式与已知语音的参考模式逐一进行比较,最佳匹配的参考模式被作为识别结果。

        语音识别的目的就是让机器赋予人的听觉特性,听懂人说什么,并作出相应的动作。目前大多数语音识别技术是基于统计模式的,从语音产生机理来看,语音识别可以分为语音层和语言层两部分。

        当今语音识别技术的主流算法,主要有基于动态时间规整(DTW)算法、基于非参数模型的矢量量化(VQ)方法、基于参数模型的隐马尔可夫模型(HMM)的方法、基于人工神经网络(ANN)和支持向量机等语音识别方法。

 

语音识别分类:

根据对说话人的依赖程度,分为:

1)特定人语音识别(SD):只能辨认特定使用者的语音,训练→使用。

2)非特定人语音识别(SI):可辨认任何人的语音,无须训练。

根据对说话方式的要求,分为:

1)孤立词识别:每次只能识别单个词汇。

2)连续语音识别:用者以正常语速说话,即可识别其中的语句。

 

        语音识别系统的模型通常由声学模型和语言模型两部分组成,分别对应于语音到音节概率的计算和音节到字概率的计算。

 

         Sphinx是由美国卡内基梅隆大学开发的大词汇量、非特定人、连续英语语音识别系统。一个连续语音识别系统大致可分为四个部分:特征提取,声学模型训练,语言模型训练和解码器。

1)预处理模块:

       对输入的原始语音信号进行处理,滤除掉其中的不重要的信息以及背景噪声,并进行语音信号的端点检测(找出语音信号的始末)、语音分帧(近似认为在10-30ms内是语音信号是短时平稳的,将语音信号分割为一段一段进行分析)以及预加重(提升高频部分)等处理。

2)特征提取:

        去除语音信号中对于语音识别无用的冗余信息,保留能够反映语音本质特征的信息,并用一定的形式表示出来。也就是提取出反映语音信号特征的关键特征参数形成特征矢量序列,以便用于后续处理。

        目前的较常用的提取特征的方法还是比较多的,不过这些提取方法都是由频谱衍生出来的。Mel频率倒谱系数(MFCC)参数因其良好的抗噪性和鲁棒性而应用广泛。在sphinx中也是用MFCC特征的。MFCC的计算首先用FFT将时域信号转化成频域,之后对其对数能量谱用依照Mel刻度分布的三角滤波器组进行卷积,最后对各个滤波器的输出构成的向量进行离散余弦变换DCT,取前N个系数。

       在sphinx中,用帧frames去分割语音波形,每帧大概10ms,然后每帧提取可以代表该帧语音的39个数字,这39个数字也就是该帧语音的MFCC特征,用特征向量来表示。

3)声学模型训练:

      根据训练语音库的特征参数训练出声学模型参数。在识别时可以将待识别的语音的特征参数同声学模型进行匹配,得到识别结果。

      目前的主流语音识别系统多采用隐马尔可夫模型HMM进行声学模型建模。声学模型的建模单元,可以是音素,音节,词等各个层次。对于小词汇量的语音识别系统,可以直接采用音节进行建模。而对于词汇量偏大的识别系统,一般选取音素,即声母,韵母进行建模。识别规模越大,识别单元选取的越小。(关于HMM,网上有很多经典的解说,例如《HMM学习最佳范例》和《隐马尔科夫模型(hmm)简介》等,不了解的可以去看看)

         HMM是对语音信号的时间序列结构建立统计模型,将其看作一个数学上的双重随机过程:一个是用具有有限状态数的Markov链来模拟语音信号统计特性变化的隐含(马尔可夫模型的内部状态外界不可见)的随机过程,另一个是与Markov链的每一个状态相关联的外界可见的观测序列(通常就是从各个帧计算而得的声学特征)的随机过程。

        人的言语过程实际上就是一个双重随机过程,语音信号本身是一个可观测的时变序列,是由大脑根据语法知识和言语需要(不可观测的状态)发出的音素的参数流(发出的声音)。HMM合理地模仿了这一过程,是较为理想的一种语音模型。用HMM刻画语音信号需作出两个假设,一是内部状态的转移只与上一状态有关,另一是输出值只与当前状态(或当前的状态转移)有关,这两个假设大大降低了模型的复杂度。

       语音识别中使用HMM通常是用从左向右单向、带自环、带跨越的拓扑结构来对识别基元建模,一个音素就是一个三至五状态的HMM,一个词就是构成词的多个音素的HMM串行起来构成的HMM,而连续语音识别的整个模型就是词和静音组合起来的HMM

4)语言模型训练:

       语言模型是用来计算一个句子出现概率的概率模型。它主要用于决定哪个词序列的可能性更大,或者在出现了几个词的情况下预测下一个即将出现的词语的内容。换一个说法说,语言模型是用来约束单词搜索的。它定义了哪些词能跟在上一个已经识别的词的后面(匹配是一个顺序的处理过程),这样就可以为匹配过程排除一些不可能的单词。

       语言建模能够有效的结合汉语语法和语义的知识,描述词之间的内在关系,从而提高识别率,减少搜索范围。语言模型分为三个层次:字典知识,语法知识,句法知识

         对训练文本数据库进行语法、语义分析,经过基于统计模型训练得到语言模型。语言建模方法主要有基于规则模型和基于统计模型两种方法。统计语言模型是用概率统计的方法来揭示语言单位内在的统计规律,其中N-Gram模型简单有效,被广泛使用。它包含了单词序列的统计。

          N-Gram模型基于这样一种假设,第n个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram

         Sphinx中是采用二元语法和三元语法的统计语言概率模型,也就是通过前一个或两个单词来判定当前单词出现的概率P(w2| w1)P(w3| w2, w1)

5)语音解码和搜索算法:

       解码器:即指语音技术中的识别过程。针对输入的语音信号,根据己经训练好的HMM声学模型、语言模型及字典建立一个识别网络,根据搜索算法在该网络中寻找最佳的一条路径,这个路径就是能够以最大概率输出该语音信号的词串,这样就确定这个语音样本所包含的文字了。所以解码操作即指搜索算法:是指在解码端通过搜索技术寻找最优词串的方法。

        连续语音识别中的搜索,就是寻找一个词模型序列以描述输入语音信号,从而得到词解码序列。搜索所依据的是对公式中的声学模型打分和语言模型打分。在实际使用中,往往要依据经验给语言模型加上一个高权重,并设置一个长词惩罚分数。当今的主流解码技术都是基于Viterbi搜索算法的,Sphinx也是。

       基于动态规划的Viterbi算法在每个时间点上的各个状态,计算解码状态序列对观察序列的后验概率,保留概率最大的路径,并在每个节点记录下相应的状态信息以便最后反向获取词解码序列。Viterbi算法本质上是一种动态规划算法,该算法遍历HMM状态网络并保留每一帧语音在某个状态的最优路径得分。

        连续语音识别系统的识别结果是一个词序列。解码实际上是对词表的所有词反复搜索。词表中词的排列方式会影响搜索的速度,而词的排列方式就是字典的表示形式。Sphinx系统中采用音素作为声学训练单元,通常字典就用来记录每个单词由哪些个音素组成,也可以理解为对每个词的发音进行标注

         N-best搜索和多遍搜索:为在搜索中利用各种知识源,通常要进行多遍搜索,第一遍使用代价低的知识源(如声学模型、语言模型和音标词典),产生一个候选列表或词候选网格,在此基础上进行使用代价高的知识源(如4阶或5阶的N-Gram4阶或更高的上下文相关模型)的第二遍搜索得到最佳路径。

 

对于语音识别过程个人的理解:

      例如我对电脑说:“帮我打开“我的电脑”!”然后电脑得理解我说了什么,然后再执行打开“我的电脑”的操作,那怎么实现呢?

       这个得预先有一个工作,就是电脑得先学会“帮我打开“我的电脑”!”这句语音(实际上是一个波形)所代表的文字就是“帮我打开“我的电脑”!”这句词串。那么如何让它学会呢?

       如果以音节(对汉语来说就是一个字的发音)为语音基元的话,那么电脑就是一个字一个字地学习,例如“帮”字、“我”字等等,那么“帮”字怎么学习呢?也就是说电脑接收到一个“帮”字的语音波形,怎么分析理解才知道它代表的是“帮”字呢?首先我们需要建立一个数学模型来表示这个语音。因为语音是连续的不平稳的信号,但是在短的时间内可以认为是平稳的,所以我们需要分割语音信号为一帧一帧,假如大概25ms一帧,然后为了让每一帧平稳过渡,我们就让每帧见存在重叠,假如重叠10ms。这样每帧的语言信号就是平稳的了,再从每帧语音信号中提取反映语音本质特征的信息(去除语音信号中对于语音识别无用的冗余信息,同时达到降维)。那么采用什么特征最能表达每一帧的语音呢?MFCC是用的比较多的一种,这里不介绍了。然后我们就提取每一帧语音的MFCC特征,得到了是一系列的系数,大概四五十个这样,sphinx中是39个数字,组成了特征向量。好,那么我们就通过39个数字来描述每一帧的语音了,那不同的语音帧就会有不同的39个数字的组合,那我们用什么数学模型去描述这39个数字的分布情况呢?这里我们可以用一个混合高斯模型来表示着39个数字的分布,而混合高斯模型就存在着两个参数:均值和方差;那么实际上每一帧的语音就对应着这么一组均值和方差的参数了。呵呵,挺啰嗦的啊。

       好了,这样“帮”字的语音波形中的一帧就对应了一组均值和方差(HMM模型中的观察序列),那么我们只需要确定“帮”字(HMM模型中的隐含序列)也对应于这一组均值和方差就可以了。那么后者是怎么对应的呢?这就是训练的作用了!我们知道描述一个HMM模型需要三个参数:初始状态概率分布π、隐含状态序列的转移矩阵A(就是某个状态转移到另一个状态的概率观察序列中的这个均值或者方差的概率)和某个隐含状态下输出观察值的概率分布B(也就是某个隐含状态下对应于);而声学模型可以用HMM模型来建模,也就是对于每一个建模的语音单元,我们需要找到一组HMM模型参数(π,AB)就可以代表这个语音单元了。那么这三个参数怎么确定呢?训练!我们给出一个语音的数据库,指明说这个语音代表这个词,然后让电脑去学习,也就是对数据库进行统计,得到(π,AB)这三个参数。

         好了,一个字(建模单元)的声学模型建立了。那汉语是不是有很多个字啊,那我们就得对每一个建立声学模型了。假设就有几千个模型,然后每个模型就有了三个或者5HMM状态,那么如果你说的句子有10个字,那我们就得搜索这所有可能的模型去匹配你的语音,那是多么大的搜索空间了,这非常耗时。那我们就需要采用一个比较优的搜索算法了(这里是Viterbi-Beam算法),它每搜索到一个状态点,就保留概率最大的,然后舍弃之前的状态点,这样就裁剪了很多的搜索路径,但因为忽略了之前的路径,所以它就只能得到一个局部的最优解。

        那假如出现以下情况呢?例如,Its a nice day,从语音上可能会被识别为:It sun niced A,或者是It son ice day。从声学模型来看它是无法区别这些结果,因为其不同之处只是在于每个单词的边界划分位置不同造成的。这时候语言模型就该闪亮登场了,从语义上判断那个结果出现的概率最大,即为搜索结果。语言模型N-Gram基于这样一种假设,第n个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。这样就可以约束搜索,增加识别的准确率了。

 

       好了,有点啰嗦啊,我也是前几天为了要将语音识别加入到我的人机交互系统,然后才去了解语音识别的,所以可能理解不是很正确,希望各位不吝指正!谢谢

 

对于一些语音的基本概念我翻译了CMUsphinxwiki的部分,具体见:

http://blog.csdn.net/zouxy09/article/details/7941055

 

补充的一些概念:(整理自百度百科)

音节:

      音节是听觉能感受到的最自然的语音单位,有一个或几个音素按一定规律组合而成。

汉语音节:

       汉语中一个汉字就是一个音节,每个音节由声母、韵母和声调三个部分组成;汉语普通话中的无调音节(不做音调区分)共有400个音节。拼音是拼读音节的过程,就是按照普通话音节的构成规律,把声母、韵母、声调急速连续拼合并加上声调而成为一个音节。如:q-i-ángqiáng(强)。

 

英语音节:

        音节是读音的基本单位,任何单词的读音,都是分解为一个个音节朗读。英语中一个元音音素可构成一个音节,一个元音音素和一个或几个辅音音素结合也可以构成一个音节。英语的词有一个音节的,两个音节的,多个音节的。一个音节叫单音节词,两个音节叫双音节词,三个音节以上叫多音节。如:take拿,ta'ble 桌子,pota'to马铃薯,popula'tion人口,congratula'tion祝贺。telecommunica'tion电讯。

        元音音素是构成音节的主体,辅音是音节的分界线。每个元音音素都可以构成一个音节,如:bed床,bet 打赌。两个元音音素都可以构成一个音节,如:seat坐位,beat 毒打,beast极好的。两元音音素之间有一个辅音音素时,辅音音素归后一音节,如:stu'dent学生,la'bour 劳动。有两个辅音音素时,一个辅音音素归前一音节,一个归后一音节,如: win'ter冬天 fa'ther 父亲,tea'cher教师。

 

音素:

         音素是根据语音的自然属性划分出来的最小语音单位。从声学性质来看,音素是从音质角度划分出来的最小语音单位。从生理性质来看,一个发音动作形成一个音素。如〔ma〕包含〔m〕〔a〕两个发音动作,是两个音素。相同发音动作发出的音就是同一音素,不同发音动作发出的音就是不同音素。如〔ma-mi〕中,两个〔m〕发音动作相同,是相同音素,〔a〕〔i〕发音动作不同,是不同音素。

 

汉语音素:

        音节只是最自然的语音单位,而音素是最小的语音单位音素。汉语包括10个元音,22个辅音,总共有32个。一个音节,至少有一个音素,至多有四个音素。如“普通话”,由三个音节组成(每个字一个音节),可以分析成“p,u,t,o,ng,h,u,a”八个音素。

 

英语音素:

      记录英语音素的符号叫做音标。英语国际音标共有48个音素,其中元音音素20个,辅音音素28个。英语辅音和元音在语言中的作用,就相当于汉语中的声母和韵母。

 

语料:

        通常,在统计自然语言处理中实际上不可能观测到大规模的语言实例。所以,人们简单地用文本作为替代,并把文本中的上下文关系作为现实世界中语言的上下文关系的替代品。我们把一个文本集合称为语料库(Corpus),当有几个这样的文本集合的时候,我们称之为语料库集合(Corpora)。语料库通常指为语言研究收集的、用电子形式保存的语言材料,由自然出现的书面语或口语的样本汇集而成,用来代表特定的语言或语言变体。

语料库就是把平常我们说话的时候的句子、一些文学作品的语句段落、报刊杂志上出现过的语句段落等等在现实生活中真实出现过的语言材料整理在一起,形成一个语料库,以便做科学研究的时候能够从中取材或者得到数据佐证。

例如我如果想写一篇关于“给力”这个词的普及性的文章,就可以到语料库中查询这个词出现的频率、用法等等。

 

Reference

王韵,基于Sphinx的汉语连续语音识别,太原理工大学,硕士学位论文

2018-04-22 23:57:26 xm1076709179 阅读数 1881
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波

语音识别就是将包含文字信息的语音通过计算机转化成文字的过程,也叫语音转写,英文叫automatic speech recognition(ASR)或者 speech to text(STT),语音识别框架一般如图所示:
这里写图片描述
从上图中可以看出,语音识别技术是一个复杂的多学科交叉技术,涉及到信号处理、统计、机器学习、语言学、数据挖掘、生理学等知识。一个完整的语音识别系统声学方面和语言学方面。声学方面包括从最初的语音信号获取(这其中包括将语音转化成电信号)到语音信号处理(包括模数转换,降噪、增强、端点检测(VAD)等),再到特征提取(MFCC、FB、PLP、BN等),最后到声学模型建模;语言学方面包括字典(词典)构造,语言模型建模等。通过建立的声学模型和语言模型就可以对输入的测试语音进行解码,得到相对应的文字。

解码原理(基于最大后验概率MAP)

假设我们有一段语音X(通常是提取的特征),要得到对应的文本W,就是求使得概率p(W|X)最大的W的过程,即求

W¯=argmaxWp(W|X)

利用条件概率公式和贝叶斯公式将上述公式转化为
W¯=argmaxWp(W,X)p(X)=argmaxWp(X|W)p(W)p(X)

p(X)表示声学观测序列的概率,不管选择解码空间中的哪一条路径,一段语音发出来后p(X)就确定了,是一个未知的常数,虽然这个概率很难估计,但是并不会影响到W¯的取值,因此,上式可以简化为
W¯=argmaxWp(X|W)p(W)

该公式就是解码的核心公式了,下面对该公式做一个简单解读
其中第一项p(X|W)就是我们的声学模型,准确的说,这个概率可以通过声学模型和词典(Lexicon)计算得到,第二项就是我们的语言模型,该怎么理解呢?
从概率上看,p(X|W)表示在给定文本W的情况下,求“生成”语音X的概率,就是说,我们之所以说某一句话而不会说其他话,是因为在说这句话之前,脑海里肯定有我们想表达的内容(这里内容就可以理解成文本W),然后,调动发声器官发出语音X,因此,语音识别的目标就是通过发出的语音X去猜测说这句话到底表达什么内容W
p(W)就是我们的先验概率,为什么这么说,因为它不依赖于我们给定的语音X,而是由经验得出的,具体的,可以理解为人类发展到现在所总结出来的语法知识,更通俗一点就是人类的表达习惯。举个例子,我们通常会说“上床睡觉”而不会说“上床上班”。这个概率可以由语言模型得到。
要使得p(X|W)p(W)最大,一方面需要文字表达尽量符合语法习惯(即p(W)尽量大),另一方面需要识别出来的文字尽量和发出的语音相符(即p(X|W)尽量大),就是说,在解码空间里(解码空间后续会说,简单理解为不同词之间有多种组合方式,不同的组合方式构成不同的W),可能有很多种组合都符合语法习惯,但是有些就和发出的语音不太吻合,例如,我们说一句话“我下班坐地铁回家”,其中有三个不同的识别结果:
1.我下班坐公交回家
2.我坐地铁回家
3.我下班坐地铁回家
显然,上述三种识别结果都符合语法习惯,但是前两种识别结果都存在误识(替换错误,后续会讲)或信息丢失(删除错误,后续会讲),即语音中所表达的信息没有被完全识别出来,因此声学模型的得分p(X|W)就没有第3种识别结果得分高。
好了,语音识别的介绍就到这里,具体如何对声学模型和语言模型进行建模,以及解码等内容在后续进行介绍。

ps:哪位大神能教我怎样用LaTexW写到argmax下面去吗,这样看着好别扭

2016-08-27 09:20:28 xiao_jin 阅读数 1995
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波

最近学习过程中整理的语音识别的基础知识的笔记


       语音识别本质上是一种模式识别的过程,未知语音的模式与已知语音的参考模式逐一进行比较,最佳匹配的参考模式被作为识别结果。

       当今语音识别技术的主流算法,主要有基于动态时间规整(DTW)算法、基于非参数模型的矢量量化(VQ)方法、基于参数模型的隐马尔可夫模型(HMM)的方法、基于人工神经网络(ANN)和支持向量机等语音识别方法。

一 .  语音识别分类:

根据对说话人的依赖程度 :

      1)特定人语音识别(SD):只能辨认特定使用者的语音,训练→使用。

      2) 非特定人语音识别(SI):可辨认任何人的语音,无须训练。

根据对说话方式的要求 :

     1)孤立词识别:每次只能识别单个词汇。

     2)连续语音识别:用者以正常语速说话,即可识别其中的语句。


二.  语音识别系统的基本流程

1)预处理模块:

         对输入的原始语音信号进行处理,滤除掉其中的不重要的信息以及背景噪声,

         语音信号的端点检测(找出语音信号的始末)、

         语音分帧(近似认为在10-30ms内是语音信号是短时平稳的,将语音信号分割为一段一段进行分析)

         预加重(提升高频部分)等处理

2)特征提取:

        去除语音信号中对于语音识别无用的冗余信息,保留能够反映语音本质特征的信息,并用一定的形式表示出来。

        目前的较常用的提取特征的方法还是比较多的,不过这些提取方法都是由频谱衍生出来的。

          梅尔频率倒谱系数(MFCC)参数因其良好的抗噪性和鲁棒性而应用广泛。MFCC 的计算首先用FFT将时域信号转化成频域,之后对其对数能量谱用依照Mel刻度分布的三角滤波器组进行卷积,最后对各个滤波器的输出构成的向量进行离散余弦变换DCT,取前N个系数。

        CMUsphinx中也是用MFCC特征的,用帧frames去分割语音波形,每帧大概10ms,然后每帧提取可以代表该帧语音的39个数字,这39个数字也就是该帧语音的MFCC特征,用特征向量来表示。


3)声学模型训练:

         根据训练语音库的特征参数训练出声学模型参数。在识别时可以将待识别的语音的特征参数同声学模型进行匹配,得到识别结果。

         目前的主流语音识别系统多采用隐马尔可夫模型HMM进行声学模型建模。声学模型的建模单元,可以是音素,音节,词等各个层次。对于小词汇量的语音识别系统,可以直接采用音节进行建模。而对于词汇量偏大的识别系统,一般选取音素,即声母,韵母进行建模。识别规模越大,识别单元选取的越小。(《HMM学习最佳范例》、《隐马尔科夫模型(hmm)简介》、《一文搞懂HMM》)

(4)语言模型训练:

          语言模型是用来计算一个句子出现概率的概率模型。

          语言建模能够有效的结合汉语语法和语义的知识,描述词之间的内在关系,从而提高识别率,减少搜索范围。语言模型分为三个层次:字典知识,语法知识,句法知识。

         对训练文本数据库进行语法、语义分析,经过基于统计模型训练得到语言模型。

         语言建模方法主要有基于规则模型和基于统计模型两种方法。统计语言模型是用概率统计的方法来揭示语言单位内在的统计规律,其中N-Gram模型简单有效,被广泛使用。它包含了单词序列的统计。

          N-Gram模型基于这样一种假设,第n个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram

         Sphinx中是采用二元语法和三元语法的统计语言概率模型,也就是通过前一个或两个单词来判定当前单词出现的概率P(w2| w1)P(w3| w2, w1)


5)语音解码和搜索算法:

        解码器:

        1.  解码端通过搜索技术寻找最优词串的方法。

        2.  连续语音识别中的搜索,就是寻找一个词模型序列以描述输入语音信号,从而得到词解码序列。

        3.  基于动态规划的Viterbi算法,在每个时间点上的各个状态,计算解码状态序列对观察序列的后验概率,并在每个节点记录下相应的状态信息以便最后反向获取词解码序列。Viterbi算法本质上是一种动态规划算法,该算法遍历HMM状态网络并保留每一帧语音在某个状态的最优路径得分。

         搜索算法 :

           N-best搜索和多遍搜索:为在搜索中利用各种知识源,通常要进行多遍搜索,第一遍使用代价低的知识源(如声学模型、语言模型和音标词典),产生一个候选列表或词候选网格,在此基础上进行使用代价高的知识源(如4阶或5阶的N-Gram4阶或更高的上下文相关模型)的第二遍搜索得到最佳路径。

顺便记录了一下语音识别基础知识的思维导图如下 :




2019-07-24 21:57:01 alice_tl 阅读数 178
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波

最近在学习语音识别的一些知识,做了一些笔记,这篇文章讲讲语音识别的发展,以及相关的几个容易混淆的概念。

 

语音识别的背景

从物理声音被转换为电信号,再通过模数转换器转换为数据。一旦被数字化,就可适用若干种模型。语音识别的技术,就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的技术。

 

发展阶段

50年代:贝尔实验室开始语音识别的研究,主要研究基于简单的孤立词的语音识别系统。实现针对特定说话人的十个英文数字的孤立词语音识别系统。

60年代:出现三个关键的技术,提出一种时间规整的机制,采用动态规划算法实现动态时间规整DTW技术,利用音素动态跟踪的方法进行连续语音识别的开创性工作。为语音识别的后来发展奠定了基础。

70年代:语音识别技术快速发展的时期。实现大规模语音识别,大词汇量,孤立词识别。

80年代:基于隐马尔科夫模型的声学建模和基于n.gram的语言模型。尝试大词汇量、非特定人连续语音识别。

90年代:语音识别技术基本成熟的时期,基于GMM-HMM的语音识别框架得到广泛使用和研究。

20年代初期:语音识别并没有得到非常好的应用,因为系统的错误率还很高。2006年开始再度兴起。

 

学科基础

通信基础知识和信号处理、声学基本知识和特征、概率论和信息论、统计学、机器学习等等。

 

相关概念

语音识别

简称ASR(Automatic,Speech,Recognition),将声学语音进行分析,并得到对应的文字或拼音信息。

自然语言处理

简称NLP(Neuro-linguistic programming),用于将用户的语音转换为结构化的、机器可以理解的语言。

语音唤醒

简称KWS(keyword spotting),技术通过在设备或软件中预置唤醒词,当用户发出该语音指令时,设备便从休眠状态中被唤醒,并响应指令。

语音合成

简称TTS(Text To Speech),即将文本转换成语音,实现让机器说话。

声纹识别

简称VPR(Voice Print Recognition),根据说话人的声波特性进行身份辨识的服务,是生物识别技术的一种。

 

区别与联系

应用场景的区别

语音识别、声纹识别、自然语言处理,以及语音合成四者的目的和应用场景是不同的。

类型

简称

目的

应用场景

语音识别

ASR

语音——》文字

生成字幕、智慧会场、语音唤醒、智能客服

声纹识别

VPR

识别说话人的身份

身份认证、公安刑侦

语音唤醒

KWS

语音——》指令

小度音箱、小爱音箱

语音合成

TTS

文字——》语音

智能音箱

语言处理

NLP

语音——》语言

同声翻译、自动阅卷

以小米音箱为例(来自MTSC大会上小米工程师的分享)。

 

在四个阶段里,输入和输出分别是下方的内容:

阶段

唤醒KWS

语音识别ASR

语音处理NLP

语音播报TTS

IN

关键字语音

用户指令语音

用户指令文字

播报文字

OUT

是否唤醒

文字

应对处理+播报文字

播报语音

示例

小爱同学

回复我在

现在几点了

Domin:time

Intention:current time

To_speek:现在时间是九点

播放MP3音频:现在时间是九点

出于保护用户隐私和减少误识别两个因素的考虑,智能音箱一般在检测到唤醒词之后,才会开始进一步的复杂信号处理(声源定位、波束形成)和后续的语音交互过程。

一般而言,唤醒模块是一个小型语音识别引擎。由于语音唤醒的目标单一(检测出指定的唤醒词),唤醒只需要较小的声学模型和语言模型来区分出有无唤醒词出现),声学评分和解码可以很快,空间占用少,能够在本地实时。

所以讲到这里,亚马逊的音响半夜突然启动和开始说话,就不奇怪了~

 

语音识别与声纹识别的区别

最多人容易将语音识别和声纹识别混淆。

声纹识别和语音识别在原理上一样,都是通过对采集到的语音信号进行分析和处理,提取相应的特征或建立相应的模型,然后据此做出判断。但语音识别是从不同人的词语信号中寻找共同因素,声纹识别是通过语音波形中反映说话人生理和行为特征的语音参数。

声纹识别一般会连接到公安部的声纹数据库,鉴别人的身份。所承载的功能特点和人脸识别是一样的,都是为了证明,“你是张三,还是李四”。所以声纹识别不注重语音信号的语义,而是从语音信号中提取个人声纹特征,挖掘出包含在语音信号中的个性因素。

 

语音识别的分类

按使用范围分类

从语音识别的使用范围分类,可分为封闭域识别和开放域识别,具体概念及优劣如下方表格:

范围

概念

算法

应用场景

提供形式

封闭域识别

以预先指定的字/词集合为识别范围,对范围之外的语音会拒识

声学模型和语言模型进行裁剪,使得识别引擎的运算量变小

不涉及到多轮交互和多种语义说法的场景。

如电视盒子,智能音箱

一般将引擎封到嵌入式芯片或者本地化的SDK中,从而使识别过程完全脱离云端,摆脱对网络的依赖,并且不会影响识别率

开放域识别

无需预先指定识别词集合,在整个语言大集合范围中进行识别

声学模型和语音模型一般都比较大,引擎运算量也较大

实时性要求不高的客服语音质检,录制完的视频转字幕配置等。如会议字幕系统

基本上都只以云端形式提供(云端包括公有云形式和私有云形式),依赖于网络

按识别对象分类

根据识别的对象不同,语音识别任务大体可分为三类,孤立词识别、关键词识别、连续语音识别。

范围

概念

应用场景

孤立词识别

识别事先已知的孤立的词

如“开机”、“关机”等

关键词识别

检测针对的是连续语音,但它并不识别全部文字,而只是检测已知的若干关键词在何处出现

如在一段话中检测“计算机”、“世界”这两个词

连续语音识别

识别任意的连续语音,

如一个句子或一段话

按发音人分类

根据发音人,可以把语音识别技术分为特定人语音识别和非特定人语音识别。

特定人语音识别(SD)只能识别一个或几个人的语音。

非特定人语音识别(SI)可以被任何人使用系统,更符合实际需要,但要比针对特定人的识别困难得多。

2018-09-05 11:41:00 weixin_30385925 阅读数 12
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波

最近由于项目需要,学习了语音识别的一些知识。

语音识别最主要的就是傅里叶变化,把变化的时域特征转化成静态的频域特征,进而从频域上来进行声音的提取;

基本思路如下:每一时刻的频域特征可以转化成一个向量,[低频,,,,,,高频]  每一维度为对应的能量特征;这样就可以对声音进行建模了;

刚学习的包:

        pyAudioAnalysis   可以提取声音特征

转载于:https://www.cnblogs.com/GY-Zhu/p/9591229.html

语音识别知识树

阅读数 16

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