2017-05-23 09:36:57 liuyuehui110 阅读数 1817
  • Python全栈视频教程

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

    213913 人正在学习 去看看 尹成

 一直想写个关于语音识别系统原理的博文。前段时间我和@零落一起做了很多实验,比如htk,kaldi等。从周五开始就已经放寒假了,明天就做火车回家了。今晚加点劲写点吧,回家由于没网。大家有问题只能留言或者找我qq,我尽量过段时间来回答吧。现在我就把语音识别的原理说下去。

具体的框架图还是来一个把。这个图我也是我从网上找的。

按照上图的说法,语音识别是由语言模型和声学模型构成的。下面我就根据图上的流程说下。

一 特征提取

 现在主流的特征是mfcc。具体mfcc的步骤,在我前面转的博客里也有。地址:语音信号处理之(四)梅尔频率倒谱系数(MFCC)。这里我引有知乎里的一个人的说法:

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

备注:这个波形你可以用htk里的标注和录音去看。其他的语音处理软件也可以吧。
另外,通常还需要做个VAD处理,也就是把首尾端的静音切除,降低对后续步骤造成的干扰,这需要用到信号处理的一些技术。
时域的波形必须要分帧,也就是把波形切开成一小段一小段,每小段称为一帧。分帧操作通常使用移动窗函数来实现,分帧之前还要做一些预加重等操作,这里不详述。帧与帧之间是有交叠的,就像下图这样:

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

备注:mfcc的一些处理还是有很多研究的东西。等寒假回来可以跟大家交流。

这里,每个工具箱提供的特征都是不一样的。具体的可以去参考各个工具箱的说明。如:htkbook的第五章。

最后,这个mfcc的变形有很多,也就是对于mfcc的改进也很多。适合自己的才是最好的。此外,这步处理后就是一组13维*帧数的二维向量。这步在训练和测试都得做。

二 声学模型

 特征提取完毕就是声学模型的事情。通常需要大量的数据来训练我们的声学模型。这样,我们最后的识别率才是理想。这步就是用马尔科夫模型的过程。具体的细节我暂时也写不清楚。我贴一个图,希望对你理解有好处。

稍微说明一下:最下面的observation就是我们提取的特征。gmm-hmm就是把我们的特征用混合高斯模型区模拟,然后把均值和方差输入到hmm的模型里。

此外,dnn-hmm的模型图:

最后是dbn-hmm:

 

希望我寒假过来可以很好的解释这三个图,如果有人可以解释这三个图,欢迎和我联系,与我交流。谢谢……

这些就是声学模型的全部了。如果你有时间,欢迎分享你的理解。

三 语言模型

   语言模型,我就引用@zouxy09的博客。

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

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

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

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

  四 待续……还有很多,……寒假过来补吧……

  希望这个对大家理解整个过程有点用。具体的细节过程寒假过后补过来。如果大家有任何想法和建议,欢迎留言和与我交流。

 

最后,这是本命年最后一个博客应该。来年我希望我自己可以在语音识别做得更多,希望和大家一起学习,一起努力……加油……提前祝大家新春快乐。

2019-05-21 08:35:12 weixin_42137700 阅读数 214
  • Python全栈视频教程

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

    213913 人正在学习 去看看 尹成

https://www.toutiao.com/a6692701310044602887/

 

电话机器人效果好不好,首先得看他的语音识别能力怎么样,语音识别率高、稳定,那么这个电话机器人就不会差。我们可以看一下语音识别的基本原理:

一个基本的语音识别系统如下图,实现是正常工作流程,虚线是训练模式分类问题中的模板(这里就是声学模型,字典和语言模型)。

5分钟带你读懂“语音识别”工作原理

 

预处理:

1. 首尾端的静音切除,下降对后续进程形成的搅扰,静音切除的操作一般称为VAD。

2. 声响分帧,也就是把声响切开成一小段一小段,每小段称为一帧,运用移动窗函数来完成,不是简略的切开,各帧之间一般是有交叠的。

特征提取:首要算法有线性猜测倒谱系数(LPCC)和Mel 倒谱系数(MFCC),意图是把每一帧波形变成一个包括声响信息的多维向量;

声学模型(AM):经过对语音数据进行练习取得,输入是特征向量,输出为音素信息;

字典:字或许词与音素的对应, 简略来说, 中文就是拼音和汉字的对应,英文就是音标与单词的对应;

言语模型(LM):经过对大量文本信息进行练习,得到单个字或许词彼此相关的概率;

解码:就是经过声学模型,字典,言语模型对提取特征后的音频数据进行文字输出;

语音辨认流程的举例(仅仅形象表述,不是实在数据和进程):

1. 语音信号:PCM文件等(我是电销机器人)

2. 特征提取:提取特征向量[5 4 2 66 98 ...]

3. 声学模型:[5 4 2 66 98]-> wo shi dianxiao jiqiren

4. 字典翻译:窝:w o;我:w o; 是:s i;电销:dian xiao 机:j i; 器:q i; 人:r en

5. 言语模型:我:0.1286, 是: 0.3616,电销:0.5682,机器人:0.6785;

6. 输出文字:我是电销机器人;

2019-07-10 14:33:49 belalds 阅读数 495
  • Python全栈视频教程

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

    213913 人正在学习 去看看 尹成

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

 

首先,我们知道声音实际上是一种波。常见的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的内涵绝不是上面所说的“无非是个状态网络”那么简单。以上的文字只是想让大家容易理解,并不追求严谨。

2017-10-15 23:20:45 mystery_guest 阅读数 353
  • Python全栈视频教程

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

    213913 人正在学习 去看看 尹成
第一步:采样
人的声音频率是有范围的,所以采样也应当选取范围。采样率是最低频率的2倍,此乃常识。至于最低频率怎样定,可以根据实际情况。
1、注意你的麦克风,有些麦克风是有接受范围的,把频率定得比麦克风的能力极限还低,显然是浪费。
2、用途。如果是要求可靠性很高的系统,则要注意加大频率范围。如果要求实时性比较高,那就要考虑处理机的速度了,数据量和频宽是正比的。
3、性别。男人的低音部分比女人更重要。所以如果对性别加以区分,那么在识别不同性别时应该采用不同下限。
4、特别指出,小心干扰。频率范围大了,噪音也就多。如果扩大的范围内噪音比较多,那还是不要的好。
第二步:语音处理
采样进入计算机后,成为一段段的数据,表明各个时刻的声音能量。处理时,第一步就是消除噪音,消不了这个东西,下面怎么都不好搞。可消除的主要是电器噪音,方法是完全静音时,录下电路信号,反相回到声音上去就成了。再下面就是断字了。人类语言是分音节的,音节之间是有一个停顿的,特别是汉语就更明显了。我主要讲的是汉语,在输入的数据中舍去能量低于一定值的部分,余下次的一段段的就对应各个字了。这需要解决两个问题,第一,舍去的标准,显然人说话声音有高有低,不能硬来。我的建议是取波形,不管说话声音高低,声音总是有形状的,不妨先取几个完整的波形,算出平均能量,取它的几分之一作为标准即可。而且这个过程似乎应该是动态的。第二是舍去一部分后,余下的部分可能不太整齐,由于噪音等原因,该舍的可能没舍,这就会有问题。解决这个问题大概可以在舍去时,不仅根据值的大小,还要根据两边的情况。这关系到舍去函数了,不是很难。断开各个字之后,就可以进行匹配了。原来的样本经过处理后,变成时间的函数,以时间为顺序取得一组值,成为N维向量。待处理的数据也同样进行,采用波形插值法从采样中取出N维向量,与样本进行匹配。 这关键是一个匹配函数的问题,即由两个向量在空间的相互位置得到一个匹配度,与样本依次比较,得出各自的匹配度。
由于各个样本都要匹配,所以速度很重要。通常的改进方法是进行多次匹配,即只把某些坐标进行对比,值大于某个标准才进行二次匹配。 这个标准可以是动态的,比如已进行过的对比的第M大的值。 为什么不到最大值,主要是需要保留多个结果。同时M可调,也便于在处理特殊情况时进行智能应变。匹配时,相应的计算函数相当重要,样本要相当的标准,同时以此样本为中心,扩张出多层区域,每层内的向量得到各层的匹配度,由此只要划定相应的匹配区域,给出值就可以了。
这里要多说一点,一般来说,匹配时都采用统一的函数,我却不这么认为,特别是汉语,语音的种类很少,不如将它们分组,每个组函数都不一样。也就是在匹配时,跟据要操作的目标,可以得到相应的匹配函数,进行匹配。 我觉得这要比用同一个匹配函数有效的多。而且,在调节对具体某个字的识别时,也很容易,同时在让它自动学习的时候,也很容易搞。你可以自己设计一个软件,把样本显示在二维坐标上(X:时间,Y:能量),输入一个声音时,把相应的量也显示在坐标系上。这是两条曲线。一方面,你可以反复地读样本,让软件把各条曲线求出来,然后取个中间值更新样本。另一方面,你也可以人脑辅助,根据自己反复读样本得出的曲线,对坐标空间进行分割,得出相应的匹配函数。也就是说,样本可以通过学习自动升级,匹配函数也可以由人脑加入进行升级。我认为这样会更高效一点。分组还有一个好处就是把相近的音归到一组,如果输入的数据和其中一个相差太远,其他的就可以跳过去了。这样可以提高速度。匹配这后,就把结果送入下一模块,其结果应该是这样:X:概率Xo,Y:概率Yo……如此等等,要送入概率最大的M个字,同时附上各字的概率。
第三步:上下文对照选定文字
这似乎和词库有关,所以词库的组织要好,词汇量要大,重要的一点是自己能够学习。出现新词要能记住,常用词要靠前,等等。这是微软的做法。微软采取的另一个方法是输入的词语先不交给应用程序,而是自己有一个缓冲区,输入的词语放在缓冲内,显示在屏幕上,这样一方面可以在输入下文后,依次修改上文,(交给应用程序后可就改不了。)另一方面也可以让用户通过手工操作对文字选择进行干预,从而提高效率。
2019-04-21 09:30:39 weixin_42137700 阅读数 197
  • Python全栈视频教程

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

    213913 人正在学习 去看看 尹成

http://blog.itpub.net/29829936/viewspace-2641917/

 

语音识别是指机器/程序接收、解释声音,或理解和执行口头命令的能力。随着人工智能和智能助手的崛起,语音识别已经得到了广泛应用。

语音识别系统使消费者只需通过与之交谈即可与技术进行交互,从而实现免提请求、提醒和其他简单任务。

语音识别技术竟然发展如此迅速

 

语音识别的工作原理

计算机上的语音识别软件要求将模拟音频转换为数字信号,称为模数转换。计算机如要解密信号,必须具有单词或音节的电子数据库或词汇表,以及用于将该数据与信号进行比较的快速手段。语音模式存储在硬盘上,并在程序运行时加载到内存中。比较器依据A/D转换器的输出检查这些存储的模式,是模式识别的动作。

实际上,语音识别程序的有效词汇量的大小与安装它的计算机的随机存取存储器容量直接相关。如果将整个词汇表加载到RAM中,与搜索硬盘驱动器中的某些匹配项相比,语音识别程序的运行速度要快许多倍。处理速度也很关键,因为它会影响计算机在RAM中搜索匹配的速度。

虽然语音识别技术起源于个人电脑,但它在移动设备和智慧家产品的商业领域都获得了认可。智能手机的普及开启了向消费者口袋添加语音识别技术的机会,而家庭设备,如Google Home和Amazon Echo,将语音识别技术带入了客厅和厨房。语音识别与日益稳定的物联网传感器相结合,为以前缺乏智能功能的许多消费产品增加了技术优势。

语音识别技术竟然发展如此迅速

 

随着语音识别技术的使用变得更频繁,以及更多用户与之交互,有语音识别软件的公司将拥有更多的数据和信息,以供给支持语音识别系统的神经网络,从而提高语音识别产品的功能和准确性。

怎样使用语音识别

随着人工智能、机器学习和消费者接受度的提高,语音识别的用途也迅速增长。从谷歌到亚马逊,到苹果的家庭数字助理都应用了语音识别软件,以便与用户进行互动。消费者使用语音识别技术的方式因产品而异,但可以包括将语音转录为文本,设置提醒,搜索互联网以及回答简单的问题和请求,例如播放音乐、或共享天气、交通信息。

语音识别的优缺点

语音识别使消费者可以通过直接与他们的Google Home,Amazon Alexa或其他语音识别技术工具交谈,以实现多任务。通过使用机器学习和复杂的算法,语音识别技术可以快速将您的口语转换为书面文本。

虽然准确率正在提高,但所有语音识别系统和程序都会出错。背景噪音可能产生错误输入,可以通过在安静的房间中使用该系统来避免。单词听起来也有问题,但拼写不同,含义不同-例如,“hear”和“here”。有一天,使用存储的上下文信息可以在很大程度上克服这个问题。但是,这将需要比个人计算机中更多的RAM和更快的处理器。

语音识别技术竟然发展如此迅速

 

语音识别的历史

在过去的五十年中,语音识别技术呈指数级增长。最早可以追溯到1976年,那时计算机只能理解1000多个单词。随着IBM继续开发语音识别技术,在20世纪80年代单词理解量跃升至大约20,000。

消费者适用的第一款扬声器识别产品于1990年由Dragon推出,名为DragonDictate。1996年,IBM推出了第一款可识别连续语音的语音识别产品。

21世纪下半叶推出智能手机后,谷歌在iPhone上推出了语音搜索应用程序。三年后,Apple推出了Siri,著名的语音识别助手。在过去的十年中,其他几位技术领导者也开发了更多功能的语音识别软件,亚马逊的Alexa和微软的Cortana-两者都担当了响应语音命令的个人助理。

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