首页 理论教育 如何实现语音识别?语音识别的历史与改进方向探讨

如何实现语音识别?语音识别的历史与改进方向探讨

时间:2023-11-08 理论教育 版权反馈
【摘要】:机器是如何实现语音识别的呢?语音识别的历史在阐述历史之前,小P先来问几个问题。也许你用过很多语音识别软件,是否需要选择语言?现有的语音识别系统还有哪些可以改进的地方?带着这些问题,开始我们这个简短的语音识别之旅吧!语音识别经过了六十多年的发展,到今天已达到较高的识别率。语音识别的基本原理声音是一种波,就像大海的海浪一样,上下起伏。带着这些问题我们来看一下20世纪80到90年代的语音识别模型的处理方式。

如何实现语音识别?语音识别的历史与改进方向探讨

语音识别是实现人机交互关键技术,可以让机器分辨出不同的声音,也是让机器进行深层次理解的基础,最终实现机器对语言的理解。机器是如何实现语音识别的呢?先来回想一下我们自身是如何识别不同事物发出的声音的?比如狮子的吼声、小鸟的鸣叫、钢琴的乐声等。对于声音,我们从直观上来看,有高音,有低音,有长音,有短音,音与音之间产生的不同组合可以反映出不同的韵律以及发出声音者的特征。综上所述,要识别一种事物,最关键的是找出这类事物和其他事物的不同之处,这就是事物的特征。在提取了特征之后,就需要对这些特征进行判断,对于我们来说,起判断作用的就是我们的大脑,在用计算机进行处理时,就称为模型。我们的大脑经过反复的训练和学习才能够对事物进行较为准确的判断,例如经过训练后,可以分辨出不同的音阶,可以根据旋律写下乐谱。与之类似,我们所建立的计算机模型同样也需要训练,这样才可以让机器对某一范围内的事物做出正确的判断。

以史为鉴,我们先来回顾语音识别的历史,从历史的足迹中体会语音识别的基本原理,然后阐述构成一个语音识别系统所需要的基本构件,并学会如何利用Python来完成一些语音识别的工作。

语音识别的历史

在阐述历史之前,小P先来问几个问题。

小P问一问

问题1:声音是什么?

提示:如果不知道的话,可以求助物理学(万物运转的道理)。

问题2:不同的声音在物理世界有哪些不同?

提示:我们可以想一想音乐喷泉的变化,以及不同歌声的变化。

问题3:万事开头难,从易到难,我们如何解决一个简单语音识别任务:识别0~9 10个数字(假如我们的世界中就只有这10个语音)?

问题4:世界如此丰富,如何识别更复杂的语音场景?也许你用过很多语音识别软件(计算机、手机上现在很普遍),是否需要选择语言?是否需要选择方言?在使用过程中都有什么要求?现有的语音识别系统还有哪些可以改进的地方?

带着这些问题,开始我们这个简短的语音识别之旅吧!

语音识别经过了六十多年的发展,到今天已达到较高的识别率。在20世纪50年代,贝尔实验室实现了10个英文数字识别系统,这是一个简单的孤立词识别系统;从20世纪60年代开始,CMU的Reddy开始进行连续语音识别的开创性工作,但进展非常缓慢;到了20世纪70年代,语音识别研究在小词汇量、孤立词的识别方面取得了实质性的进展;20世纪80年代是语音识别快速发展的时期,研究的重点逐渐从孤立词识别系统转向大词汇量、非特定人连续语音识别系统;如果说之前的语音识别基于模板匹配技术,那么20世纪80年代的研究思路就转为基于统计模型,其中具有代表性的是基于GMM-HMM(高斯混合模型-隐马尔可夫模型)的语音识别框架;而20世纪90年代语音识别发展则较为缓慢,但是相关语音产品有了很大进展。关键的突破起始于2006年,自辛顿提出深度置信网络(DBN),促使了深度神经网络(Deep Neural Network,DNN)的发展,之后它在连续语音识别任务上获得突破,从而基于DNN-HMM的语音识别系统成为研究的热点

从上面的这段历史中,我们可以发现人们对语音识别任务的认知不断深入、技术不断改进,上面的文字只是一段历史的简单浓缩,下面我们将介绍语音识别的发展历史,从而使同学们逐步理解语音识别的基本原理。在这里我们用通俗的语言来进行解释,对于其中的数学模型我们不做更深入的探讨。

语音识别的基本原理

声音是一种波,就像大海海浪一样,上下起伏。不同的声音对应的波形不同,包括波形的振动幅度和振动的快慢(频率)。

声波采集

因此在最初的语音识别中,我们可以将一些单字(如1,2,3)的波形进行存储,当输入一个新的数字声音波形时,可以与已经存储的波形进行匹配,与之最接近的就是判定结果。

数字0~10的语音波形

波形到语句

从上面的过程中可以发现,这种方法对于少量、孤立的单词可以解决识别问题,但是如果要识别大词汇量、连续语音,这种方法就存在很大的局限性。究竟该如何解决这个问题?波形需要哪些桥梁才可以与语句产生联系?如何建立起波形到语句之间的模型?

我们分别从输入(波形)、输出(语句)两个方面来进行探究。语句越长,对应的波形就越长。我们可以将语句分解为词,词又可以分为字,字可再分为音素,是否可以将这些细分的单元与波形相对应呢?波形是否也应该进行划分?如果划分应如何划分?划分后该如何建立联系?带着这些问题我们来看一下20世纪80到90年代的语音识别模型的处理方式。

第一个问题是波形划分的基本缘由。由于一个句子是连续的语音,不能完全确定多长对应一个字,因此我们从更小的单位进行划分,最后将这些微小单位进行组合来对应一个音素或者字。这就比如说水是由水分子组成的,而水分子又是由原子和氧原子构成的,不同的原子组合会构成不同的物质。从波形对应语音就类似从原子对应物质,不同的原子组成和分子结构决定了最终的物质形态,而不同的波形微单元(一小段波形,我们通常称它为帧)的组合最终将对应不同的语音。

第二个问题是波形划分的粒度,也就是多长时间划分出一个帧,帧与帧之间是否有重叠。考虑说话时的一个连续过程,也就是音素是一串串连续的,因此在划分时要考虑这种连续性,一般按照一个移动窗进行划分,例如25 ms划分一帧,帧与帧之间有10 ms的重叠。

当分成一帧一帧之后,还需要对波形进行处理,也就是进行特征提取,例如常见的MFCC方法就是根据人耳的生理特性,把每一帧波形都变成一个多维向量。

第三个问题是这些帧如何与音素建立联系。在与音素建立联系之前,先引入状态,状态可以理解为比音素更小的单位,通常把一个音素划分成3个状态。在这里将实现帧与状态的对应关系,也就是当获得一帧的信息时,判断出它最有可能对应哪一个状态,这是靠建立声学模型来实现的,一个模型相当于一个复杂的函数,里面有很多参数,通过这些参数就可以知道帧和状态对应的概率。获取这些参数的方法叫做训练,训练需要使用巨大数量的语音数据,我们已知波形和状态,通过调节参数可使得输入波形时模型的输出状态与已知的状态对应最好。

声波的帧划分

第四个问题是这些状态如何对应音素。解决这个问题的常用方法就是使用隐马尔可夫模型(Hidden Markov Model,HMM)。第一步,构建一个状态网络。第二步,从状态网络中寻找与声音最匹配的路径。那如果想识别任意文本呢?把这个网络搭得足够大,包含任意文本的路径就可以了。(www.xing528.com)

小I最后总结一下语音识别的过程

第一步,把帧识别成状态。

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

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

下图中,每个小竖条都代表一帧,若干帧语音对应一个状态,每3个状态组合成一个音素,若干个音素组合成一个单词。

语音识别过程

以上内容参考https://www.zhihu.com/question/20398418/answer/18080841。

随着深度网络研究的兴起,它对特征提取的能力大为增强,通过大量样本的训练,可以自行分层提取信号特征。因此在声学模型阶段,DNN开始代替GNN工作,直接输入语音的语谱图就可以了。例如语音000111222333的语谱图如下。

语谱图(选自博客https://www.cnblogs.com/hogli/p/5918199.html)

小I最后总结一下语音识别的模型

GNN-HNN+语言模型

DNN+HNN+语言模型

利用Python进行语音操作

在利用Python建立一个语音系统时,可以调用现有计算机操作系统自带的语音模块,也可以使用各大公司提供的语音接口。我们在这里主要利用微软操作系统提供的语音接口来进行语音的识别操作。

首先完成语音的合成,即用键盘输入语句后,合成语音;其次通过语音的输入,调用计算机完成相关任务。

安装speech模块:在cmd窗口键入pip install speech。

#将输入文字转换为语音信号并输出

import speech #导入speech模块

while True:

speech.say("请输入:")

str=input("请输入:")

speech.say("你输入的内容是:")

speech.say(str)

运行结果:

运行程序后,系统会弹出窗口:

计算机系统会合成电子音“请输入”,当输入“你好!”时,计算机会读出“你输入的内容是你好”。当用户说话时,计算机会调用微软自带的语音识别功能进行识别。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈