【语音识别】基于傅立叶变换和MFCC特征结合DTW算法实现0-9的数字语音识别含Matlab源码

简介: 【语音识别】基于傅立叶变换和MFCC特征结合DTW算法实现0-9的数字语音识别含Matlab源码

1 简介

 1、语音识别系统概述

       语音信号是一种典型的非平稳信号,并且在录音过程中不免受到电噪音,呼吸产生的气流噪音以及录音环境下的突发噪音的影响,所以语音信号要经过预滤波、采样量化、分帧、加窗、预加重、端点检测等预处理过程后才可以进行下一步的特征征参数提取等工作。在接下来的语音训练阶段,我们将那些信号状态良好,携带噪声小且特征参数稳定的语音信号作为指定词条的模板,进而为每个词条创建一个模板并保存为模板库。在识别阶段,语音信号经过相同的通道生成测试模板,用相同的方法计算测试模板的特征参数后,将其与模板库模板的特征参数进行匹配,配分数最高的参考模板作为识别结果。

       2、语音信号的录入

       语音信号的采集方法有很多,鉴于该系统是在MATLAB上实现,且MATLAB本身提供了一定的音频处理函数,因此我们完全可以采用在MATLAB中先完成录音函数的编写,然后再结合windows自带的录音设备进行录音。录音得到的wav文件即是经过预滤波采样和量化的语音。利用soundview读所录入的文件时,会弹出一个GUI界面,并可以通过输出设备对所录语音进行回访,该GUI界面如图1所示。单击Play Again按钮可可回放,单击Done按钮可关闭界面。

       3、语音信号的预加重

       我们知道,对语音识别更有用的是语音的高频部分,而对于语音信号的频谱,通常是频率越高幅值越低。因此我们必须对语音的高频进行加重处理。处理方法是将语音信号通过一个一阶高通滤波器,即预加重滤波器,它不仅能滤除低频提升高频,还能很好的抑制50Hz到60Hz的工频干扰。尤其在短点检测之前进行预加重还可起到消除直流漂移、抑制随机噪声和提升清音部分能量的效果。预加重在Matlab中可由语句x=filter([1-0.9375],1,x)实现。

       4、语音信号的分帧和加窗

       经过数字化的语音信号实际上是一个时变信号,为了能用传统的方法对语音信号进行分析,应假设语音信号在10ms-30ms内是短时平稳的。为了得到短时的语音信号,要对语音信号进行加窗操作。窗函数平滑地在语音信号上滑动,将语音信号进行分帧,帧与帧的交叠为帧移,一般为窗长的一半。

       语音信号的分帧采用enframe函数,其语法为f=enframe(x,len,inc);其中X为输入的语音信号,len为制定的帧长,inc为指定帧移。函数将返回一个n×len的一个矩阵,每行都是一帧数据。在本系统中帧长取240,帧移取80。在Matlab中要实现加窗即将分帧后的语音信号乘上窗函数,本文加汉明窗,即为x=x.*hamming(N)。

       5、端点检测

       在语音识别系统中,训练阶段和建模阶段都比较重要的环节都是要先通过端点检测找到语音的起点和终点,这样,我们就可以只对有效语音进行处理,这对于识别的准确率和识别效率至关重要。本论文在短点检测环节采用双门限端点检测法,即采用短时能量检测和短时过零率检测双重指标约束。结合实际,我们将整个语音端点检测分为四个段落,即:无声段、等待段、语音段、结束段,再为短时能量和短时过零率各设置一个高门限和一个低门限:EHigh、ELow和ZHigh、ZLow。结合MATLAB中所编程序,可以较准确的确定语音的各个部分。图2所示为语音“1”的处理结果。

       6、特征参数的提取

       经过预处理的语音数据就可以进行特征参数提取,特征参数的好坏将直接影响系统的性能和效率。本文将梅尔倒谱系数(MFCC)和一阶MFCC系数的差分结合起来,将其合并为一个矢量作为一帧语音信号的参数,这样,不仅描述了语音的静态特性,由于加入了差分倒谱参数,语音的动态特性得到了更好的体现。梅尔倒谱参数的计算流程为:先将预处理过的语音信号进行快速傅立叶变换,将时域信号变换成为信号的功率谱。再用一组Mel频标上线性分布的三角窗滤波器(本文采用24个三角窗滤波器)对信号的功率谱滤波,每一个三角窗滤波器覆盖的范围都近似于人耳的一个临界带宽,以此来模拟人耳的掩蔽效应。然后对三角窗滤波器组的输出求取对数,可以得到近似于同态变换的结果。最后去除各维信号之间的相关性,将信号映射到低维空间。梅尔倒谱系数的计算差分参数的计算采用下面的公式:

       7、模式匹配

       本语音识别系统的模式匹配算法采用动态时间弯折(Dynamic Time Warping,DTW)算法,该算法基于动态规划的思想,解决了发音长短不一的模板匹配问题。DTW是语音识别中出现较早,较为经典的一种算法。与HMM算法相比而言,DTW算法具有计算量小,识别效率高的特点。模式匹配的过程其实就是根据一定的规则,计算输入矢量特征与库存模式之间的相似度,判断出输入语音的语意信息。本文中,失真测度采用下式所示的欧式距离:

       其中,l=1,2,…M;i=1,2,…I;k=1,2,…K.是待测矢量之间的距离,是第i个码本的第l个码字矢量的第k个分量。I为说话者的数量,M为码本的大小,K为参数矢量的总维数。由上式得出该语音相对于该命令词的最短距离,然后取最短距离最小的命令词作为该段语音的首先识别结果。结合MATLAB程序,得到数字1-10的匹配距离矩阵:

       图3即为针对数字1-10的待测模板和模板库模板匹配距离的现实,由该距离矩阵,我们可以很清楚的看到,左上角到右下角的对角线上的距离匹配值在该值所在的行和列都是最小的。即距离最短的命令词为识别结果。

       8、结语

       该论文阐述了基于DTW的语音识别系统在MATLAB上实现的基本过程,在实验室录音情况下,该识别系统的识别率可以达到百分之九十以上,效果良好。

2 部分代码

clear allcloseclc;disp('正在计算参考模板的参数...')for i=1:10fname=sprintf('%d0.mp3',i-1);[x,fs]=audioread(fname);sound(x,fs);  [x1 x2]=vad(x);%   x1=abs(round(x1));%   x2=abs(round(x2));  m=mfcc(x);  m=m(x1-2:x2-4,:);  ref(i).mfcc=m;enddisp('正在分析语音信号...')for i=1:10fname=sprintf('%d0.mp3',i-1);%[x,fs,bit]=audioread(fname,[2000,2512]);     %采样%[x,fs]=audioread(fname,[2000,2512]);%sound(x,fs);      %播放语音信号figure(i);subplot(3,3,1);plot(x(1:256));    %原始语音信号的时域图形%title('原始信号')subplot(3,3,2)[h,w]=freqz(x,fs);      %原始语音信号的频率响应图hr=abs(h);            %求系统幅频响应plot(w,hr);title('幅频图');xlabel('Frequency in rad mple')ylabel('Magnitude in dB')subplot(3,3,3)hphase=angle(h);hphase=unwrap(hphase);  %求系统相频响应plot(w,hphase);title('相频图');xlabel('Frequency in rad mple')ylabel('Phase in degrees')y=fft(x,512);      %傅立叶变换%mag=abs(y);mag1=10*log10(mag);f=fs*(0:255)/512;subplot(3,3,4)plot(f,mag(1:256));   %FFT频谱图 %title('fft变换后信号')iff=ifft(y,512);   %反傅立叶变换%ifm=abs(iff);subplot(3,3,5)plot(f,ifm(1:256))title('ifft后信号')% 短时傅里叶变换Ts=1/fs;%N=T/Ts;N=512;Nw=20;     %窗函数长L=Nw/2;    %窗函数每次移动的样点数   Tn=(N-Nw)/L+1;    %计算把数据x共分成多少段nfft=32;%FFT的长度Tn=round(Tn);TF=zeros(Tn,nfft);   %将存放三维谱图,先清零for i=1:Tn    xw=x((i-1)*10+1:i*10+10);    %取一段数据    temp=fft(xw,nfft);           %FFT变换    temp=fftshift(temp);         %频谱以0频为中心    for j=1:nfft    TF(i,j)=temp(j);                %把谱图存放在TF中    endendsubplot(3,3,6)fnew=((1:nfft)-nfft/2)*fs/nfft;tnew=(1:Tn)*L*Ts;[F,T]=meshgrid(fnew,tnew);mesh(F,T,abs(TF))title('短时傅立叶变换时频图')subplot(3,3,7)contour(F,T,abs(TF))title('等高线表示')enddisp('正在计算测试模板的参数...')for i=1:10 fname=sprintf('%d2.mp3',i-1);x=audioread(fname);disp('正在进行模板匹配...')dist=zeros(10,10);for i=1:10enddisp('正在计算匹配结果...')for i=1:10  [d,j]=min(dist(i,:));  fprintf('测试信号%d的识别结果为:%d\n',i-1,j-1);end

3 仿真结果

4 参考文献

[1]肖利君. 基于DTW模型的孤立词语音识别算法实现研究[D]. 中南大学, 2010.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

相关实践学习
一键创建和部署高分电影推荐语音技能
本场景使用天猫精灵技能应用平台提供的技能模板,在2-5分钟内,创建一个好玩的高分电影推荐技能,使用模板后无须代码开发,系统自动配置意图、实体等,新手0基础也可体验创建技能的乐趣。
达摩院智能语音交互 - 声纹识别技术
声纹识别是基于每个发音人的发音器官构造不同,识别当前发音人的身份。按照任务具体分为两种: 声纹辨认:从说话人集合中判别出测试语音所属的说话人,为多选一的问题 声纹确认:判断测试语音是否由目标说话人所说,是二选一的问题(是或者不是) 按照应用具体分为两种: 文本相关:要求使用者重复指定的话语,通常包含与训练信息相同的文本(精度较高,适合当前应用模式) 文本无关:对使用者发音内容和语言没有要求,受信道环境影响比较大,精度不高 本课程主要介绍声纹识别的原型技术、系统架构及应用案例等。 讲师介绍: 郑斯奇,达摩院算法专家,毕业于美国哈佛大学,研究方向包括声纹识别、性别、年龄、语种识别等。致力于推动端侧声纹与个性化技术的研究和大规模应用。
相关文章
|
6天前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。
|
8天前
|
机器学习/深度学习 算法 语音技术
基于语音信号MFCC特征提取和GRNN神经网络的人员身份检测算法matlab仿真
**语音识别算法概览** MATLAB2022a中实现,结合MFCC与GRNN技术进行说话人身份检测。MFCC利用人耳感知特性提取语音频谱特征,GRNN作为非线性映射工具,擅长序列学习,确保高效识别。预加重、分帧、加窗、FFT、滤波器组、IDCT构成MFCC步骤,GRNN以其快速学习与鲁棒性处理不稳定数据。适用于多种领域。
|
8天前
|
算法
基于蝗虫优化的KNN分类特征选择算法的matlab仿真
摘要: - 功能:使用蝗虫优化算法增强KNN分类器的特征选择,提高分类准确性 - 软件版本:MATLAB2022a - 核心算法:通过GOA选择KNN的最优特征以改善性能 - 算法原理: - KNN基于最近邻原则进行分类 - 特征选择能去除冗余,提高效率 - GOA模仿蝗虫行为寻找最佳特征子集,以最大化KNN的验证集准确率 - 运行流程:初始化、评估、更新,直到达到停止标准,输出最佳特征组合
|
1月前
|
数据采集 算法 数据可视化
MATLAB、R用改进Fuzzy C-means模糊C均值聚类算法的微博用户特征调研数据聚类研究
MATLAB、R用改进Fuzzy C-means模糊C均值聚类算法的微博用户特征调研数据聚类研究
|
1月前
|
存储 人工智能 机器人
【Matlab】Matlab 汉/英语(A/a)声学特征比较与基音频率分析(源码+音频文件)【独一无二】
【Matlab】Matlab 汉/英语(A/a)声学特征比较与基音频率分析(源码+音频文件)【独一无二】
|
1月前
|
机器学习/深度学习 文字识别 算法
MATLAB图像倾斜校正算法实现:图像倾斜角检测及校正
MATLAB图像倾斜校正算法实现:图像倾斜角检测及校正
|
1月前
matlab脉冲响应图的时域特征
matlab脉冲响应图的时域特征
|
1月前
|
监控 算法 计算机视觉
基于FPGA的图像自适应阈值二值化算法实现,包括tb测试文件和MATLAB辅助验证
基于FPGA的图像自适应阈值二值化算法实现,包括tb测试文件和MATLAB辅助验证
|
1月前
【数值分析】用幂法计算矩阵的主特征值和对应的特征向量(附matlab代码)
【数值分析】用幂法计算矩阵的主特征值和对应的特征向量(附matlab代码)
|
1月前
|
机器学习/深度学习 算法 Serverless
基于信号功率谱特征和GRNN广义回归神经网络的信号调制类型识别算法matlab仿真
基于信号功率谱特征和GRNN广义回归神经网络的信号调制类型识别算法matlab仿真

热门文章

最新文章