基于MATLAB 的VQ声纹识别系统
本内容由灵声讯音频-语音算法实验室整理,转载和使用请与“灵声讯”联系,联系方式:音频/识别/合成算法QQ群
目 录
摘 要.......................................................................................................... I
ABSTRACT. II
第1章 引 言... 1
1.1语音识别的背景意义... 1
1.2国内外研究现状... 2
1.3题目设计主要内容... 3
第2章 语音信号相关技术分析... 5
2.1 语音信号预处理... 5
2.1.1预加重... 5
2.1.2端点检测... 5
2.1.3分帧... 7
2.1.4加窗... 7
2.2特征参数... 8
2.3训练模型... 10
2.4本章小结... 11
第3章 声纹识别方法分析... 12
3.1语音识别系统概述... 12
3.2 特征参数提取... 13
3.3 矢量量化的相关技术分析... 13
3.3.1矢量量化的基本原理... 13
3.3.2矢量量化的量化过程... 14
3.3.3矢量量化的失真测度... 15
3.3.4最佳码本的设计... 15
3.4本章小结... 16
第4章 系统设计与实现... 17
4.1系统总体设计... 17
4.2系统功能设计与实现... 17
4.2.1功能... 17
4.3系统界面设计... 20
4.3.1 欢迎界面的设计... 21
4.3.2 GUI界面的设计... 21
4.4本章小结... 23
第5章 系统调试... 24
5.1 软件调试... 24
5.1.1语音分帧... 24
5.1.2语音预加重... 24
5.1.3系统图形界面... 25
5.2 系统功能调试... 25
5.3本章小结... 27
结束语... 28
参考文献... 29
致 谢... 30
附 录... 31
本毕业设计完成了以下几个部分内容,其中主要以梅尔频率倒谱系数(Mel-Frequency Cepstral Coefficients)以及其一阶和二阶差分参数为主要语音信号特征参数,建立了一个汉语语音识别系统,包括详细模块有语音信号预处理模块、特征参数提取模块、识别和模板训练模块、识别匹配算法模块,结果显示模块;在训练阶段,对每个说话人提取的函数参数进行分类,生成由不同码字组成的码本;在检测阶段,计算函数参数的平均失真度,确定说话人。同时,利用Matlab图形用户界面开发设计了语音识别系统的操作界面,设计了一个功能实用、使用方便、系统界面友好的专用扬声器识别系统。
本设计主要由以下几章构成:
第一章 是本次毕业设计的引言和绪论部分,目的是在阐述语音识别课题的研究意义,研究背景,以及研究目的,同时也尝试性的分析了语音识别系统的国内外发展现状,和一些主流的语音识别团队和公司。
第二章 是本次毕业设计的理论技术部分,主要在介绍语音识别系统的相关技术和常用的开发环境,开发平台等。
第三章 主要介绍了本次毕业设计所用的语音识别方法矢量量化的相关技术,同时对矢量量化的技术原理做了数学推导和仿真验证。
第四章 本章是毕业设计的实现部分,不仅介绍了系统的整体设计,包括算法流程图,功能模块实现框图,和系统功能设计以及系统界面设计。
第五章 本章主要介绍各个模块的功能实现和系统功能测试,以及在开发和测试过程中问题分析和本次设计的项目回溯分析。
第4章 系统设计与实现
4.1系统总体设计
一个典型的语音识别系统如图4.1所示,主要包括预处理,特征提取和训练识别网络。语音识别系统包括特征参数的提取、模式匹配、参考模式库等基本单元。从图中亦可以看出,它的本质为一种模式识别系统。语音信号本就不是平稳信号,再加上呼吸气流、外部噪声、电流干扰以及其他外因,使得不能直接对语音信号进行特征参数提取,只能先进行预处理。 预过滤、采样和量化、分帧、加窗口、预加重、端点检测等操作都是对语音信号进行预处理的必要步骤。语音信号进行预处理后,就可以提取特征参数了。将处理好的特征参数保存为模板库,当每一个词条均有自己的模型后,训练阶段就完成了。将经过相同通道生成的语音参数作为测试模板,将测试模板的特征参数与模板库中的特征参数进行匹配。匹配后,将与之最为接近的参考模板输出为结果,识别阶段就完成了。为将语音信号转化成文本或可执行的命令,后续还需对信号进行更高水平的处理。
图4.1 语音识别系统原理框图
4.2系统功能设计与实现
4.2.1功能
整个系统的功能模块框图如图所示:
图4.2 系统功能模块图
1.音频采集:
选择要进行识别的语音信号,在下方框图中显示已选择语音信号的文件名称,如图所示:
图4.3 音频采集模块框图
2.时域波形:
如图所示,点击此按钮显示该信号在时域中的波形。
图4.4 该信号的时域波形图
3.频域信号:
此按钮点击后可以显示信号的频域波形。采用基二FFT算法将时域信号变换到频域上,然后才能进行频域分析。然而信号序列的数据长度通常不是2的整数次方,因此要将L作为参数执行NFFT=2∧nextpow2(L)函数。此时NFFT为最接近数据长度的2的整数次方。
对信号y进行基2-FFT运算,运算结果Y需要乘以2除以N才为真实的信号幅度。所以横轴F为频率,竖轴2*abs(Y(1:NFFT2+1))为幅值,然后调用plot函数,将图形放置在显示控件上,显示的为信号的频域分析。
图4.5 该信号的频域波形
4.预加重:
在对语音信号进行计算之前,首先要对语音信号进行预加重的处理,从而对高频信号进行提升,对低频信号进行滤除,借此来提高语音信号中的高频信号的分别率,其函数为:
yy = filter([1 -0.9375], 1, y); (4.1)
预加重处理后的信号如图4.6所示:
图4.6 预加重处理信号
5.端点检测:
对语音信号进行端点检测是不可缺少的一步,通过对语音信号的端点检测可以对有用段语音信号进行提取,从而减少不必要的运算量,缩短运算时间,并且使用这种算法可以对一些没有用的噪音信号进行排除。
进行端点检测前要先对语音信号进行分帧。我们将帧长设为240点,帧移为80点。设置短时能量高低门限分别为10和2。短时过零率高低门限分别为10和5。function amp= and (abs)(Enframe (filter ([1-0.9375])),1, YY), FrameLen, FrameInc)), 2);为帧长,FrameInc为帧移,计算的结果amp为短时能量。
tmp1 = enframe(yy(1:end-1), FrameLen, FrameInc);
tmp2 = enframe(yy(2:end) , FrameLen, FrameInc);
signs = (tmp1.*tmp2)<0;
diffs = (tmp1 -tmp2)>0.02;
zcr = sum(signs.*diffs, 2);
zcr为信号的短时过零率。当amp和zcr同时高于其最高门限时,判定为语音信号开始。当amp和 zcr同时低于其最低门限时,判定为语音信号的结束。
y为信号源,在进行端点检测后,x1为信号的起点,x2为信号的结束点。
图4.7 该信号的端点检测
6.MFCC参数提取:
该时域信号经过分帧、加窗处理后变换为Mel坐标频域,在Mel坐标频域上进行滤波,得到新的信号序列,最后对新的信号序列进行离散余弦变换,变换后即可得到输入信号序列的MFCC参数。
输入的语音信号在分帧处理后的每一帧都可以表示为12维的特征值,当信号的帧数为N时,MFCC参数是一个N行12列的二维矩阵,每个矩阵都是一段语音的特征参数。经过cc=mfcc(y(:,1));函数运算后,可以得到输入信号的特征参数。save mfcc.mat ref函数则将特征参数临时保存在内存中方便调用。
图4.8 MFCC参数提取
7.pitch提取:
此按键可以准确提取与声带相一致的振动频率,找出和声带振动频率一致或尽量相吻合的轨迹曲线,以找到特定的说话人。
图4.9 该信号的pitch曲线
8.说话人识别:
第七步得到的自相关系数与模板库中的语音特征参数进行匹配,从而得出识别结果。识别结果如图4.10所示:
图4.10 该信号的识别结果
9.退出:
如图4.11所示,点击该按键即可退出该系统。
图4.11 退出按键
4.3系统界面设计
MATLAB为使用者提供了一个图形界面开发工具(GUIDE),该工具为用户提供了高效的集成开发环境,这是一个在MATLAB中主要用来进行图像化界面设计的工具箱,这个工具箱会将用户设计好的界面保存在FIG文件中,同时也会将GUI的初始化代码以及组建结面布局的控制代码.M保存在同一个文件夹中,通过这个.M文件可以实现对函数的调用,也就是当按下GUI界面上的按钮时候会调用相应的函数。
4.3.1 欢迎界面的设计
在进行软件的开发时需要有一个非常友好的界面,而图像化的交互界面收到所有人的欢迎,并且使用图像化的界面使得操作和学习也更加的方便。虽然用户并不知道里面的程序是怎么运行的,但是只需要知道如何操作的就可以得出正确的结论。
图4.12 欢迎界面
4.3.2 GUI界面的设计
在MATLAB中,可以使用下面的方法来进入到GUIDE界面中:
(1)在软件的命令框直接输入guide然后运行。
(2)点击快捷工具栏上的小图标就可以进入到GUI制作界面。
进入GUI界面设计之后在弹出的命令选择窗口上选择默认的界面,之后将新建的文件保存在一个文件夹中,点击确定,下一步就可以在弹出的组合面板中根据自己需要的对控件进行添加了。
图4.13 GUI打开方式
(1)组件面板
在GUI的界面控件中有非常多的组件,通过点击组件栏中的组件图标并进行拖移就可以进行组件的放置。通过鼠标的拉伸可以对组件的大小和属性进行设置。如图4.13所示就是添加组件的示例。
当需要设计的界面设计完成后就可以点击菜单栏绿色的三角形按钮来对界面的设计进行预览了,在进行这个步骤之后会生成一个FIG的文件以及.M的文件,但是FIG文件会提示你选择一个保存的文件夹,在进行界面属性修改的时候只需要对设置的空间进行双击就可以对其进行修改了。
图4.14 添加组件示例
(2)回调函数
在对组件进行布置之后就可以对每个按钮所对应的回调函数进行设置,通过这个操作来实现按钮控制函数的功能,设置的过程为。
- 首先对组件上的按钮进行右键单击操作,选择查看回调;
- 当鼠标放在回调函数的位置时会出现选择的子窗口,然后根据自己的按钮被自己所赋予的属性进行函数的选择;
③对函数选择之后,就会自动跳转到.M文件中,在函数中就可以对所要实现的函数进行编写。
当所有编写都完成之后点击保存按钮。
图4.15 编译完成后界面效果图
4.4本章小结
本章以前文语音信号识别的相关技术为基础,详细介绍了系统各部分功能的实现。使用界面设计工具(GUI)设计了用户界面,使得整个程序更加直观、完善。该系统实现了音频采集、时域波形分析、频域波形分析、预加重、端点检测、MFCC特征参数提取、pitch提取以及说话人识别八个功能。
第5章 系统调试
5.1 软件调试
软件调试环境:MATLAB
5.1语音分帧
因为只有短时的语音信号才可以视作是平稳信号,所以在提取语音参数之前要先进行分帧的处理。经过查资料可知:男性的低音最低可达50Hz而女性或者儿童可高达500Hz。可以看出,人们之间基音的频率不尽相同。说话人的基音频率的选择测定经过本设计多次的调试发现通常在70Hz以上,这个范围可以说是涵盖了绝大多数人的基音频率。此时的基音周期计算为14ms。而在语音识别系统普遍的做法中,语音信号的每一帧内都至少含有两个周期,因而本设计确定了信号的一帧时间采用30ms。本设计的语音采样率为8000Hz,即是一秒时间内采了8000个信号点。经过计算,一帧的信号点数为240点,即是帧长。
5.1.2语音预加重
通过预加重数字滤波器完成语音信号预加重的步骤。滤波器的传递函数为H(z)=1-az-1。式中a为预加重系数,且a为唯一的变量,所以预加重的效果取决于a。传递函数在时域上的表示为:Y(n)=X(n)-aX(n-1)。可以看出,决定滤波器的输出的是当前输入以及前一时刻输入。当a取值较小时,当前输入和前一时刻输入的相关性随之减小,而当a取值较大时,相关性随之增大。我们在本设计中采用了0.9375作为传递函数的a值。
图5.1语音信号预加重
5.1.3系统图形界面
图5.2系统欢迎界面
为了使得图形界面整洁美观,就需要提前对界面进行设计和调试。根据实际使用顺序改变界面中按键的位置。为了使界面更加美观,我在欢迎界面添加了背景图片,使其能够给人耳目一新的视觉感受。
图5.3系统功能界面
5.2 系统功能调试
- 音频信号采集:
使用audiorecorder函数来对信号进行采集,其中函数的用法为:
audiorecorder(fs,nbits,ch)
使用这个函数之后软件就可以创建一个对象来进行控制,当被控对象创建完之后就可以对声音进行采集、停止、播放以及数据的读取等操作。
- 音频信号分析
分析和提取语音信号在时频域上的参数。如图5.4、5.5所示:
图5.4 信号“TEXTEE1”的时域波形
图5.5信号“TEXTEE1”频域波形
- 特征参数提取
本设计采用MFCC方法提取特征参数。首先将语音信号进行一系列预处理,然后对处理好的语音信号进行傅里叶变换,得到其能量谱,再通过一组滤波器计算出输出的对数能量,最后对其进行离散余弦变换得到MFCC系数。
- 模式训练
对模板库中的语音进行训练,从中提取MFCC系数,从而形成能代表说话人个人语音特征的模板。
- 模式识别
将选中的语音进行上述处理后得到录入语音的MFCC系数,将录入语音信号的MFCC系数与模板的MFCC系数进行比对,匹配度最高的模板即为匹配结果。
图5.6特定说话人识别结果
5.3本章小结
本章主要对特定说话人识别系统进行了功能上的调试,并对系统功能和各项技术指标进行了验证。通过对“TEXTEE1”语音信号的识别验证准确率达到完全正确,验证了系统功能的可行性和设计的语音识别方法正确。
结束语
本设计充分展现了Matlab 仿真软件强大的数学计算和编程能力。通过对其自带工具GUI图形用户界面和矢量量化的使用,结合程序的自由编写,使一些极其复杂的数学计算过程变得方便快捷。
本设计通过把每个人的语音信号特征参数编成码本,识别时将待识别参数按此码本进行编码,以量化产生的失真度作为判决标准,在Matlab仿真软件平台上实现说话人语音的识别,基本达到预期目的。通过Matlab实现了对特定说话人语音的采集、处理、训练和识别。本设计采用矢量量化识别作为语音识别的过程,能准确地识别出5到10位特定说话人。
基于矢量量化的说话人识别,其原理解释就是把每个人的特征参数编成码本,识别时将待识别参数按此码本进行编码,以量化产生的失真度作为判决标准。通过Matlab的程序段,将待识别的语音信号与码本进行相似度对比,将相似度最高者为识别结果输出。同时矢量量化得到的建模数据少,判断速度快,算法复杂度也不高,如果能够建立一个范围庞大而且清晰的特定人语音库,将能够大大提高说话人识别的效率。
学浅,偶有纰漏,望不吝指出。本内容由灵声讯音频-语音算法实验室整理创作,转载和使用请与“灵声讯”联系,联系方式:音频/识别/合成算法QQ群(696554058)
福利小贴士:
理科只是为自己插上腾飞的翅膀,文科才能让你飞黄腾达,同意的点赞,谢谢!
赠送原创诗歌公众号“天一色”,以飨读者!
发布于 2022-01-02