【语音识别】基于动态时间规整算法(DTW)实现中文语音识别系统含Matlab源码

简介: 【语音识别】基于动态时间规整算法(DTW)实现中文语音识别系统含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 部分代码

function f=enframe(x,win,inc)nx=length(x(:));            % 取数据长度nwin=length(win);           % 取窗长if (nwin == 1)              % 判断窗长是否为1,若为1,即表示没有设窗函数   len = win;               % 是,帧长=winelse   len = nwin;              % 否,帧长=窗长endif (nargin < 3)             % 如果只有两个参数,设帧inc=帧长   inc = len;endnf = fix((nx-len+inc)/inc); % 计算帧数f=zeros(nf,len);            % 初始化indf= inc*(0:(nf-1)).';     % 设置每帧在x中的位移量位置inds = (1:len);             % 每帧数据对应1:lenf(:) = x(indf(:,ones(1,len))+inds(ones(nf,1),:));   % 对数据分帧if (nwin > 1)               % 若参数中包括窗函数,把每帧乘以窗函数    w = win(:)';            % 把win转成行数据    f = f .* w(ones(nf,1),:);  % 乘窗函数end

3 仿真结果

image.gif编辑

image.gif编辑

4 参考文献

[1]吴晓平, 崔光照, 路康. 基于DTW算法的语音识别系统实现[J]. 信息化研究, 2004(07):17-19.

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

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

image.gif编辑

相关实践学习
达摩院智能语音交互 - 声纹识别技术
声纹识别是基于每个发音人的发音器官构造不同,识别当前发音人的身份。按照任务具体分为两种: 声纹辨认:从说话人集合中判别出测试语音所属的说话人,为多选一的问题 声纹确认:判断测试语音是否由目标说话人所说,是二选一的问题(是或者不是) 按照应用具体分为两种: 文本相关:要求使用者重复指定的话语,通常包含与训练信息相同的文本(精度较高,适合当前应用模式) 文本无关:对使用者发音内容和语言没有要求,受信道环境影响比较大,精度不高 本课程主要介绍声纹识别的原型技术、系统架构及应用案例等。 讲师介绍: 郑斯奇,达摩院算法专家,毕业于美国哈佛大学,研究方向包括声纹识别、性别、年龄、语种识别等。致力于推动端侧声纹与个性化技术的研究和大规模应用。
相关文章
|
5天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
36 8
|
5天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
23 7
|
6天前
|
机器学习/深度学习 算法 5G
基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真
基于MIMO系统的SDR-AltMin混合预编码算法通过结合半定松弛和交替最小化技术,优化大规模MIMO系统的预编码矩阵,提高信号质量。Matlab 2022a仿真结果显示,该算法能有效提升系统性能并降低计算复杂度。核心程序包括预编码和接收矩阵的设计,以及不同信噪比下的性能评估。
23 3
|
25天前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
1月前
|
算法 5G 数据安全/隐私保护
MIMO系统中差分空间调制解调matlab误码率仿真
本项目展示了一种基于Matlab 2022a的差分空间调制(Differential Space Modulation, DMS)算法。DMS是一种应用于MIMO通信系统的信号传输技术,通过空间域的不同天线传输符号序列,并利用差分编码进行解调。项目包括算法运行效果图预览、核心代码及详细中文注释、理论概述等内容。在发送端,每次仅激活一个天线发送符号;在接收端,通过差分解调估计符号和天线选择。DMS在快速衰落信道中表现出色,尤其适用于高速移动和卫星通信系统。
|
1月前
|
安全 调度
电力系统的负荷损失和潮流计算matlab仿真,对比最高度数,最高介数以及最高关键度等节点攻击
本课题研究节点攻击对电力系统稳定性的影响,通过模拟最高度数、最高介数和最高关键度攻击,对比不同攻击方式下的停电规模。采用MATLAB 2022a 进行系统仿真,核心程序实现线路断开、潮流计算及优化。研究表明,节点攻击会导致负荷损失和系统瘫痪,对电力系统的安全构成严重威胁。通过分析负荷损失率和潮流计算,提出减少负荷损失的方法,以提升电力系统的稳定性和安全性。
|
1月前
|
算法
基于最小二乘递推算法的系统参数辨识matlab仿真
该程序基于最小二乘递推(RLS)算法实现系统参数辨识,对参数a1、b1、a2、b2进行估计并计算误差及收敛曲线,对比不同信噪比下的估计误差。在MATLAB 2022a环境下运行,结果显示了四组误差曲线。RLS算法适用于实时、连续数据流中的动态参数辨识,通过递推方式快速调整参数估计,保持较低计算复杂度。
|
1月前
|
Python
基于python-django的matlab护照识别网站系统
基于python-django的matlab护照识别网站系统
15 0
|
1月前
|
存储 算法 安全
ArrayList简介及使用全方位手把手教学(带源码),用ArrayList实现洗牌算法,3个人轮流拿牌(带全部源码)
文章全面介绍了Java中ArrayList的使用方法,包括其构造方法、常见操作、遍历方式、扩容机制,并展示了如何使用ArrayList实现洗牌算法的实例。
14 0
|
2月前
|
算法
基于极大似然算法的系统参数辨识matlab仿真
本程序基于极大似然算法实现系统参数辨识,对参数a1、b1、a2、b2进行估计,并计算估计误差及收敛曲线,对比不同信噪比下的误差表现。在MATLAB2022a版本中运行,展示了参数估计值及其误差曲线。极大似然估计方法通过最大化观测数据的似然函数来估计未知参数,适用于多种系统模型。