2019-04-12 10:21:44 king_audio_video 阅读数 3554
  • Python全栈视频教程

    Python全栈视频培训教程,帮助开发者从零到一入门python:1.深入理解python语法机制与底层原理,2.深入实战python各种案例 , 3.语音识别,图形界面,多线程爬虫,语音合成,游戏控制等等精彩案例。

    213933 人正在学习 去看看 尹成

                             语音识别技术简述(概念->原理)

目录

语音识别技术简述(概念->原理)

语音识别概念

语音识别原理

语音识别技术简介

   1.动态时间规整(DTW)

   2.支持向量机(SVM)

    3.矢量量化(VQ)

   4.隐马尔科夫模型(HMM)

   5.高斯混合模型(GMM)

   6.人工神经网络(ANN/BP)

 7.深度神经网络/深信度网络-隐马尔科夫(DNN/DBN-HMM)

  8.循环神经网络(RNN)

    9.长短时记忆模块(LSTM)

    10.卷积神经网络(CNN)

识别技术的发展方向

参考文献:


本内容部分原创,因作者才疏学浅,偶有纰漏,望不吝指出。本内容由灵声讯音频-语音算法实验室整理创作,转载和使用请与“灵声讯”联系,联系方式:音频/识别/合成算法QQ群(696554058)


  • 语音识别概念

语音识别技术就是让智能设备听懂人类的语音。它是一门涉及数字信号处理、人工智能、语言学、数理统计学、声学、情感学及心理学等多学科交叉的科学。这项技术可以提供比如自动客服、自动语音翻译、命令控制、语音验证码等多项应用。近年来,随着人工智能的兴起,语音识别技术在理论和应用方面都取得大突破,开始从实验室走向市场,已逐渐走进我们的日常生活。现在语音识别己用于许多领域,主要包括语音识别听写器、语音寻呼和答疑平台、自主广告平台,智能客服等。

  • 语音识别原理

语音识别的本质是一种基于语音特征参数的模式识别,即通过学习,系统能够把输入的语音按一定模式进行分类,进而依据判定准则找出最佳匹配结果。目前,模式匹配原理已经被应用于大多数语音识别系统中。如图1是基于模式匹配原理的语音识别系统框图。

 一般的模式识别包括预处理,特征提取,模式匹配等基本模块。如图所示首先对输入语音进行预处理,其中预处理包括分帧,加窗,预加重等。其次是特征提取,因此选择合适的特征参数尤为重要。常用的特征参数包括:基音周期,共振峰,短时平均能量或幅度,线性预测系数(LPC),感知加权预测系数(PLP),短时平均过零率,线性预测倒谱系数(LPCC),自相关函数,梅尔倒谱系数(MFCC),小波变换系数,经验模态分解系数(EMD),伽马通滤波器系数(GFCC)等。在进行实际识别时,要对测试语音按训练过程产生模板,最后根据失真判决准则进行识别。常用的失真判决准则有欧式距离,协方差矩阵与贝叶斯距离等。

                                             

                                                                                                 图1. 语音识别原理架图

  • 语音识别技术简介

从语音识别算法的发展来看,语音识别技术主要分为三大类,第一类是模型匹配法,包括矢量量化(VQ) 、动态时间规整(DTW)等;第二类是概率统计方法,包括高斯混合模型(GMM) 、隐马尔科夫模型(HMM)等;第三类是辨别器分类方法,如支持向量机(SVM) 、人工神经网络(ANN)和深度神经网络(DNN)等以及多种组合方法。下面对主流的识别技术做简单介绍:

   1.动态时间规整(DTW)

语音识别中,由于语音信号的随机性,即使同一个人发的同一个音,只要说话环境和情绪不同,时间长度也不尽相同,因此时间规整是必不可少的。DTW是一种将时间规整与距离测度有机结合的非线性规整技术,在语音识别时,需要把测试模板与参考模板进行实际比对和非线性伸缩,并依照某种距离测度选取距离最小的模板作为识别结果输出。动态时间规整技术的引入,将测试语音映射到标准语音时间轴上,使长短不等的两个信号最后通过时间轴弯折达到一样的时间长度,进而使得匹配差别最小,结合距离测度,得到测试语音与标准语音之间的距离。

   2.支持向量机(SVM)

支持向量机是建立在VC维理论和结构风险最小理论基础上的分类方法,它是根据有限样本信息在模型复杂度与学习能力之间寻求最佳折中。从理论上说,SVM就是一个简单的寻优过程,它解决了神经网络算法中局部极值的问题,得到的是全局最优解。SVM已经成功地应用到语音识别中,并表现出良好的识别性能。

    3.矢量量化(VQ)

矢量量化是一种广泛应用于语音和图像压缩编码等领域的重要信号压缩技术,思想来自香农的率-失真理论。其基本原理是把每帧特征矢量参数在多维空间中进行整体量化,在信息量损失较小的情况下对数据进行压缩。因此,它不仅可以减小数据存储,而且还能提高系统运行速度,保证语音编码质量和压缩效率,一般应用于小词汇量的孤立词语音识别系统。

   4.隐马尔科夫模型(HMM)

隐马尔科夫模型是一种统计模型,目前多应用于语音信号处理领域。在该模型中,马尔科夫(Markov)链中的一个状态是否转移到另一个状态取决于状态转移概率,而某一状态产生的观察值取决于状态生成概率。在进行语音识别时,HMM首先为每个识别单元建立发声模型,通过长时间训练得到状态转移概率矩阵和输出概率矩阵,在识别时根据状态转移过程中的最大概率进行判决。

   5.高斯混合模型(GMM)

高斯混合模型是单一高斯概率密度函数的延伸,GMM能够平滑地近似任意形状的密度分布。高斯混合模型种类有单高斯模型(Single Gaussian Model, SGM)和高斯混合模型(Gaussian Mixture Model, GMM)两类。类似于聚类,根据高斯概率密度函数(Probability Density Function, PDF)参数不同,每一个高斯模型可以看作一种类别,输入一个样本x,即可通过PDF计算其值,然后通过一个阈值来判断该样本是否属于高斯模型。很明显,SGM适合于仅有两类别问题的划分,而GMM由于具有多个模型,划分更为精细,适用于多类别的划分,可以应用于复杂对象建模。目前在语音识别领域,GMM需要和HMM一起构建完整的语音识别系统。

   6.人工神经网络(ANN/BP)

人工神经网络由20世纪80年代末提出,其本质是一个基于生物神经系统的自适应非线性动力学系统,它旨在充分模拟神经系统执行任务的方式。如同人的大脑一样,神经网络是由相互联系、相互影响各自行为的神经元构成,这些神经元也称为节点或处理单元。神经网络通过大量节点来模仿人类神经元活动,并将所有节点连接成信息处理系统,以此来反映人脑功能的基本特性。尽管ANN模拟和抽象人脑功能很精准,但它毕竟是人工神经网络,只是一种模拟生物感知特性的分布式并行处理模型。ANN的独特优点及其强大的分类能力和输入输出映射能力促成在许多领域被广泛应用,特别在语音识别、图像处理、指纹识别、计算机智能控制及专家系统等领域。但从当前语音识别系统来看,由于ANN对语音信号的时间动态特性描述不够充分,大部分采用ANN与传统识别算法相结合的系统。

 7.深度神经网络/深信度网络-隐马尔科夫(DNN/DBN-HMM)

当前诸如ANN,BP等多数分类的学习方法都是浅层结构算法,与深层算法相比存在局限。尤其当样本数据有限时,它们表征复杂函数的能力明显不足。深度学习可通过学习深层非线性网络结构,实现复杂函数逼近,表征输入数据分布式,并展现从少数样本集中学习本质特征的强大能力。在深度结构非凸目标代价函数中普遍存在的局部最小问题是训练效果不理想的主要根源。为了解决以上问题,提出基于深度神经网络(DNN) 的非监督贪心逐层训练算法,它利用空间相对关系减少参数数目以提高神经网络的训练性能。相比传统的基于GMM-HMM的语音识别系统,其最大的改变是采用深度神经网络替换GMM模型对语音的观察概率进行建模。最初主流的深度神经网络是最简单的前馈型深度神经网络(Feedforward Deep Neural Network,FDNN)。DNN相比GMM的优势在于:1. 使用DNN估计HMM的状态的后验概率分布不需要对语音数据分布进行假设;2. DNN的输入特征可以是多种特征的融合,包括离散或者连续的;3. DNN可以利用相邻的语音帧所包含的结构信息。基于DNN-HMM识别系统的模型如图2所示。

                                                                       

                                                                                  图2 基于深度神经网络的语音识别系统

  8.循环神经网络(RNN)

语音识别需要对波形进行加窗、分帧、提取特征等预处理。训练GMM时候,输入特征一般只能是单帧的信号,而对于DNN可以采用拼接帧作为输入,这些是DNN相比GMM可以获得很大性能提升的关键因素。然而,语音是一种各帧之间具有很强相关性的复杂时变信号,这种相关性主要体现在说话时的协同发音现象上,往往前后好几个字对我们正要说的字都有影响,也就是语音的各帧之间具有长时相关性。采用拼接帧的方式可以学到一定程度的上下文信息。但是由于DNN输入的窗长是固定的,学习到的是固定输入到输入的映射关系,从而导致DNN对于时序信息的长时相关性的建模是较弱的。

                                                        

 

                                                                                                    图3 DNN和RNN示意图

考虑到语音信号的长时相关性,一个自然而然的想法是选用具有更强长时建模能力的神经网络模型。于是,循环神经网络(Recurrent Neural Network,RNN)近年来逐渐替代传统的DNN成为主流的语音识别建模方案。如图3,相比前馈型神经网络DNN,循环神经网络在隐层上增加了一个反馈连接,也就是说,RNN隐层当前时刻的输入有一部分是前一时刻的隐层输出,这使得RNN可以通过循环反馈连接看到前面所有时刻的信息,这赋予了RNN记忆功能。这些特点使得RNN非常适合用于对时序信号的建模。

    9.长短时记忆模块(LSTM)

长短时记忆模块 (Long-Short Term Memory,LSTM) 的引入解决了传统简单RNN梯度消失等问题,使得RNN框架可以在语音识别领域实用化并获得了超越DNN的效果,目前已经使用在业界一些比较先进的语音系统中。除此之外,研究人员还在RNN的基础上做了进一步改进工作,如图4是当前语音识别中的主流RNN声学模型框架,主要包含两部分:深层双向RNN和序列短时分类(Connectionist Temporal Classification,CTC)输出层。其中双向RNN对当前语音帧进行判断时,不仅可以利用历史的语音信息,还可以利用未来的语音信息,从而进行更加准确的决策;CTC使得训练过程无需帧级别的标注,实现有效的“端对端”训练。

                                                    

 

                                                                                     图4 基于RNN-CTC的主流语音识别系统框架

    10.卷积神经网络(CNN)

CNN早在2012年就被用于语音识别系统,并且一直以来都有很多研究人员积极投身于基于CNN的语音识别系统的研究,但始终没有大的突破。最主要的原因是他们没有突破传统前馈神经网络采用固定长度的帧拼接作为输入的思维定式,从而无法看到足够长的语音上下文信息。另外一个缺陷是他们只是将CNN视作一种特征提取器,因此所用的卷积层数很少,一般只有一到二层,这样的卷积网络表达能力十分有限。针对这些问题,提出了一种名为深度全序列卷积神经网络(Deep Fully Convolutional Neural Network,DFCNN)的语音识别框架,使用大量的卷积层直接对整句语音信号进行建模,更好地表达了语音的长时相关性。

DFCNN的结构如图5所示,它直接将一句语音转化成一张图像作为输入,即先对每帧语音进行傅里叶变换,再将时间和频率作为图像的两个维度,然后通过非常多的卷积层和池化(pooling)层的组合,对整句语音进行建模,输出单元直接与最终的识别结果比如音节或者汉字相对应。

                                                                

                                                                                                          图5 DFCNN示意图

  • 识别技术的发展方向

  1. 更有效的序列到序列直接转换的模型。序列到序列直接转换的模型目前来讲主要有两个方向,一是CTC模型;二是Attention 模型。
  2. 鸡尾酒会问题(远场识别)。这个问题在近场麦克风并不明显,这是因为人声的能量对比噪声非常大,而在远场识别系统上,信噪比下降得很厉害,所以这个问题就变得非常突出,成为了一个非常关键、比较难解决的问题。鸡尾酒会问题的主要困难在于标签置换(Label Permutation),目前较好的解决方案有二,一是深度聚类(Deep Clustering);二是置换不变训练(Permutation invariant Training)。
  3. 持续预测与自适应模型。能否建造一个持续做预测并自适应的系统。它需要的特点一个是能够非常快地做自适应并优化接下来的期望识别率。另一个是能发现频度高的规律并把这些变成模型默认的一部分,不需要再做训练。
  4. 前后端联合优化。前端注重音频质量提升,后端注重识别性能和效率提升。
  • 参考文献:

《解析深度学习:语音识别实践》-------俞栋,邓力著

《实用语音识别基础》-------王炳锡,屈丹, 彭煊著

《语音信号处理》--------赵力著


本内容部分原创,因作者才疏学浅,偶有纰漏,望不吝指出。本内容由灵声讯音频-语音算法实验室整理创作,转载和使用请与“灵声讯”联系,联系方式:音频/识别/合成算法QQ群(696554058)


                                                                  

 

福利小贴士:

理科只是为自己插上腾飞的翅膀,文科才能让你飞黄腾达,同意的点赞,谢谢!

赠送原创诗歌公众号“天一色”,以飨读者!

2019-05-22 00:45:34 zhinengxuexi 阅读数 1294
  • Python全栈视频教程

    Python全栈视频培训教程,帮助开发者从零到一入门python:1.深入理解python语法机制与底层原理,2.深入实战python各种案例 , 3.语音识别,图形界面,多线程爬虫,语音合成,游戏控制等等精彩案例。

    213933 人正在学习 去看看 尹成

随着AI快速发展的今天,语音识别也成为众多设备的标配,语音识别开始被越来越多人的关注,国外微软、苹果、谷歌,国内的科大讯飞、思必弛、云知声等厂商都在研发语音识别新策略新算法,似乎人类与语音的自然交互渐行渐近。

语音识别是以语音的研究为对象,通过语音信号处理和模式识别让机器自动识别和理解人类口述的语言。

语音识别系统本质上是一种模式识别系统,包括特征提取、模式匹配、参考模式库等三个基本单元。

一套完整的语音识别系统,工作过程分为7步:

1.对语音信号进行分析和处理,除去冗余信息。

2.提取影响语音识别的关键信息和表达语言含义的特征信息。

3.紧扣特征信息,用最小单元识别字词。

4.按照不同语言的各自语法,依照先后次序识别字词。

5.把前后意思当作辅助识别条件,有利于分析和识别。

6.按照语义分析,给关键信息划分段落,取出所识别出的字词并连接起来,同时根据语句意思调整句子构成。

7.结合语义,仔细分析上下文的相互联系,对当前正在处理的语句进行适当修正

语音识别、图像识别均为模式识别中的主要应用,有兴趣的可以多学习一下

人工智能、大数据、云计算和物联网的未来发展值得重视,均为前沿产业,多智时代专注于人工智能和大数据的入门和科谱,在此为你推荐几篇优质好文:
人工智能与语音识别技术
http://www.duozhishidai.com/article-3157-1.html
人工智能快速发展的今天,语音识别现在发展到什么阶段了?
http://www.duozhishidai.com/article-2278-1.html
语音的识别过程主要分哪几步,常用的识别方法是什么?
http://www.duozhishidai.com/article-1739-1.html


多智时代-人工智能大数据学习入门网站|人工智能、大数据、物联网云计算的学习交流网站

多智时代-人工智能大数据学习入门网站|人工智能、大数据、云计算、物联网的学习服务的好平台

2014-04-24 14:29:12 u010944555 阅读数 6124
  • Python全栈视频教程

    Python全栈视频培训教程,帮助开发者从零到一入门python:1.深入理解python语法机制与底层原理,2.深入实战python各种案例 , 3.语音识别,图形界面,多线程爬虫,语音合成,游戏控制等等精彩案例。

    213933 人正在学习 去看看 尹成

本文转自知乎:语音识别的技术原理是什么?张俊博的回答

简要给大家介绍一下语音怎么变文字的吧。


首先说一下作为输入的时域波形。我们知道声音实际上是一种波。常见的mp3、wmv等格式都是压缩格式,必须转成非压缩的纯波形文件,比如Windows PCM文件,即wav文件来处理。wav文件里存储的除了一个文件头以外,就是声音波形的一个个点了。采样率越大,每毫秒语音中包含的点的个数就越多。另外声音有单通道双通道之分,还有四通道的等等。对语音识别任务来说,单通道就足够了,多了浪费,因此一般要把声音转成单通道的来处理。下图是一个波形的示例。


另外,通常还需要做个VAD处理,也就是把首尾端的静音切除,降低对后续步骤造成的干扰,这需要用到信号处理的一些技术。

时域的波形必须要分帧,也就是把波形切开成一小段一小段,每小段称为一帧。分帧操作通常使用移动窗函数来实现,分帧之前还要做一些预加重等操作,这里不详述。帧与帧之间是有交叠的,就像下图这样:
图中,每帧的长度为25毫秒,每两帧之间有25-10=15毫秒的交叠。我们称为以帧长25ms、帧移10ms分帧。

分帧后,语音就变成了很多小段。但波形在时域上几乎没有描述能力,因此必须将波形作变换。常见的一种变换方法是提取MFCC特征,把每一帧波形变成一个12维向量。这12个点是根据人耳的生理特性提取的,可以理解为这12个点包含了这帧语音的内容信息。这个过程叫做声学特征提取。实际应用中,这一步有很多细节,比如差分、均值方差规整、高斯化、降维去冗余等,声学特征也不止有MFCC这一种,具体就不详述了。

至此,声音就成了一个12行(假设声学特征是12维)、N列的一个矩阵,称之为观察序列,这里N为总帧数。观察序列如下图所示,图中,每一帧都用一个12维的向量表示,色块的颜色深浅表示向量值的大小。

接下来就要介绍怎样把这个矩阵变成文本了。首先要介绍三个概念:
  1. 单词:英语中就是单词,汉语中是汉字。
  2. 音素:单词的发音由音素构成。对英语,一种常用的音素集是卡内基梅隆大学的一套由39个音素构成的音素集,参见The CMU Pronouncing Dictionary‎。汉语一般直接用全部声母和韵母作为音素集,另外汉语识别还分有调无调,不详述。
  3. 状态:比音素更细致的语音单位。通常一个音素由3个状态构成。

语音识别是怎么工作的呢?实际上一点都不神秘,无非是:
第一步,把帧识别成状态(难点)。
第二步,把状态组合成音素。
第三步,把音素组合成单词。
如下图所示:
图中,每个小竖条代表一帧,若干帧语音对应一个状态,每三个状态组合成一个音素,若干个音素组合成一个单词。也就是说,只要知道每帧语音对应哪个状态了,语音识别的结果也就出来了。

那每帧音素对应哪个状态呢?有个容易想到的办法,看某帧对应哪个状态的概率最大,那这帧就属于哪个状态,这叫做“最大似然”。比如下面的示意图,这帧对应S3状态的概率最大,因此就让这帧属于S3状态。


那这些用到的概率从哪里读取呢?有个叫“声学模型”的东西,里面存了一大堆参数,通过这些参数,就可以知道帧和状态对应的概率。声学模型是使用巨大数量的语音数据训练出来的,训练的方法比较繁琐,这里不讲。

但这样做有一个问题:每一帧都会得到一个状态号,最后整个语音就会得到一堆乱七八糟的状态号,相邻两帧间的状态号基本都不相同。假设语音有1000帧,每帧对应1个状态,每3个状态组合成一个音素,那么大概会组合成300个音素,但这段语音其实根本没有这么多音素。如果真这么做,得到的状态号可能根本无法组合成音素。实际上,相邻帧的状态应该大多数都是相同的才合理,因为每帧很短。

解决这个问题的常用方法就是使用隐马尔可夫模型(Hidden Markov Model,HMM)。这东西听起来好像很高深的样子,实际上很简单,无非是:
第一步,构建一个状态网络。
第二步,从状态网络中寻找与声音最匹配的路径。

这样就把结果限制在预先设定的网络中,避免了刚才说到的问题,当然也带来一个局限,比如你设定的网络里只包含了“今天晴天”和“今天下雨”两个句子的状态路径,那么不管说些什么,识别出的结果必然是这两个句子中的一句。

具体是这样的,首先构造单词级网络,然后展开成音素网络,然后展开成状态网络。然后在状态网络中搜索一条最佳路径,这条路径和语音之间的概率(称之为累积概率)最大。搜索的算法是一种动态规划剪枝的算法,称之为Viterbi算法,用于寻找全局最优路径。感兴趣的同学可以到Wikipedia上搜一下。

这里所说的累积概率,由三部分构成,分别是:
  1. 观察概率:每帧和每个状态对应的概率
  2. 转移概率:每个状态转移到自身或转移到下个状态的概率
  3. 语言概率:根据语言统计规律得到的概率
其中,前两种概率从声学模型中获取,最后一种概率从语言模型中获取。语言模型是使用大量的文本训练出来的,存储的是任意单词、任意两个单词、任意三个单词(通常也就到三个单词)在大量文本中的出现机率。

这样基本上语音识别过程就完成了。

以上介绍的是传统的基于HMM的语音识别。以上的文字不追求严谨,只是想让大家容易理解。

如果感兴趣,想进一步了解,HTK Book是非常好的入门书,这本书实际上是剑桥大学发布的著名开源工具包HTK Speech Recognition Toolkit 的说明书,近400页,厚厚的一本。如果有时间、有兴趣,可以照着书中的第二章在电脑上做一遍,你将搭建出一个简单但基本完整的语音识别系统,能识别简单的英语数字串。
2019-07-10 14:33:49 belalds 阅读数 495
  • Python全栈视频教程

    Python全栈视频培训教程,帮助开发者从零到一入门python:1.深入理解python语法机制与底层原理,2.深入实战python各种案例 , 3.语音识别,图形界面,多线程爬虫,语音合成,游戏控制等等精彩案例。

    213933 人正在学习 去看看 尹成

简要给大家介绍一下语音怎么变文字的吧。希望这个介绍能让所有同学看懂。

 

首先,我们知道声音实际上是一种波。常见的mp3、wmv等格式都是压缩格式,必须转成非压缩的纯波形文件来处理,比如Windows PCM文件,也就是俗称的wav文件。wav文件里存储的除了一个文件头以外,就是声音波形的一个个点了。下图是一个波形的示例。

 

在开始语音识别之前,有时需要把首尾端的静音切除,降低对后续步骤造成的干扰。这个静音切除的操作一般称为VAD,需要用到信号处理的一些技术。要对声音进行分析,需要对声音分帧,也就是把声音切开成一小段一小段,每小段称为一帧。分帧操作一般不是简单的切开,而是使用移动窗函数来实现,这里不详述。帧与帧之间一般是有交叠的,就像下图这样:

图中,每帧的长度为25毫秒,每两帧之间有25-10=15毫秒的交叠。我们称为以帧长25ms、帧移10ms分帧。图中,每帧的长度为25毫秒,每两帧之间有25-10=15毫秒的交叠。我们称为以帧长25ms、帧移10ms分帧。

 

分帧后,语音就变成了很多小段。但波形在时域上几乎没有描述能力,因此必须将波形作变换。常见的一种变换方法是提取MFCC特征,根据人耳的生理特性,把每一帧波形变成一个多维向量,可以简单地理解为这个向量包含了这帧语音的内容信息。这个过程叫做声学特征提取。实际应用中,这一步有很多细节,声学特征也不止有MFCC这一种,具体这里不讲。

 

至此,声音就成了一个12行(假设声学特征是12维)、N列的一个矩阵,称之为观察序列,这里N为总帧数。观察序列如下图所示,图中,每一帧都用一个12维的向量表示,色块的颜色深浅表示向量值的大小。

接下来就要介绍怎样把这个矩阵变成文本了。首先要介绍两个概念:

  1. 音素:单词的发音由音素构成。对英语,一种常用的音素集是卡内基梅隆大学的一套由39个音素构成的音素集,参见The CMU Pronouncing Dictionary。汉语一般直接用全部声母和韵母作为音素集,另外汉语识别还分有调无调,不详述。

  2. 状态:这里理解成比音素更细致的语音单位就行啦。通常把一个音素划分成3个状态。

 

语音识别是怎么工作的呢?实际上一点都不神秘,无非是:

第一步,把帧识别成状态(难点);

第二步,把状态组合成音素;

第三步,把音素组合成单词。

 

如下图所示:

图中,每个小竖条代表一帧,若干帧语音对应一个状态,每三个状态组合成一个音素,若干个音素组合成一个单词。也就是说,只要知道每帧语音对应哪个状态了,语音识别的结果也就出来了。图中,每个小竖条代表一帧,若干帧语音对应一个状态,每三个状态组合成一个音素,若干个音素组合成一个单词。也就是说,只要知道每帧语音对应哪个状态了,语音识别的结果也就出来了。

 

那每帧音素对应哪个状态呢?有个容易想到的办法,看某帧对应哪个状态的概率最大,那这帧就属于哪个状态。比如下面的示意图,这帧对应S3状态的概率最大,因此就让这帧属于S3状态。

那这些用到的概率从哪里读取呢?有个叫“声学模型”的东西,里面存了一大堆参数,通过这些参数,就可以知道帧和状态对应的概率。获取这一大堆参数的方法叫做“训练”,需要使用巨大数量的语音数据,训练的方法比较繁琐,这里不讲。

 

但这样做有一个问题:每一帧都会得到一个状态号,最后整个语音就会得到一堆乱七八糟的状态号,相邻两帧间的状态号基本都不相同。假设语音有1000帧,每帧对应1个状态,每3个状态组合成一个音素,那么大概会组合成300个音素,但这段语音其实根本没有这么多音素。如果真这么做,得到的状态号可能根本无法组合成音素。实际上,相邻帧的状态应该大多数都是相同的才合理,因为每帧很短。

 

解决这个问题的常用方法就是使用隐马尔可夫模型(Hidden Markov Model,HMM)。这东西听起来好像很高深的样子,实际上用起来很简单:

第一步,构建一个状态网络。

第二步,从状态网络中寻找与声音最匹配的路径。

 

这样就把结果限制在预先设定的网络中,避免了刚才说到的问题,当然也带来一个局限,比如你设定的网络里只包含了“今天晴天”和“今天下雨”两个句子的状态路径,那么不管说些什么,识别出的结果必然是这两个句子中的一句。

 

那如果想识别任意文本呢?把这个网络搭得足够大,包含任意文本的路径就可以了。但这个网络越大,想要达到比较好的识别准确率就越难。所以要根据实际任务的需求,合理选择网络大小和结构。

 

搭建状态网络,是由单词级网络展开成音素网络,再展开成状态网络。语音识别过程其实就是在状态网络中搜索一条最佳路径,语音对应这条路径的概率最大,这称之为“解码”。路径搜索的算法是一种动态规划剪枝的算法,称之为Viterbi算法,用于寻找全局最优路径。

这里所说的累积概率,由三部分构成,分别是:

  1. 观察概率:每帧和每个状态对应的概率

  2. 转移概率:每个状态转移到自身或转移到下个状态的概率

  3. 语言概率:根据语言统计规律得到的概率

     

其中,前两种概率从声学模型中获取,最后一种概率从语言模型中获取。语言模型是使用大量的文本训练出来的,可以利用某门语言本身的统计规律来帮助提升识别正确率。语言模型很重要,如果不使用语言模型,当状态网络较大时,识别出的结果基本是一团乱麻。

 

以上介绍的是传统的基于HMM的语音识别。事实上,HMM的内涵绝不是上面所说的“无非是个状态网络”那么简单。以上的文字只是想让大家容易理解,并不追求严谨。

2020-01-08 17:45:19 qq_39390545 阅读数 1179
  • Python全栈视频教程

    Python全栈视频培训教程,帮助开发者从零到一入门python:1.深入理解python语法机制与底层原理,2.深入实战python各种案例 , 3.语音识别,图形界面,多线程爬虫,语音合成,游戏控制等等精彩案例。

    213933 人正在学习 去看看 尹成

转自:https://www.zhihu.com/question/20398418/answer/18080841

 

简要给大家介绍一下语音怎么变文字的吧。需要说明的是,这篇文章为了易读性而牺牲了严谨性,因此文中的很多表述实际上是不准确的。对于有兴趣深入了解的同学,本文的末尾推荐了几份进阶阅读材料。下面我们开始。

首先,我们知道声音实际上是一种波。常见的mp3等格式都是压缩格式,必须转成非压缩的纯波形文件来处理,比如Windows PCM文件,也就是俗称的wav文件。wav文件里存储的除了一个文件头以外,就是声音波形的一个个点了。下图是一个波形的示例。


在开始语音识别之前,有时需要把首尾端的静音切除,降低对后续步骤造成的干扰。这个静音切除的操作一般称为VAD,需要用到信号处理的一些技术。

要对声音进行分析,需要对声音分帧,也就是把声音切开成一小段一小段,每小段称为一帧。分帧操作一般不是简单的切开,而是使用移动窗函数来实现,这里不详述。帧与帧之间一般是有交叠的,就像下图这样:

图中,每帧的长度为25毫秒,每两帧之间有25-10=15毫秒的交叠。我们称为以帧长25ms、帧移10ms分帧。

分帧后,语音就变成了很多小段。但波形在时域上几乎没有描述能力,因此必须将波形作变换。常见的一种变换方法是提取MFCC特征,根据人耳的生理特性,把每一帧波形变成一个多维向量,可以简单地理解为这个向量包含了这帧语音的内容信息。这个过程叫做声学特征提取。实际应用中,这一步有很多细节,声学特征也不止有MFCC这一种,具体这里不讲。

至此,声音就成了一个12行(假设声学特征是12维)、N列的一个矩阵,称之为观察序列,这里N为总帧数。观察序列如下图所示,图中,每一帧都用一个12维的向量表示,色块的颜色深浅表示向量值的大小。

接下来就要介绍怎样把这个矩阵变成文本了。首先要介绍两个概念:

  1. 音素:单词的发音由音素构成。对英语,一种常用的音素集是卡内基梅隆大学的一套由39个音素构成的音素集,参见The CMU Pronouncing Dictionary‎。汉语一般直接用全部声母和韵母作为音素集,另外汉语识别还分有调无调,不详述。
  2. 状态:这里理解成比音素更细致的语音单位就行啦。通常把一个音素划分成3个状态。

 

语音识别是怎么工作的呢?实际上一点都不神秘,无非是:
把帧识别成状态(难点)。
把状态组合成音素。
把音素组合成单词。

如下图所示:

图中,每个小竖条代表一帧,若干帧语音对应一个状态,每三个状态组合成一个音素,若干个音素组合成一个单词。也就是说,只要知道每帧语音对应哪个状态了,语音识别的结果也就出来了。

那每帧音素对应哪个状态呢?有个容易想到的办法,看某帧对应哪个状态的概率最大,那这帧就属于哪个状态。比如下面的示意图,这帧在状态S3上的条件概率最大,因此就猜这帧属于状态S3。

 

那这些用到的概率从哪里读取呢?有个叫“声学模型”的东西,里面存了一大堆参数,通过这些参数,就可以知道帧和状态对应的概率。获取这一大堆参数的方法叫做“训练”,需要使用巨大数量的语音数据,训练的方法比较繁琐,这里不讲。

但这样做有一个问题:每一帧都会得到一个状态号,最后整个语音就会得到一堆乱七八糟的状态号。假设语音有1000帧,每帧对应1个状态,每3个状态组合成一个音素,那么大概会组合成300个音素,但这段语音其实根本没有这么多音素。如果真这么做,得到的状态号可能根本无法组合成音素。实际上,相邻帧的状态应该大多数都是相同的才合理,因为每帧很短。

解决这个问题的常用方法就是使用隐马尔可夫模型(Hidden Markov Model,HMM)。这东西听起来好像很高深的样子,实际上用起来很简单:
第一步,构建一个状态网络。
第二步,从状态网络中寻找与声音最匹配的路径。

这样就把结果限制在预先设定的网络中,避免了刚才说到的问题,当然也带来一个局限,比如你设定的网络里只包含了“今天晴天”和“今天下雨”两个句子的状态路径,那么不管说些什么,识别出的结果必然是这两个句子中的一句。

那如果想识别任意文本呢?把这个网络搭得足够大,包含任意文本的路径就可以了。但这个网络越大,想要达到比较好的识别准确率就越难。所以要根据实际任务的需求,合理选择网络大小和结构。

搭建状态网络,是由单词级网络展开成音素网络,再展开成状态网络。语音识别过程其实就是在状态网络中搜索一条最佳路径,语音对应这条路径的概率最大,这称之为“解码”。路径搜索的算法是一种动态规划剪枝的算法,称之为Viterbi算法,用于寻找全局最优路径。


这里所说的累积概率,由三部分构成,分别是:

  1. 观察概率:每帧和每个状态对应的概率
  2. 转移概率:每个状态转移到自身或转移到下个状态的概率
  3. 语言概率:根据语言统计规律得到的概率

其中,前两种概率从声学模型中获取,最后一种概率从语言模型中获取。语言模型是使用大量的文本训练出来的,可以利用某门语言本身的统计规律来帮助提升识别正确率。语言模型很重要,如果不使用语言模型,当状态网络较大时,识别出的结果基本是一团乱麻。

 

这样基本上语音识别过程就完成了。

以上的文字只是想让大家容易理解,并不追求严谨。事实上,HMM的内涵绝不是上面所说的“无非是个状态网络”,如果希望深入了解,下面给出了几篇阅读材料:

1. Rabiner L R. A tutorial on hidden Markov models and selected applications in speech recognition. Proceedings of the IEEE, 1989, 77(2): 257-286.
入门必读。深入浅出地介绍了基于HMM的语音识别的原理,不注重公式的细节推导而是着重阐述公式背后的物理意义。

2. Bilmes J A. A gentle tutorial of the EM algorithm and its application to parameter estimation for Gaussian mixture and hidden Markov models. International Computer Science Institute, 1998, 4(510): 126.
详细介绍了用E-M算法训练HMM参数的推导过程,首先讲E-M的基本原理,然后讲解如何应用到GMM的训练,最后讲解如何应用到HMM的训练。

3. Young S, Evermann G, Gales M, et al. The HTK book (v3.4). Cambridge University, 2006.
HTK Book,开源工具包HTK的文档。虽然现在HTK已经不是最流行的了,但仍然强烈推荐按照书里的第二章流程做一遍,你可以搭建出一个简单的数字串识别系统。

4. Graves A. Supervised Sequence Labelling with Recurrent Neural Networks. Springer Berlin Heidelberg, 2012: 15-35.
基于神经网络的语音识别的入门必读。从神经网络的基本结构、BP算法等介绍到 LSTM、CTC。

5. 俞栋, 邓力. 解析深度学习——语音识别实践, 电子工业出版社, 2016.
高质量的中文资料非常稀有,推荐买一本。最早把深度学习技术应用于语音识别就是这本书的作者。

 

高赞回复2:
 

下面对算法背后的含义做一个简单的解释,对涉及到的特征提取(包括分帧)、音素建模、字典、隐式马尔科夫模型等可以参阅楼上的回答。

语音识别的第一个特点是要识别的语音的内容(比声韵母等)是不定长时序,也就是说,在识别以前你不可能知道当前的 声韵母有多长,这样在构建统计模型输入语音特征的时候无法简单判定到底该输入0.0到0.5秒还是0.2到0.8秒进行识别,同时多数常见的模型都不方便处理维度不确定的输入特征(注意在一次处理的时候,时间长度转化成了当前的特征维度)。一种简单的解决思路是对语音进行分帧,每一帧占有比较短固定的时 长(比如25ms),再假设说这样的一帧既足够长(可以蕴含 足以判断它属于哪个声韵母的信息),又很平稳(方便进行短时傅里叶分析),这样将每一帧转换为一个特征向量,(依次)分别识别它们属于哪个声韵母,就可以 解决问题。识别的结果可以是比如第100到第105帧是声母c,而第106帧到115帧是韵母eng等。 这种思路有点类似微积分 中的『以直代曲』。另外在实际的分帧过程中,还有很多常用技巧,比如相邻两帧之间有所重叠,或引入与临近帧之间的差分作为额外特征,乃至直接堆叠许多语音帧等等,这些都可以让前述的两个假设更可靠。近年来,研究种也出现了一些更新颖的处理方式,比如用.wav文件的采样点取代分帧并处理后的语音帧,但这样的方法在处理速度及性能上 暂时还没有优势。

当我们有了分帧后的语音特征之后,下一步常用的处理是使用某种分类器将之分类成某种跟语音内容相关的类别,如声韵母,这一步通常称作声学模型建模。对于分类目标的选取,最简单的选择可以是词组,或者是组成词组的汉字所对应的音节。但这样的选择方式通常会对训练模型的语音数据提出过高的要求,带来『数据稀疏』的问题,即数据中 很难包含汉语中的所有词组,同时每个词组也很难具有充足的训练样本以保证统计声学模型的可靠性。由于一个词组通常由多个音素的连续发音 构成,常见的音素都包含在国际音标表中,它们具有恰当的数目(通常几十个),以及清晰的定义(由特定的发声器官运动产生),于是音素成了各种语言中的语音识别中都最为常见的 建模选择(汉语的声韵母也是由一到三个音素构成), 识别中再结合词组到音素的发音字典使用。使用音素也方便对混合语言(如汉语种夹杂英语词汇)进行识别——当然不同母语的人对相同音素的发音也有区别,这是另外一个话题。另外由于人类发生器官运动的连续性,以及某些语言中特定的拼读习惯(比如英语中定冠词『the』在元音和辅音之前有不同读音),会导致发音,尤其是音素的发音受到前后音素的影响,称为『协同发音』。于是 可以进行所谓『上下文相关』的音素(或者考虑到音素实际的拼读,称为音子)分类。比如wo chi le这个序列,可以写为w o ch i l e,这样是普通的『上下文无关』音子序列,也可以考虑前一个音素对当前音素的影响写成sil-w w-o o-ch ch-i i-l l-e (sil表示语音开始前的静音,A-B表示收到A影响的B)或考虑后一个音素的影响写成w+o o+ch ch+i i+l l+e e+sil(sil表示语音结束后的静音,A+B表示受到B影响的A)。实际中以同时考虑前后各一个音素的三音子最为常见,最多也有人使用四音子模型。使用三音子或四音子模型会导致 分类目标的几何增长(如仅仅30个音素就可以扩展出30^3=27000个三音子), 并再次导致数据稀疏的问题。最常用的解决方法是使用基于决策树的方式对这些三音子或四音子模型进行聚类,对每一类模型进行参数共享以及训练数据的共享。在构建决策树的方式上以及决策树进行自顶向下的 分裂过程中,都可以 导入适当的语音学知识, 将知识与数据驱动的方法进行结合, 同时还可以 减少运算量并在识别中 使用训练数据中未出现的三音子模型等。

有了具体的分类的目标(比如三音子)之后,下面就要选择具体的数学模型进行声学建模。这里可以根据语音学等研究 使用多种线性结构或非线性结构的模型或模型组合。目前最广泛使用的仍然是基于隐式马尔科夫模型的建模方法,即对每个三音子分别建立一个模型,具体可以参见楼上的回答。隐式马尔科夫模型的转移概率密度以几何分布最为常见,但语音合成中也常用高斯分布;观测概率密度函数传统上通常使用 高斯混合模型,也有人使用人工神经网络等,近年来随着深度学习的发展,使用各种深层神经网络的情况 越来越多。最近也有人使用不同方法直接利用递归神经网络进行建模,有一些工作也取得了比较好的效果。但无论使用哪种模型甚至非线性的模型 组合,背后的含义都是假设了对应于每种 类别(三音子)的语音帧在它所对应的高维空间中具有几乎确定的空间分布,可以通过对空间进行划分,并由未知语音帧的空间位置来对语音帧进行正确的分类。

在完成声学模型建模后,就可以基于声学模型对未知语音帧序列进行语音识别了,这一过程通常称为搜索解码过程。解码的原理通常是在给定了根据语法、字典对马尔科夫模型进行连接后的搜索的网络(网络的每个节点可以是一个词组等)后,在所有可能的搜索路径中选择一条或多条最优(通常是最大后验概率)路径(字典中出现词组的词组串)作为识别结果,具体的搜索算法可以有不同的实现方式。这样的搜索可以对时序的语音帧根据其前后帧进行约束;注意使用多状态 隐式马尔科夫模型的理由之一是可以在 搜索中对每个三音子的最短长度施加限制。语音识别任务通常有不同的分类,最困难的问题是所谓大词表连续语音识别,即对可能由数万种日常用词组成的发音自然的语句(比如我们日常随意对话中的语句)进行识别,这样的 问题中通常要 将声学模型同概率语言模型联合使用,即在搜索中导入 统计获得的先验语言层级信息,优点是可以显著的提高识别器的性能,缺点是也会造成识别器明显偏向于识别出语言模型中 出现过的信息。

以上就是我理解的语音识别的原理,包括大致的系统构成和基本设计思路。具体在最前沿的研究和评测 中,通常还需要把许多不同的语音识别器通过各种不同的手段进行系统组合,以便在最终使最终的(组合)系统 能够获得具有互补性的信息,从而得到最佳的识别效果。

 

语音识别Kinect

阅读数 2131

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