基于MATLAB的特定人语音识别算法设计 - 图文

更新时间:2024-01-26 09:25:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

本科毕业设计

基于MATLAB的特定人语音识别算法设计

摘 要

语言是人类交换信息最方便、最快捷的一种方式,在高度发达的信息社会中,用数字化的方法进行语音的传送、存储、识别、合成和增强等是整个数字化通信网中最重要、最基本的组成部分之一。而在随着科技技术的发展的今天,除了人与人之间的自然语言通信之外,人与机或机器与机器之间也开始使用语言。也就是因为如此,需要涉及到语音识别技术。为了解决机器能“听懂”人类的语言,在科技如此迅猛发展的今天,语音识别技术一直受到各国科学界的关注,其对计算机发展和社会生活的重要性也日益凸显出来。

在孤立字语音识别中,如语音密码锁,汽车控制等领域,都运用到了特定人语音识别技术,也就是DTW算法,相对于HMM算法,DTW算法具有简单操作。在相同环境下,两者识别效果相差不大,但是HMM算法要复杂得多,主要体现在HMM算法在训练阶段需要提供大量的语音数据,而DTW算法则不需要额外的计算。所以在特定人语音识别当中,DTW算法被广泛使用。

在本次设计中,将运用到MATLAB平台来对语音信号进行处理及识别。相对于C语言而言,MATLAB平台更能给用户提供一个简单易懂的代码分析窗口。而且在个性化设计中,MATLAB可以为用户提供一个人性化界面--GUI。所以,此次设计,通过MATLAB平台建立一个GUI界面,接着对一组语音信号的输入进行预处理及端点检测,提取特征参数(MFCC),形成参考模块。然后再对一组相同的语音信号输入进行同样的操作作为测试模块,与参考模块进行DTW算法进行匹配,输出匹配后的识别结果。

关键词:MATLAB GUI 端点检测 MFCC DTW

Design of Speech Recognition Algorithm Based on Specific MATLAB

Cai Jingzuo

(College of Engineering, South China Agricultural University, Guangzhou 510642, China)

Abstract: Language is a way of human exchange of information the most convenient, quick,

highly developed in the information society, for voice transmission, by using the digital method of storage, recognition, synthesis and enhancement is one of the most important parts of the whole, the most basic digital communication network. While with the development of science and technology today, in addition to natural language communication between people, between people and machine or machine and machine are also starting to use the language. It is because of this, need to involve the speech recognition technology. In order to solve the machine can \the human language, the technology is so rapid development today, the speech recognition technology has been the subject of scientific attention of all countries, the importance of computer development and social life is increasingly prominent.

In the isolated word speech recognition, such as voice password lock, auto control field, are applied to the speech recognition technology, which is relative to the DTW algorithm, HMM algorithm, DTW algorithm has the advantages of simple operation. In the same environment, both the recognition effect is similar, but HMM algorithm is much more complex, mainly reflected in the HMM algorithm need to provide a large amount of speech data in the training phase, while the DTW algorithm does not need the extra computation. So in the speaker-independent recognition, DTW algorithm is widely used.

In this design, will apply to the MATLAB platform to carry on the processing and recognition of speech signal. Compared with the C language, MATLAB platform can provide users with a simple code analysis window. But in the personalized design, MATLAB can provide a human user interface --GUI. So, the design, the establishment of a GUI interface through the MATLAB platform, and then a set of the input speech signal pretreatment, endpoint detection, feature parameter extraction (MFCC), the formation of the reference module. Then a group of the same speech signal input to the same operation as a test module, matching with reference to DTW algorithm module, output matching recognition results. Key words:DTW GUI Endpoint detection MFCC DTW

目 录

1 前言 .......................................................................................................................................... 1 1.1 语音识别的历史背景 ......................................................................................................... 1 1.1.1 国外研究历史及现状 ...................................................................................................... 2 1.1.2 国内研究历史及现状 ...................................................................................................... 3 1.2 语音识别技术的应用及研究方向 ..................................................................................... 4 1.3 语音识别系统的基本构成 ................................................................................................. 5 2 语音信号的数字模型及采集 ................................................................................................ 5 2.1 概述 ..................................................................................................................................... 5 2.2 语音的发音原理 ................................................................................................................. 5 2.2.1 人的发声器官 .................................................................................................................. 5 2.2.2 语音生成 .......................................................................................................................... 7 2.3 语音的听觉机理 ................................................................................................................. 8 2.3.1 听觉器官 .......................................................................................................................... 8 2.3.2 耳蜗的信号处理原理 .................................................................................................... 10 2.4 MATLAB中的语音信号模型 ......................................................................................... 11 2.4.1 wavrecord函数 .............................................................................................................. 11 2.4.2 wavplay函数 ................................................................................................................. 12 3 语音信号的端点检测 .......................................................................................................... 12 3.1 概述 ................................................................................................................................... 12 3.2 MATLAB的语音端点检测算法 ..................................................................................... 15 3.2.1 短时能量的计算 ............................................................................................................ 15 3.2.2 过零率的计算 ................................................................................................................ 15 3.2.3 端点检测的流程 ............................................................................................................ 17 4 语音信号非线性预测分析 .................................................................................................. 18 4.1 概述 ................................................................................................................................... 18 4.2 MFCC的基本原理 ........................................................................................................... 19 4.3 实验结果 ........................................................................................................................... 20 5 特定人语音识别算法-DTW算法 ...................................................................................... 20

I

5.1 DTW算法原理 ................................................................................................................. 20 5.2 DTW算法流程及实验结果 ............................................................................................. 23 5.2.1 算法流程 ........................................................................................................................ 23 5.2.2 实验结果 ........................................................................................................................ 23 6 GUI设计 .............................................................................................................................. 25 6.1 概述 ................................................................................................................................... 25 6.2 GUI界面的打开 ............................................................................................................... 25 6.3 作品演示 ........................................................................................................................... 27 7 结论 ...................................................................................................................................... 28 参考文献 .................................................................................................................................... 29 附录 ............................................................................................................................................ 30 附录A 语音识别主函数 .......................................................................................................... 30 致谢 ............................................................................................................................................ 36 本科生毕业设计成绩评定表

II

1前言

语言是人类交换信息最方便、最快捷的一种方式,在高度发达的信息社会中,用数字化的方法进行语音的传送、存储、识别、合成和增强等是整个数字化通信网中最重要、最基本的组成部分之一。随着人类步入信息社会步伐的加快,越来越多的地方需要用到语音信号处理的知识。

而MATLAB作为一个语音信号处理的平台,是一个高性能的科学计算软件,广泛应用于数学计算、算法开发、数学建模、系统仿真、数据分析处理及可视化、科学和工程绘图、应用系统开发(包括建立用户界面)等。其语言是一种简单、高效、功能极强的高级语言,具有强大的矩阵运算能力和极高的编程效率,这一方面使得MATLAB程序可以被高度向量化,另一方面使得程序易读易写。

本设计主要围绕着MATLAB平台进行语音信号的录制及预处理,提取特征参数,建立两种模块,一组为参考模块,一组为测试模块,然后通过DTW算法进行匹配,算出匹配结果。主要通过用户开发界面直观地呈现出来。 1.1 语音识别的历史背景

早在计算机发明之前,自动语音识别的设想就已经被提上了议事日程,早期的声码器可被视作语音识别及合成的雏形。而1920年代生产的\Radio Rex\玩具狗可能是最早的语音识别器,当这只狗的名字被呼唤的时候,它能够从底座上弹出来。最早的基于电子计算机的语音识别系统是由AT&T贝尔实验室开发的Audrey语音识别系统,它能够识别10个英文数字。其识别方法是跟踪语音中的共振峰。该系统得到了98%的正确率。到1950年代末,伦敦学院(Colledge of London)的Denes已经将语法概率加入语音识别中。1960年代,人工神经网络被引入了语音识别。这一时代的两大突破是线性预测编码Linear Predictive Coding (LPC),及动态时间弯折Dynamic Time Warp(DTW)技术。

语音识别技术的最重大突破是隐含马尔科夫模型Hidden Markov Model(HMM)的应用。从Baum提出相关数学推理,经过Labiner等人的研究,卡内基梅隆大学的李开复最终实现了第一个基于隐马尔科夫模型的大词汇量语音识别系统Sphinx。此后严格来说语音识别技术并没有脱离HMM框架。

尽管多年来研究人员一直尝试将“听写机”推广,但是语音识别技术在目前还无法支持无限领域,无限说话人的听写机应用。

1

1.1.1 国外研究历史及现状

国外的语音识别的研究工作可以追溯到20世纪50年代AT&T贝尔实验室的Audry系统,它是第一个可以识别十个英文数字的语音识别系统。

但真正取得实质性进展,并将其作为一个重要的课题开展研究则是在60年代末70年代初。这首先是因为计算机技术的发展为语音识别的实现提供了硬件和软件的可能,更重要的是语音信号线性预测编码(LPC)技术和动态时间规整(DTW)技术的提出,有效的解决了语音信号的特征提取和不等长匹配问题。这一时期的语音识别主要基于模板匹配原理,研究的领域局限在特定人,小词汇表的孤立词识别,实现了基于线性预测倒谱和DTW技术的特定人孤立词语音识别系统;同时提出了矢量量化(VQ)和隐马尔可夫模型(HMM)理论。

实验室语音识别研究的巨大突破产生于20世纪80年代末:人们终于在实验室突破了大词汇量、连续语音和非特定人这三大障碍,第一次把这三个特性都集成在一个系统中,比较典型的是卡耐基梅隆大学(CarnegieMellonUniversity)的Sphinx系统,它是第一个高性能的非特定人、大词汇量连续语音识别系统。 这一时期,语音识别研究进一步走向深入,其显著特征是HMM模型和人工神经元网络(ANN)在语音识别中的成功应用。HMM模型的广泛应用应归功于AT&TBell实验室Rabiner等科学家的努力,他们把原本艰涩的HMM纯数学模型工程化,从而为更多研究者了解和认识,从而使统计方法成为了语音识别技术的主流。

统计方法将研究者的视线从微观转向宏观,不再刻意追求语音特征的细化,而是更多地从整体平均(统计)的角度来建立最佳的语音识别系统。在声学模型方面,以Markov链为基础的语音序列建模方法HMM(隐式Markov链)比较有效地解决了语音信号短时稳定、长时时变的特性,并且能根据一些基本建模单元构造成连续语音的句子模型,达到了比较高的建模精度和建模灵活性。在语言层面上,通过统计真实大规模语料的词之间同现概率即N元统计模型来区分识别带来的模糊音和同音词。另外,人工神经网络方法、基于文法规则的语言处理机制等也在语音识别中得到了应用。

20世纪90年代前期,许多著名的大公司如IBM、苹果、AT&T和NTT都对语音识别系统的实用化研究投以巨资。语音识别技术有一个很好的评估机制,那就是识别的准确率,而这项指标在20世纪90年代中后期实验室研究中得到了不断的提高。比较有代表性的系统有:IBM公司推出的ViaVoice和DragonSystem公司的

2

NaturallySpeaking,Nuance公司的NuanceVoicePlatform语音平台,Microsoft的Whisper,Sun的VoiceTone等。

其中IBM公司于1997年开发出汉语ViaVoice语音识别系统,次年又开发出可以识别上海话、广东话和四川话等地方口音的语音识别系统ViaVoice'98。它带有一个32,000词的基本词汇表,可以扩展到65,000词,还包括办公常用词条,具有“纠错机制”,其平均识别率可以达到95%。该系统对新闻语音识别具有较高的精度,是目前具有代表性的汉语连续语音识别系统。 1.1.2 国内研究历史及现状

我国语音识别研究工作起步于五十年代,但近年来发展很快。研究水平也从实验室逐步走向实用。从1987年开始执行国家863计划后,国家863智能计算机专家组为语音识别技术研究专门立项,每两年滚动一次。我国语音识别技术的研究水平已经基本上与国外同步,在汉语语音识别技术上还有自己的特点与优势,并达到国际先进水平。中科院自动化所、声学所、清华大学、北京大学、哈尔滨工业大学、上海交通大学、中国科技大学、北京邮电大学、华中科技大学等科研机构都有实验室进行过语音识别方面的研究,其中具有代表性的研究单位为清华大学电子工程系与中科院自动化研究所模式识别国家重点实验室。

清华大学电子工程系语音技术与专用芯片设计课题组,研发的非特定人汉语数码串连续语音识别系统的识别精度,达到94.8%(不定长数字串)和96.8%(定长数字串)。在有5%的拒识率情况下,系统识别率可以达到96.9%(不定长数字串)和98.7%(定长数字串),这是目前国际最好的识别结果之一,其性能已经接近实用水平。研发的5000词邮包校核非特定人连续语音识别系统的识别率达到98.73%,前三选识别率达99.96%;并且可以识别普通话与四川话两种语言,达到实用要求。

中科院自动化所及其所属模式科技(Pattek)公司2002年发布了他们共同推出的面向不同计算平台和应用的“天语”中文语音系列产品——PattekASR,结束了中文语音识别产品自1998年以来一直由国外公司垄断的历史。

如果从识别系统的词汇量大小考虑,也可以将识别系统分为3类:(1)小词汇量语音识别系统。通常包括几十个词的语音识别系统。(2)中等词汇量的语音识别系统。通常包括几百个词到上千个词的识别系统。(3)大词汇量语音识别系统。通常包括几千到几万个词的语音识别系统。随着计算机与数字信号处理器运算能力以及识别系统精度的提高,

3

识别系统根据词汇量大小进行分类也不断进行变化。目前是中等词汇量的识别系统到将来可能就是小词汇量的语音识别系统。这些不同的限制也确定了语音识别系统的困难度。 1.2 语音识别技术的应用及研究方向

语音识别技术是计算机智能接口与人机交互的重要手段之一。从目前及整个社会的发展来看,已经诞生了全球首套多语种交谈式语音识别系统E-talk。这是全球唯一拥有中英混合语言的识别系统,可以识别出普通话、粤语和英语,还可以适应不同的地方口音。由于E-talk可以提高工作效率,降低运营成本,并为用户提供便捷的增值服务,它将成为电信、证券、金融等重视客户服务的行业争相引用的电子商务应用系统。

目前,飞利浦推出的语音识别自然会话平台SpeechPearl和SpeechMania已成功地应用于国内呼叫中心,SpeechPearl中的每个识别引擎可提供高达20万字的超大容量词库,尤其在具有大词汇量、识别准确性和灵活性等要求的各种电信增值服务中有着广泛的应用。 对于语音编码而言,长期以来,在通信网的发展中,解决信息传输效率是一个极其重要的关键问题。目前科研人员已通过两个途径研究这一课题,其一是研究新的调制方法与技术,来提高信道传输信息的比特率,指标是每赫兹带宽所传送的比特数;其二是压缩信源编码的比特率。这对任何频率资源有限的传输环境来说,无疑是极为重要的,尤其是在无线通信技术决定今后通信发展命运的今天更显得重要。实际上,压缩语音编码比特率与话音存储、语音识别及语音合成等技术都直接相关。

数字语音编码技术从1938年提出PCM开始,其编码方法已有了很大的发展,如1968年提出的线性预测编码技术(LPC)、20世纪70年代末出现的隐马尔科夫技术(HMM)以及矢量量化(VQ)等。

随着技术的不断发展及网络技术的日益完善和普及,语音识别技术也出现了一些新的研究方向。

① 连续自然语音的识别。目的是能让计算机更好的理解人说的话,能让计算机更好的处理人类流畅的自然发音,该技术需要解决的难点很多,对它的研究是今后的目标之一。

②语音识别技术与多媒体技术的结合。今后的发展,人类对语音信号的需要将不仅仅局限于可懂性和正确性上了,而是需要在合成语音的美感的同时并输出辅助的视频特征,实现主持人的效果。

③不同语种的解决。不同民族有不同的语言,在如今开放的信息网络时代,不同语言之间的交流显得十分重要,因此,多语种的合成有着独特的应用价值。例如,在自动

4

电话翻译、有声电子邮件等应用中都涉及到了多语种合成的需求。 1.3 语音识别系统的基本构成

语音识别系统的总体结构如图1.1。首先通过语音的录制作为输入信号,输入的模拟语音信号要进行预处理,包括预滤波、采样和量化、加窗、端点检测、预加重等等。经过预处理后,接下来就是重要的一环:特征参数提取。要求是: (1)提取的特征参数要能有效地代表语音特征,具有很好的区分性。 (2)各阶参数之间有良好的独立性。

(3)特征参数要计算方便,最好有高效的计算方法,以保证语音识别的实时实现。

语音输入 预处理 特征提取 识别 参考 模块 训练 测度估计 识别决策 识别 结果 模板库 专家知识 图1.1 语音识别总体架构

训练阶段,将特征参数进行一定的处理之后,为每个词条得到一个模型,保存为模板库。在识别阶段,语音信号经过相同的通道得到语音参数,生成测试模板,与参考模板进行匹配,将匹配分数最高的参考模板作为识别结果。

2语音信号的数字模型及采集

2.1 概述

为了实现语音识别,首先得对语音信号产生的原理进行一个剖析,因此,我们只有在对人的发声器官和发声机理进行研究的基础上,才能够清晰的理解到语音信号产生的数学模型。当然,人类的发音过程过于复杂性和语音信息的丰富性及多样性,所以至今为止仍未找到一种能够准确描述语音产生过程。

同样,作为接受信息的人耳的听觉系统,其听觉机理也是相当复杂的。本章将简单介绍人发声及收听的基本原理,重点介绍计算机的模拟函数wavrecord和wavplay。 2.2 语音的发音原理 2.2.1 人的发声器官

人类的语音是由人的发声器官在大脑控制下的生理运动产生的。主要由三部分组成:

5

①肺和气管产生气源;②喉和声带组成声门;③由咽腔、口腔、鼻腔组成声道,如图2.1(张雪英,2012.7)所示的发声器官模型。

图2.1 发声器官模型

肺的发声功能主要是产生压缩气体,通过气管传送到声音生成系统。气管连接着肺和喉,它是肺与声道联系的通道。

图2.2 喉的平面解剖图

喉是控制声带运动的软骨和肌肉的复杂系统,主要包括:环状软骨、甲状软骨、杓状软骨和声带。其中声带是重要的发声器官,它是伸展在喉前、后端之间的褶肉,如图2.2(张雪英,2012.7)所示,前段由甲状软骨支撑,后端由杓状软骨支撑,而杓状软骨 又与环状软骨较高部分相联。这些软骨在环状软骨上的肌肉的控制下,能将两片声带合拢或分离。声带之间的间隙称为声门。声带的声学功能主要是产生激励。位于喉前 呈圆形的甲状软骨称为喉结。

声道是指声门至嘴唇的所有发音器官,其纵剖面图如图2.3(张雪英,2012.7)所示。包括:咽喉、口腔和鼻腔。口腔包括上下唇、上下齿、上下齿龈、上下腭、舌和小舌等

6

部分。上腭又分为硬腭和软腭两部分;舌又分为舌尖、舌面和舌根三部分。鼻腔在口腔上面,靠软腭和小舌将其与口腔隔开。当小舌下垂时,鼻腔和口腔便耦合起来,当小舌上抬时,口腔与鼻腔是不相通的。口腔和鼻腔都是发生时的共鸣器。口腔中各器官能够协同动作,使空气流通过时形成各种不同情况的阻碍并产生振动,从而发出不同的声音来。声道可以看成是一根从声门一直延伸到嘴唇的具有非均匀截面的声管,其截面面积主要取决于唇、舌、腭和小舌的形状和位置,最小截面面积可以为零(对应于完全闭合的部位),最大截面积可以达到约20cm2。在产生语音的过程中,声道的非均匀截面又是随着时间在不断地变化的。成年男性的声道的平均长度约为17cm。当小舌下垂使鼻腔和口腔耦合时,将产生出鼻音来。

图2.3 声道纵剖面图

2.2.2 语音生成

在发声器官模型图2.1(张雪英,2012.7)中,空气由肺部排入喉部,经过声带进入声道,最后由嘴发声声波,形成语音。在声门(声带)以左,称为“声门子系统”,它负责产生激励震动;右边是“声道系统”和“辐射系统”。当发不同性质的语音时,激励和声道的情况是不同的,他们对应的模型也是不同的。 1. 发浊音的情况

7

空气流经过声带时,如果声带是崩紧的,则声带将产生张弛振动,即声带将周期性地启开和闭合。声带启开时空气流从声门喷射出来,形成一个脉冲,声带闭合时相应于脉冲序列的间隙期。因此,这种情况下在声门处产生出一个准周期脉冲状的空气流。该空气流流经过声道后最终从嘴唇辐射出声波,这便是浊音语音。 2. 发清音的情况

空气流经过声带时,如果声带是完全舒展开来的,则肺部发出的空气流将不受影响地通过声门。空气流经过声门后,会遇到两种不同情况。一种情况是,如果声道的某个部位发生收缩形成了一个狭窄的通道,当空气流达到此处时被迫以高速冲过收缩区,并在附近产生出空气湍流,这种湍流空气通过声道后便形成所谓的摩擦音或清音。第二种情况是,如果声道的某个部位完全闭合在一起,当空气流达到时便在此处建立起空气压力,闭合点突然开启便会让气压快速释放,经过声道后便形成所谓爆破音。这两种情况下发出的音称为清音。 2.3 语音的听觉机理

听觉是接受声音并将其转换成神经脉冲的过程。大脑受到听觉神经脉冲的刺激感知为确定的含义是一个非常复杂的过程,至今仍未完全清楚。 2.3.1 听觉器官

人的听觉器官分三个部分:外耳、中耳和内耳,如图2.4(张雪英,2012.7)所示。

图2.4 听觉器官

外耳由位于头颅两侧呈贝壳状和向内呈S状弯曲的外耳道组成,包括:耳廓、耳壳和外耳道。主要作用是收集声音、辨别声源,并对某些频率的声音有扩大作用。声音沿

8

外耳道传送至鼓膜,外耳道有许多共振频率,恰好落在语音频率范围内。

中耳主要由鼓膜和听骨链组成。听骨链由三块听小骨组成,分别为锤骨、砧骨和镫骨。其中锤骨柄与骨膜相连,镫骨底板与耳蜗的前庭窗相连。声音经骨膜至内耳的传输过程主要由听骨链来完成。由于鼓膜的面积比前庭窗大出许多倍(55:3.2),听骨链有类似杠杆的作用,所以人的声音从鼓膜到达内耳时,能量扩大了20多倍,补充声音在传播过程中的能量消耗。由于中耳将气体运动高效地转为液体运动,所以它实际上起到一种声阻抗匹配的作用,由此可以看出,整个中耳的主要生理功能是传音,即将声音由外耳道高效的传入耳蜗。

从上述分析可以看出,中耳的主要功能是改变增益,还有就是对外耳和内耳进行匹配阻抗。

内耳是颅骨腔内的一个小而复杂的体系,由前庭窗、圆窗和耳蜗构成,前庭窗在听觉机制中不起什么作用,圆窗可以为不可压缩液体缓解压力,耳蜗是内耳的主要器官,它是听觉的收纳器,形似蜗牛壳,为螺旋样骨管。蜗底面向内耳道,耳蜗神经穿过此处许多小孔进入耳蜗耳蜗中央有呈圆锥形骨质的蜗轴,从蜗轴有螺旋板伸入耳蜗管内,由 耳蜗底盘旋上升,直到蜗顶。它由三个分割的部分组成:骨阶、中阶和前庭阶。骨阶与中耳通过圆窗相连,前庭阶与中耳的镫骨由前庭窗的膜相连,骨阶和前庭阶在耳蜗的顶端即蜗孔处是相通的。中阶的底膜称为基底膜(Basilar membrane),在基底膜之上是科蒂式器官(Oragan of Corti),它由耳蜗覆膜(Tectorial membrane)、外毛细胞(Outer hair cell)及内毛细胞(Inner hair cell)构成。如图2.5(张雪英,2012.7)所示。

图2.5 内耳结构图

9

2.3.2 耳蜗的信号处理原理

当声音经外耳传入中耳时,镫骨的运动引起耳窝内流体压强的变化,从而引起行波沿基底膜的传播。如图2.6(张雪英,2012.7)所示的流体波的简单表示。在耳蜗的底部基底膜的硬度很高,流体波传播的很快。随着波的传播,膜的硬度变得越来越小,波的传播也逐渐变缓。不同频率的声音产生不同的行波,而峰值出现在基底膜的不同位置上。频率较低时,基底膜振动的幅度峰值出现在基底膜的顶部附近;相反,频率较高时,基底膜振动的幅度峰值出现在基底膜的基部附近(靠近镫骨)。如果信号是一个多频率信号,则产生的行波将沿着基底膜在不同的位置产生最大的幅度如图2.7(张雪英,2012.7)所示。从这个意义上讲,耳蜗就像一个频谱分析仪,将复杂的信号分解成各种频率分量。

图2.6 耳蜗内流体波简单表示

图2.7 基底膜上6个不同点的频率响应

基底膜的振动引起毛细胞的运动,使得毛细胞上的绒毛发生弯曲。绒毛向一个方向的弯曲会使细胞产生去极化,即开启离子通道产生向内的离子流,从而使传入神经开放

10

增加。而绒毛向另一个方向弯曲时,则会引起毛细胞的超极化,即增加细胞膜电位,从而导致抑制效应。因此,内毛细胞对于流体运动速度而言,就像一个自动回零的半波整流器。在基底膜不同部位的毛细胞具有不同的电学与力学特征。在耳蜗的基部,基底膜宽而柔和,毛细胞及其绒毛也较长而柔和。正是由于这种结构上的差异,因此它们具有不同的机械谐振特性和电谐振特性。外毛细胞可在中枢神经系统的控制下调节科尔蒂器官的力学特性,内毛细胞则负责声音检测并激励传入神经发放,而内外毛细胞通过将其绒毛插入共同的耳蜗覆膜而耦合。这样,外毛细胞性质的变化可以调节内毛细胞的调谐,使整个耳蜗的动态功能处于大脑控制之下。 2.4 MATLAB中的语音信号模型

前两节均详细解释了人的发音及听觉原理。可以看出,发音过程及收听语音的过程是及其复杂的。所以对于计算机而言,是难以找到一种完全接近的算法来诠释发音及收听过程。但是,在MATLAB R2011B中,有两个函数可以用来模拟人的发音及收集语音功能,即wavplay函数跟wavreord函数。 2.4.1 wavrecord函数 wavrecord的用法: y = wavrecord(n,Fs); y = wavrecord(n,Fs,ch); y = wavrecord(n,Fs,ch,'dtype'); y = wavrecord(n,Fs,ch,'dtype');

其中n为样本数,Fs为采样频率,默认值为11025,ch为通道数,默认为1,若为2,则表示采样为双声道立体声数据,该参数可以省略,dtype为采样数据的存储格式,用字符串指定,如表2.1:

表2.1 字符串值为“dtype”以及相应的位/样品和可接受的数据范围y dtype Bits/sample y Data Range 'double' 'single' 'int16' 'uint8'

audiorecorder也可以用来录制音频,但是在操作上,因为通常采用的语音格式以wav

11

16

16 16 8 –1.0 <= y < +1.0 –1.0 <= y < +1.0 –32768 <= y <= +32767

0 <= y <= 255

格式为主,在保存语音上,wavrecord比audiorecorder能更好的与uiputfile相结合,所以用wavrecord比audiorecorder比较好。 2.4.2 wavplay函数

wavplay函数的用法: wavplay(y,Fs)

wavplay(y,Fs,mode)

其中,y为输入信号,Fs为频率,其数据类型如表2.2所示

表2.2 wavpaly的数据类型

Data Type Quantization

Double-precision(default value) Single-precision 16-bit signed integer 8-bit unsigned integer

在播放音频上,还有sound与soundsc也可以用来进行音频的回放,它们可以在任何操作系统平台上使用,而wavplay只支持Windows平台。但是因为在语音识别中,通常采用的语音格式为wav格式,而wavplay与wavrecord的配合能更好的操作运行起来,两者结合共同使用。举个例子: Fs=11025;

y=wavrecord(5*Fs,Fs,’int16’); wavplay(y,Fs);

该段代码意思为:通过Windows的录音设备以11025Hz的采样频率录制5秒的数据,采样精度为16位,存储格式为int16;随后通过Windows的音频设备进行播放 在MATLAB中处理语音信号时,可以通过wavplay回放录制好了的语音,具有快速检验数据和计算的可靠性。但是在录音时候,wavrecord有很大的局限性,在录制语音的时候必须制定语音的时间。如果时间太短或者在指定的时间内用户没有说话,就会漏掉部分或全部的语音数据,这样操作起来不方便。另外,在一个语音识别系统中,程序必须自动判断当前是静音还是用户在说话,如果用户有发出过语音,那么应该保存该段语音,然后将头部和尾部的静音部分删除掉,这一功能被称为语音信号的端点检测。

16 bits/sample

16 bits/sample 16 bits/sample 8 bits/sample

3 语音信号的端点检测

3.1 概述

在详解语音信号的端点检测之前,先来了解一下语音信号的特征,如图3.1可以看到,

12

数字“1”信号在大致4500~11000之间的采样点属于发音状态,头部跟尾部的信号幅度都很低,属于静音或噪音。

图3.1 数字“1”的时域图

图3.2是数字“1”的头部放大图,从图中可以看出,在4400之前的信号幅度很低,明显属于静音,而从4400开始,幅度开始增强,并且有明显的周期性,两个尖峰之间的距离就是所谓的基音周期,也就是人的声带振动的周期。

这样的话,我们可以用信号的幅度作为特征,区分静音和语音。只要设定一个门限,当信号幅度超过这个门限的时候,就当作语音开始,当幅度降低到门限以下的时候就认为语音结束。

图3.2 数字“1”头部放大图

13

因此,我们可以采用短时能量来描述语音信号的幅度。比如,对于一个读取到的语音信号x(n),其中n为采样点,首先进行分帧,将语音信号分为每20~30ms一段,相邻两帧起始点之间间隔为10ms,也就是说两帧之间有10~20ms的交叠。由于采样频率的差异,帧长和帧移所对应的实际采样点数都不一样。举个例子:一个8kHz的采样频率,30ms的帧长对应240点,记为N,而10ms的帧移对应为80点,记为M。 对应第i帧,第n个样本,它与原始语音信号的关系为:

xi(n)=x[(i-1)M+n]

第i帧的语音信号的短时能量就可以用下面几种算法得到:

e(i)??|xi(n)|

n?12e(i)??xn(n)

n?1NN2e(i)??logxn(n)

n?1N 分别为绝对值的累加、平方累加和平方的对数的累加,选择其中一种就可以了。

计算完每帧的短时能量,然后再设定一个门限,就可以实现一个简单的检测算法了。但是这种算法不可靠,因为人的发音有清音和浊音之分,浊音为声带振动发出,对应的幅度高,周期性明显,而清音则不会有声带的震动,只是靠空气在口腔中的摩擦、冲击或爆破而发音,其短时能量一般比较小。如声母“s”、“c”等的幅度就很低,往往会被漏掉。

图3.3 数字“3”的头部放大图

14

比如图3.3显示的数字“3”开始部分的波形,可以看到声母“s”的范围大概为6400~7100。幅度明显比后面的低很多,以至于有时用肉眼都难以区分跟静音的区别,所以基于短时能量的算法对这些语音信号几乎无能为力。

不过虽然不能用短时能量可靠的区分开,但是可以发现在静音段信号的波形变化相对比较缓慢,而在清音段,因为口腔空气摩擦的效果,造成的波形在幅度上相对变化比较剧烈,这时,可以通过用一帧信号中波形穿越零电平的次数来描述这种变化的剧烈程度,成为过零率,公式为:

ZCR(i)??|xi(n)?xi(n?1)|

n?1N?1 实际上,为了避免静音段的随机噪声产生过高的过零率,通常都会先设定一个门限,当前后两个采样的符号不同时,而且差值大于该门限的时候,就将过零率的数值加1。 3.2 MATLAB的语音端点检测算法

该算法不是实时运行的,而是读取一个wav文件获得语音采样,然后将其分帧计算短时能量和过零率参数,再进行端点检测。这种方式称为离线处理方法。 3.2.1 短时能量的计算

基于前面讲过的三种定义的短时能量分别可以用下面三条命令实现: amp1=sum(abs(y),2); amp1=sum(y.*y,2); amp1=sum(log(y.*y+eps),2);

在计算短时能量时,一般都要将语音信号通过一个一阶高通滤波器1-0.9375z-1,称为预加重滤波器,它的目的在于滤除掉低频干扰,尤其是50Hz或60Hz的工频干扰,提升更为有用的高频部分的频谱。在计算短时能量之前应用该滤波器,还可以起到消除直流漂移、抑制随机噪声和提升清音部分能量的效果。公式为:

amp = sum(abs(enframe(filter([1 -0.9375], 1, x), FrameLen, FrameInc)), 2);

在公式中用的虽是绝对值能量,实际上就是平均幅度。 3.2.2 过零率的计算

过零率的计算则没有那么简单。其计算过程如图3.4所示。

15

输入语音信号 设定一个门限delta x(j)+x(j+1)<0&abs(x(j)-x(j+1))>delta? j=j+1 否 是 zcr(i)=zcr(i)+1 图3.4 短时过零率流程图

在计算流程中,可以设置门限delta=0.02。这个门限可以进行细微的调整,通过该流程并编写相应的代码可以得到图3.5波形。

与原始语音信号波形一起可以看到,语音信号声母部分的幅度虽然比较低,但是其过零率的数值却很高,峰值将近50,而在其后面的韵母部分过零率则比较低,在20左右。

16

图3.5 过零率波形图

因此,在实际应用中,一般都是利用过零率来监测清音,利用短时能量来监测浊音,两者配合起来则实现可靠的端点检测。用得比较多的是一种双门限的算法。在过零率的程序中,为了后面处理方便,通常将读取的语音信号进行归一化,即:

x=x./max(abs(x));

然后再计算语音信号的短时能量和过零率,而该程序用了两重循环,影响了运算速度,为了提高算法的效率,通常采用一种矢量化的计算方法,如下: tmp1= enframe(x(1:end-1), FrameLen, FrameInc); tmp2= enframe(x(2:end), FrameLen, FrameInc); signs = (tmp1.*tmp2)<0; diffs = (tmp1 -tmp2)>0.02; zcr = sum(signs.*diffs, 2);

以上代码中,tmp1和tmp2都是由x得到,但是相互之间相差一个采样点,signs为符号数组,用于存储相邻两个采样点的符号是否相同,也就是说是否穿越零电平。diffs用来度量相邻两个采样点之间的距离,如果距离大于所设置的门限即0.02,则为1,否则为0。最后将两个矩阵点相乘就可以得到满足两个条件的采样点矩阵。然后将其按帧求和,就可以得到过零率。 3.2.3 端点检测的流程

前两小节均介绍了语音端点检测两点主要算法,其检测流程如图3.6所示。

进入状态status开始检测 17

调整能量门限 设置短时能量高、低门限 设置短时过零率高、低门限 语音信号 输入 归一化 计算短时能量 计算过零率

图3.6 端点检测算法流程图

检测之前,先为短时能量和过零率分别确定两个门限。一个是比较低的门限,其数值比较小,对信号的变化能够敏感,很容易就会被超过;而另一个是比较高的门限,数值要求比较大,信号要达到一定的强度,该门限才可能被超过。不过,低门限被超过未必就是语音的开始,有可能是时间很短的噪声引起的。高门限被超过的话则可以基本确定是由于语音信号引起的。

然后计算短时能量及过零率,并调整好能量门限,接下里进入到最关键的一步,即变量status分析,status可以分为四种状态,如图3.7所示。

{0,1} 2 3 status 图3.7 status分析

(1)在静音段,如果能量或过零率超越了低门限,就应该开始标记起始点,进入过渡段。即status {0,1}状态;(2)在过渡段,由于参数的数值小,不能确定是否处于真正的语音段,所以只要当两个参数的数值都回落到低门限以下,就要将当前状态恢复到静音状态,但是如果在过渡段中两个参数中的任何一个超过了高门限,那么就可以确定进入语音段了。即status 2状态;(3)结束段,即status 3状态。

注意:一些突发性的噪声也会引起短时能量或过零率的数值变高,但是往往不能维持足够长的时间,比如门窗的开关、物体的碰撞等引起的噪声。这些都可以通过设置最短时间门限来判定。即当前状态如果处于语音段时,若两个参数的数值降低到最低门限以下,而且总的记时长度小于最短时间门限,那么认为这一段为噪声,然后继续扫描接下来的语音数据,否则就标记好结束端点并且返回。

4 语音信号非线性预测分析

4.1 概述

随着语音识别技术在各个国家的科学界受到重视,寻找一种与人耳相近的参数是每个科学家的目标,而近年来,一种能够比较充分利用人耳这种特殊的感知特性的参数得到

18

广泛应用,这种参数就是Mel尺度倒谱参数(Mel-scaled Cepstrum Coefficients),或称Mel频率倒谱参数,简称MFCC。同时,有一种与MFCC系数类似也是基于发音模型的LPCC系数,不过,LPCC参数没有充分利用到人耳的听觉特性,是一种线性系统。所以MFCC参数比LPCC参数更好地提高系统的识别性能。

本章主要介绍语音信号非线性预测分析(MFCC参数)的基本原理,算法流程及所涉及的参数。 4.2 MFCC的基本原理

在语音识别处理信号过程中,MFCC参数是按照帧计算的。其特征提取及计算过程如图4.1所示。

x(n) 预加重、分帧、加窗 端点 检测 DFT/FFT Mel频率 滤波器组 log 对数能量 DCT 求倒谱 图4.1 MFCC特征提取及计算流程

(1)预加重、分帧及加窗

在语音参数计算之前,一般要将其通过一个预加重滤波器,预加重目的是为了对语音的高频部分进行加重增加其高频分辨率,其函数为:

x=filter([1 -0.9375],1,x);

分帧操作主要是提取语音短时特性便于建模,一般取帧长30ms,帧移10ms;对于语音信号时域分析来说,窗函数的选择很重要,虽说矩形窗平滑比较好,但是容易丢失波形细节,并有可能造成泄漏现象。而Hamming窗可以有效的客服泄漏现象。所以在加窗方面常以Hamming窗为主,即:

(2)端点检测

端点检测是语音识别中的一个重要环节,有效的端点检测方法不仅可以减少数据的存储量和处理时间,还可以排除无声段的噪声干扰。而在第三章就详细介绍了基于短时能量和短时过零率的端点检测算法过程。可以参考下第三章的端点检测算法。

(3)FFT算法计算:在序列后补零以构成N=512点在进行离散FFT变换,第i帧语言的频谱为:错误!未找到引用源。。

19

(4)将上述线性频谱X(k,i)通过在频率范围内设置的若干个具有三角滤波特性的带同滤波器错误!未找到引用源。的Mel滤波器组得到Mel频谱。总传递函数为: 错误!未找到引用源。

(5)将对数能量谱S(k,i)经过离散余弦变换(DTC)即可得到Mel倒谱系数错误!未找到引用源。,M为滤波器的个数:错误!未找到引用源。。 4.3 实验结果

经过MFCC的基本原理分析编写相应的代码,然后通过MATLAB R011B运行附录中的代码。可以得到每一组数据的时域图、短时能量图及MFCC分析图,如图4.2所示。

从图中可以看出,在计算数字“1”的MFCC系数时,经过预处理,加窗,FFT算法及倒谱系数计算过后,其波形基本稳定在同一条线上。

图4.2 数字“1”的MFCC图

5 特定人语音识别算法-DTW算法

5.1 DTW算法原理

在孤立词语音识别中,最为简单有效的方法是采用DTW算法,该算法基于动态规划(DP)的思想,解决了发音长短不一的模板匹配为题,是语音识别中出现较早、较为经典的一种算法。用于孤立词识别,DTW算法与HMM算法在相同的环境条件下,识别效果相差不大,但HMM算法要复杂的多,这主要体现在HMM算法在训练阶段需要提供大量的语音数据,通过反复计算才能得到模型参数,而DTW算法的训练中几乎不需

20

要额外的计算。所以对于孤立词语音识别,DTW算法得到广泛的应用。

无论在训练和建立模板阶段还是在识别阶段,都先采用端点检测算法确定语音的起点和终点。已存入模板库的各个词条称为参考模板,一个参考模板可以表示为

?R(1),R(2),...,R(m),...,R(M)?,m为训练语音帧的时序标号,m=1为起点语音帧,m=M为

终点语音帧,因此M为该模板所包含的语音帧总数,R(m)为第m帧语音特征矢量。所要识别的一个输入词条语音称为测试模板,可表示为?T(1),T(2),...,T(n),...,T(N)?,n为测试语音帧的时序标号,n=1为起点语音帧,n=N为终点语音帧,因此N为该模板所包含的语音帧总数,T(n)为第n帧语音特征矢量。参考模板与测试模板一般采用相同类型的特征矢量(如MFCC系数)、相同的帧长、相同的窗函数和相同的帧移。 假设测试和参考模板分别用T和R表示,为了比较它们之间的相似度,可以计算它们之间的距离D[T,R],距离越小则相似度越高。为了计算这一失真距离,应从T和R中各个对应帧之间的距离算起。设n和m分别是T和R中任意选择的帧号,d[T(n),R(m)]表示这两种特征矢量之间的距离。距离函数取决于实际采用的距离度量,在DTW算法中通常采用欧氏距离。

若N=M则可以直接计算,否则要考虑将T(n)和R(m)对齐。对齐可以采用线性扩张的方法,如果N

?R(1),R(2),...,但是这样的计算没有考虑到语音中各个段在不同的情况R(M)?之间的距离。

下的持续时间会产生或长或短的变化,因此识别效果不可能最佳。因而更多地是采用动态规划(DP)的方法。

通常,规整函数被限制在一个平行四边形的网格内,如图5.1所示。它的一条边斜率为2,另一条边斜率为1/2。规整函数的起点是(1, 1),终点为(N,M)。DTW算法的目的是在此平行四边形内由起点到终点寻找一个规整函数,使其具有最小的代价函数,保证了测试模板与参考模板之间具有最大的声学相似特性。

21

图5.1 DTW原理图

由于在模板匹配过程中限定了弯折的斜率,因此平行四边形之外的格点对应的帧匹配距离是不需要计算的。另外,因为每一列各格点上的匹配计算只用到了前一列的3个网格,所以没有必要保存所有的帧匹配距离矩阵和累积距离矩阵。充分利用这两个特点可以减少计算量和存储空间的需求,形成一种高效的DTW算法,如图所示。图中,把实际的动态弯折分为三段,(1,xa),(xa+1,xb),(xb+1,N),其中:

xa= (2M-N)/3, xb=2(2N-M)/3

xa和xb都取最相近的整数,由此可得出对M和N长度的限制条件:

2M-N≥3, 2N-M≥2

当不满足以上条件时,认为两者差别太大,则无法进行动态弯折匹配。在x轴上的每一帧不再需要与y轴上的每一帧进行比较,而只是与y轴上[ymin,ymax]间的帧进行比较,ymin和ymax的计算公式为:

ymin=x/2,0≤x≤xb, 2x+(M-2N),xb< x≤N ymax=2x,0≤x≤xa, x/2+(M-N/2),xa< x≤N

如果出现xa> xb的情况,则弯折匹配的三段为(1,xb),(xb+1,xa),(xa+1,N)。 对于x轴上每前进一帧,虽然所要比较的y轴上的帧数不同,但弯折特性是一样的,累积距离的更新都是用下式实现的:

22

D(x,y) = d(x,y)+min[D(x-1,y),D(x-1,y-1),D(x-1,y-2)]

5.2 DTW算法流程及实验结果 5.2.1 算法流程

通过DTW算法原理可以得出DTW算法的流程如图5.2所示

信号输入 帧匹配距离矩阵 累积距离矩阵 动态规划 信号输出 图5.2 DTW算法流程

首先申请两个n*m的矩阵D和d,分别为累计距离和帧匹配距离。这里n和m为测试模板与参考模板的帧数。然后通过一个循环计算两个模板的帧匹配距离矩阵d。接下来进行动态规划,为每个格点(i,j)都计算其三个可能的前续格点的累积距离1D,2D和3D。考虑到边界问题,有些前续格点可能不存在,因此要加用一些判断条件。最后利用最小值函数min,找到三个前续格点的累积距离的最小值作为累积距离,与当前帧的匹配距离d(i,j)相加,作为当前格点的累积距离。该计算过程一直达到格点(n,m),并将D(n,m)输出,作为模板匹配的结果。 5.2.2 实验结果

通过运行Testdtw.m主函数,MATLAB将会自动读取对应文件夹中的wav格式的音频,然后进行端点检测,计算非线性预测系数MFCC,并保留为参考库及测试库。接着通过DTW算法进行匹配并计算它们的dist距离。最终得出结果,其流程图如图5.3所示。

读取文件 端点 检测 计算 MFCC 参考库 DTW运算 得出结果 测试库 图5.3 主程序流程图

从MATLAB的命令窗口可以看到以下的测试结果及dist距离数据。从dist距离数据可以看出对角线上的数据都是该行中数值最小的,这也就验证了该实验的正确性。其运行结果窗口如图5.4所示。

23

dist =

1.0e+004 *

1.5359 2.3349 3.8123 4.1780 4.6839 2.2932 2.0359 4.2362 3.2646 3.1334 3.2942 1.4107 5.3812 5.5230 5.0843 4.0441 2.3339 2.4955 5.2014 3.6000 3.2979 3.6796 0.9630 2.1408 3.0627 2.3539 3.1909 3.5132 1.0917 3.4542 4.6339 5.3516 2.3987 1.6835 2.6805 3.6010 5.0491 5.0117 2.4483 4.0254 4.9343 5.1314 4.0286 2.4937 1.3894 4.8771 4.0853 3.0484 3.7600 3.6349 3.4006 4.0532 5.1802 5.5313 7.3506 1.2226 4.9291 5.7831 5.5257 3.6698 2.3213 2.1029 3.4088 3.7696 3.4587 2.4957 1.3511 3.3066 2.9855 2.6333 4.5684 2.9031 4.7227 3.6066 2.1753 4.5245 3.4731 1.1810 4.5038 2.9552 4.3106 4.4430 1.1208 2.7778 3.8481 2.9481 4.0198 4.4473 0.9146 4.5795 3.8292 4.6297 5.8129 4.8871 4.5467 4.0913 3.4527 4.0854 5.6082 1.3980 正在计算匹配结果...

测试模板0的识别结果为:0 测试模板1的识别结果为:1 测试模板2的识别结果为:2 测试模板3的识别结果为:3 测试模板4的识别结果为:4 测试模板5的识别结果为:5 测试模板6的识别结果为:6 测试模板7的识别结果为:7 测试模板8的识别结果为:8 测试模板9的识别结果为:9

图5.4 运行结果窗口图

24

6 GUI设计

6.1 概述

在开发一个实际的应用程序时都会尽量做到界面友好,最常用的方法就是使用图形界面。其能够使用户的学习和使用更为方便容易。用户不需要知道应用程序究竟怎样执行各种命令的,而只需要了解可见界面组件的使用方法;用户也不需要知道命令是怎么执行的,只要通过与界面交互就可以使指定的行为得以正确执行。

正是MATLAB为用户开发图形界面提供了一个方便高效的集成开发环境,MATLAB图形用户界面开发环境GUIDE(MATLAB Graphical User Interface Development Environment)。GUIDE主要是一个界面设计工具集,MATLAB R2011B将所有GUI支持的用户控件都集成在这个环境中并提供界面外观、属性和行为响应方式的设置方法。GUIDE将用户设计好的GUI界面保存在一个FIG资源文件中,同时还能够生成包含GUI初始化和组件界面布局控制代码的M文件。这个M文件为实现回调函数(当用户激活GUI某一组件时执行的函数)提供了一个参考框架。

设置GUIDE 应用程序 图6.1 GUI设计框架图

GUI界面设计 编写GUI回调函数代码 实现一个GUI主要包括GUI界面设计和GUI组件编程两项工作。整个GUI的实现过程如图6.1所示 6.2 GUI界面的打开

在MATLAB R2011B中,GUIDE提供了多种设计模块以方便用户轻松的定制属于自己的GUI。这些模块均包括了相关的回调函数,用户可以打开它所对应的M文件,修改实现自己需要的功能的函数。

在MATLAB R2011B中,可以通过两种方法来进入GUI界面: ① 在MATLAB R2011B的命令窗口中直接输入GUIDE。 ② 点击如图6.2所示的红色标志就可以打开GUI建立窗口。

然后再弹出来的选择窗口中选择Blank GUI(Default),并将其保存在自己选择的文件夹中。点击OK后,就会弹出组合面板窗口,如图6.3所示,在这个面板中,用户可以按照自己的需要添加相应的控件。

25

图6.2 GUI打开方式

(1)组件面板

在GUI界面中放置组件,首先单击工具栏中的按钮,光标变成十字形后使用十字形光标的中心点来确定组件左上角的位置,或者通过在界面区域内单击并拖动鼠标来确定组件的大小。如图6.3给出的一个添加组件的示例。

GUI组件布置完成后,可以使用菜单栏中最后一个三角形按钮或Tools菜单中的ActivateFigure选项来观察GUIDE的设计结果。这时会自动生成一个FIG文件和一个M文件,FIG文件会提示保存路径。双击界面区域内的按钮就会弹出属性窗口,可以修改自己需要的属性。

图6.3 添加组件示例

26

(2)编程回调函数

布置完GUI组件后,接下来最重要的一步就是编程每个按钮的回调函数,实现自己需要的功能,其编程过程为:

① 右键单击按钮,待弹出选择窗口时,选择最后一项即views callbacks;

② 鼠标放在views callbacks后就会弹出子选择窗口,根据自己的按钮属性选择相应的函数回调;

③选择完函数后,则会自动跳到M文件中该按钮所对应的回调函数,在该段函数中,可以编写自己需要实现该按钮的功能的代码。

待所有按钮的功能的回调函数都编写完毕后,点击保存,然后点击菜单栏中的三角形按钮,则会弹出用户开发界面,在该用户开发界面中,用户可以单击按钮以实现该按钮所拥有的功能。如图6.4所示。 6.3 作品演示

在MATLAB R2011B的命令窗口中输入guide后,选择自己弄好的GUI的路径,打开GUI。然后单击菜单栏中的三角形按钮则弹出如图6.4的用户开发界面。

在本次设计中,从运行界面可以看出,参考模块及测试模块均有相同的功能,即录音、暂停、播放、保存及读取。

用户可以通过麦克风在点击录音后,录制孤立词,带录制完毕,可以点击播放进行回放自己所录制好的语音,通过保存(uiputfile函数),用户就可以录制自己所需要的语音个数。通过读取(uigetfile函数),用户可以打开语音所在的文件并读取到axes中。

图6.4 运行界面

27

点击语音识别后,则会自动开始进行对之前录制好的参考模板库与测试模板库的语音之间的匹配。如图6.5所示,并将所得到的结果在MATLAB命令窗口显示出来,可以看到,识别率可以达到80%以上,对端点检测算法进行微修改,识别率可以达到90%以上。

图6.5 运行结果

7 结论

通过本次设计,了解了语音识别的历史及在语音识别过程中每个算法的原理。本设

计中,通过MATLAB软件进行语音录制、播放、保存及打开到语音信号预处理,进行信号的端点检测vad,提取特征参数MFCC,分别建立一个参考库及一个测试库。然后通过DTW算法进行匹配,计算矩阵距离dist,最终将结果在MATLAB命令窗口显示出来。在本次设计中,遇到很多难题。比如:语音信号的保存及打开函数;端点检测算法的运行等等,不过通过论坛上网友的解答及图书馆的书籍。均解决了这些问题。

通过本次设计,也存在着不少需要改进的地方,比如:用户交互界面不够完善,功能比较单一;算法不够精确,有待进行算法改进;本设计只局限于孤立词识别-DTW算法,而不能进行少量词汇量的语音识别;DTW算法只针对于特定人语音识别,可以用HMM算法更换DTW算法,因为HMM算法可以用于非特定人语音识别方面。

28

参 考 文 献

何强,何英.MATLAB扩展编程[M].北京:清华大学出版社,2002.

胡金平,陈若珠,李战明.基于语音识别中DTW改进算法的研究.兰州:TP391.42 雷学堂,徐火希.基于MATLAB的语音滤波实验设计:实验技术与管理,1002-4956(2007)

04-0038-04,第24卷,第4期,2007年4月

刘保柱,苏彦华,张宏林.MATLAB 7.0从入门到精通(修订版).北京:人民邮电出版

社,2010.5

实验一语音信号端点检测最终报告:

http://wenku.http://www.wodefanwen.com//view/f301e6d13186bceb19e8bbc9.html 实验三语音信号的特征提取最终实验报告:

http://wenku.http://www.wodefanwen.com//view/7bff350516fc700abb68fcc8.html

王嘉梅.基于MATLAB的数字信号处理与时间开发.西安:西安电子科技大学出版社,

2007.12

王倩,吴国平,陈琳.特定人语音识别算法-DTW算法:武汉 TP312 熊伟,罗云贵.语音识别的MFCC 算法研究.武汉:2010年第三期

杨熙,苏娟,赵鹏.MATLAB环境下的语音识别系统:语音技术,1002-8684(2007)

02-0051-03,TN912

张雪英.数字语音处理及MATLAB仿真.北京:电子工业出版社,2010.7

张震,王化清.语音信号特征提取中Mel倒谱系MFCC的改进算法.郑州:计算机工程与

应用,1002-8331(2008)22-0054-02,2008,44(22)

朱旻昊,张忠能.DTW算法的研究和改进:TP311,2010年底26卷第9期

29

附 录

附录A 语音识别主函数

function varargout = bishe(varargin) % BISHE MATLAB code for bishe.fig

% BISHE, by itself, creates a new BISHE or raises the existing % singleton*.

% H = BISHE returns the handle to a new BISHE or the handle to % the existing singleton*.

% BISHE('CALLBACK',hObject,eventData,handles,...) calls the local

% function named CALLBACK in BISHE.M with the given input arguments. % BISHE('Property','Value',...) creates a new BISHE or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before bishe_OpeningFcn gets called. An

% unrecognized property name or invalid value makes property application % stop. All inputs are passed to bishe_OpeningFcn via varargin.

% *See GUI Options on GUIDE's Tools menu. Choose \ % instance to run (singleton)\

% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help bishe % Last Modified by GUIDE v2.5 14-Apr-2013 11:52:05 % Begin initialization code - DO NOT EDIT gui_Singleton = 1;

gui_State = struct('gui_Name', mfilename, ...

'gui_Singleton', gui_Singleton, ...

'gui_OpeningFcn', @bishe_OpeningFcn, ... 'gui_OutputFcn', @bishe_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1})

gui_State.gui_Callback = str2func(varargin{1}); end

if nargout

[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else

gui_mainfcn(gui_State, varargin{:}); end

% End initialization code - DO NOT EDIT

% --- Executes just before bishe is made visible.

function bishe_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure

% eventdata reserved - to be defined in a future version of MATLAB

30

% handles structure with handles and user data (see GUIDATA) % varargin command line arguments to bishe (see VARARGIN) % Choose default command line output for bishe handles.output = hObject; % Update handles structure guidata(hObject, handles);

% UIWAIT makes bishe wait for user response (see UIRESUME) % uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line. function varargout = bishe_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output;

% --- Executes on button press in exit.

function exit_Callback(hObject, eventdata, handles) % hObject handle to exit (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) close;

% --- Executes on button press in luyin2.

function luyin2_Callback(hObject, eventdata, handles) % hObject handle to luyin2 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global b; fs=16000; t=2;

b=wavrecord(t*fs,fs); handles.b=b;

guidata(hObject, handles);

% --- Executes on button press in zanting2.

function zanting2_Callback(hObject, eventdata, handles) % hObject handle to zanting2 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global b;

pause(handles.b);

guidata(hObject, handles);

31

% --- Executes on button press in bofang2.

function bofang2_Callback(hObject, eventdata, handles) % hObject handle to bofang2 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global b;

wavplay(b,22050); axes(handles.axes2); plot(b);

guidata(hObject, handles);

% --- Executes on button press in baocun2.

function baocun2_Callback(hObject, eventdata, handles) % hObject handle to baocun2 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global b;

[filename pathname]=uiputfile({'*.wav','wav-files(*.wav)';'*.*','All-files(*.*)'},'另存为'); str=strcat(pathname,filename); save(str,'b');

wavwrite(b,16000,str); guidata(hObject, handles);

% --- Executes on button press in duqu2.

function duqu2_Callback(hObject, eventdata, handles) % hObject handle to duqu2 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global m2; global x1; global x2;

[fname,L]=uigetfile({'*.wav','All MATLAB Files(*.wav)';'*.*','All-files(*.*)'},''); file=[L,fname];

[S,fs]=wavread(file); figure

[x1,x2]=vad(S); axes(handles.axes2); m2=mfcc(S);

guidata(hObject, handles);

% --- Executes on button press in luyin1.

function luyin1_Callback(hObject, eventdata, handles) % hObject handle to luyin1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

32

% handles structure with handles and user data (see GUIDATA) global a; fs=16000; t=2;

a=wavrecord(t*fs,fs); handles.a=a;

guidata(hObject, handles);

% --- Executes on button press in zaiting1.

function zaiting1_Callback(hObject, eventdata, handles) % hObject handle to zaiting1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global a;

pause(handles.a);

guidata(hObject, handles);

% --- Executes on button press in bofang1.

function bofang1_Callback(hObject, eventdata, handles) % hObject handle to bofang1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global a;

wavplay(a,22050); axes(handles.axes1); plot(a);

guidata(hObject, handles);

% --- Executes on button press in baocun1.

function baocun1_Callback(hObject, eventdata, handles) % hObject handle to baocun1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global a;

[filename pathname]=uiputfile({'*.wav','wav-files(*.wav)';'*.*','All-files(*.*)'},'另存为'); str=strcat(pathname,filename); save(str,'a');

wavwrite(a,16000,str); guidata(hObject, handles);

% --- Executes on button press in duqu1.

function duqu1_Callback(hObject, eventdata, handles) % hObject handle to duqu1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

33

global m1; global x1; global x2;

[fname,L]=uigetfile({'*.wav','All MATLAB Files(*.wav)';'*.*','All-files(*.*)'},'Pick a file','MultiSelect', 'on'); file=[L,fname];

[S,fs]=wavread(file); figure

subplot(2,1,1); plot(S);

[x1,x2]=vad(S); axes(handles.axes1); m1=mfcc(S);

guidata(hObject, handles);

% --- Executes on button press in pushbutton12.

function pushbutton12_Callback(hObject, eventdata, handles) % hObject handle to pushbutton12 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global m1; global m2; global x1; global x2; for i=1:10

fname=sprintf('test1\\\\ò.wav',i-1); x=wavread(fname); [x1 x2]=vad1(x); axes(handles.axes1); m2=mfcc(x); m2=m2(x1:x2,:); test(i).mfcc=m2; end

for i=1:10

fname=sprintf('train1\\\\ó.wav',i-1); x=wavread(fname); [x1 x2]=vad1(x); axes(handles.axes2); m1=mfcc(x); m1=m1(x1:x2,:); ref(i).mfcc=m1; end

dist=zeros(10,10); for i=1:10 for j=1:10

34

dist(i,j)=dtw(test(i).mfcc,ref(j).mfcc); end end

for i=1:10

[d,j]=min(dist(i,:));

fprintf('测试模板%d的识别结果为:%d\\n',i-1,j-1); end

guidata(hObject, handles);

35

致 谢

大学四年一直以来,感谢华南农业大学对我的栽培;在本次设计中,感谢指导老师俞龙老师的关心和严格的指导,感谢论坛中网友的友好解答,也要感谢在这次毕业设计中同学们对我的帮助,没有他们,本次设计也没那么容易做出来;四年的学习生涯,感谢老师们对我的栽培;最后,感谢父母这么多年来对我的养育之恩!谢谢大家!

36

致 谢

大学四年一直以来,感谢华南农业大学对我的栽培;在本次设计中,感谢指导老师俞龙老师的关心和严格的指导,感谢论坛中网友的友好解答,也要感谢在这次毕业设计中同学们对我的帮助,没有他们,本次设计也没那么容易做出来;四年的学习生涯,感谢老师们对我的栽培;最后,感谢父母这么多年来对我的养育之恩!谢谢大家!

36

本文来源:https://www.bwwdw.com/article/8rzw.html

Top