首页 > Python资料 博客日记
简单语音信号识别的MATLAB仿真
2024-11-01 21:00:12Python资料围观6次
简单语音信号识别的MATLAB仿真
摘要: 隐马尔可夫模型(HMM)作为描述语音信号的一种统计模型,在现代语音处理中获得了广泛应用。本文概述了基于HMM的语音识别技术,阐述了预处理,特征提取以及训练,识别的算法思想。最后利用MATLAB仿真设计了语音识别系统,实现了数字0—9的识别。
关键词:语音识别;特征提取;HMM;MATLAB;
1引言
语音识别技术为人们提供了一种更方便的人机交互,使人与计算机之间、人与人之间的通信更加方便、快捷。随着对语音识别技术的深入研究,它已经发展为一门跨越多个领域的综合学科,显示了巨大的应用前景。目前应用最为成功的语音识别系统大多是基于隐马尔可夫模型构造的。HMM在数学上是一个双重随机过程,一个是用具有有限状态数的马尔可夫链来模拟语音信号统计特性变化的隐含的随机过程,另一个是与马尔可夫链的每一个状态相关联的观测序列的随机过程,而人的言语过程实际上就是一个双重随机过程,语音信号本身是一个可观测的时变序列,它是由大脑根据语法知识和言语需要这些不可观测的状态发出的音素的参数流。因此HMM合理的模仿了这一过程,能够实现较高的语音识别能力。基于HMM进行语音识别的案例有:CMU的Kai-Fulee等研制的SPHINX语音识别系统成功的达到识别率96%,IBM构造的Tangora2000词语音识别系统得到95%的识别率。本文根据HMM的语音识别思想利用MATLAB编程对数字0—9进行识别。
2语音识别基础理论和算法
完整的语音识别系统可以大致分成3个部分:(1)语音信号的预处理和特征提取;(2)语音信号的建模;(3)语音信号的模式匹配。其系统结构框图如图1所示。从本质上讲,语音识别由训练和识别两个过程完成。将用作训练的语音信号预处理后提取语音特征、建立语音信号0—9的参考模型,此过程为训练过程;从待识别语音信号中提取语音特征,与参考模型进行匹配,通过比较和判决的过程称为识别过程。
图 1 语音识别系统结构框图
目前语音识别中的预处理主要是预加重、分帧和端点检测,常用的语音特征是基于Mel频率的倒谱系数(即MFCC参数),它能更好的提高系统的识别性能。语音的训练,识别均是基于HMM模型的3个基本问题求解展开的。
2.1语音预处理及特征提取
语音从嘴唇辐射会有6dB/oct的衰减,因此在对语音信号进行处理之前,希望能按6dB/oct的比例对信号加以提升(或加重),以使得输出的信号电平相近似。可采用公式(2.1)的差分方程所定义的数字滤波器进行预加重处理:
(2-1)
式中,系数
常选取为0.9375。预加重可以直接利用MATLAB中的filter函数实现。
语音信号是准稳态信号,在处理时常把信号进行分帧,每帧长度约20ms~30ms,在这一区间内把语音信号看作为稳态信号,其频谱特性和某些物理特征参量可以近似认为是不变的。分帧一般采用交叠分段的方法,即帧与帧之间有交叠,交叠的目的是使得帧与帧之间过渡平滑,保持其连续性。
同时语音信号起止点的判别是语音识别系统必不可缺少的一部分,只有准确的找出语音段的起止点,才能对真正有效的语音信号进行分析,这样不仅减小了运算量,运算时间,同时有利于提高系统的识别率。通常采用的端点检测是基于短时能量和过零率的。短时能量是对分帧的信号的平均幅度求和。过零率是求出每帧信号过零的个数。整个端点检测分为四段:静音段,过渡段,语音段,结束段。用一个变量表示当前状态,根据能量和过零率与门限值的比较,判断下一个状态,从而更加准确的确定语音信号的起止段。
MFCC参数在大多数的语音识别系统中广泛应用。因为人耳对声音音调的感受与其频率并不成线性关系,倒谱系数更符合人耳的听觉特性。而且MFCC参数在噪声环境下表现出更强的鲁棒性,在非特定人语音识别方面有利于减小因说话人不同的差异可能带来的影响。MFCC参数其提取的基本过程如图2。这些处理均可以通过MATLAB的voice工具箱中的自带函数实现。即利用enframe,melcepst,melbankm等函数实现MFCC参数的提取。
图 2 MFCC特征参数提取流程图
2.2 HMM的三个基本问题
2.3 训练、识别算法
在语音识别系统的设计中先进行参考模型训练,首先确定HMM的初始参数:N,M,A,B,π。再根据HMM的第三个问题用Baum-welch算法对参数进行调整重估。
初始状态的重估:
(2-2) |
状态转移矩阵的重估:
(2-3) |
某个状态下可观测序列概率分布的重估:
(2-4) |
将重估的模型作为新模型进行HMM第二个问题的求解,用Viterbi算法选择最佳的状态序列。多次对模型参数进行重估,直到产生观测序列O的概率
的变化足够小或者重估次数达到一定值后停止重估。则认定此模型是训练得到的参考模型,存储到语音信号参考模型库中。每个数字均训练出一个模型。
语音识别则是将输入的语音信号作为观测序列,对10个模型进行HMM第一个问题的求解即进行模式匹配,找出输出概率最大的。最大的对应的模型数字即为判别结果。
3 计算结果及分析
我们的语音信号识别是基于MATLAB编程仿真实现的。识别涉及到的大部分内容都有成熟的算法。我们的主要工作是理解各个模块的算法思想,根据实际的语音信号调整影响识别的参数并且创建主函数调用各个模块实现语音信号的识别。MFCC特征提取部分利用MATLAB工具箱中的自带函数,采用通常的语音识别参数设置即可。对HMM而言,选取好的初始模型是很有意义的。状态转移概率分布A的初始值一般对结果影响不大,可以随机选取或者均匀取值,只要满足概率要求即可。而某个状态下观测序列的概率分布B的选取对训练出的HMM影响较大,本仿真中采用“K均值分割”算法。选择好的初始状态分布
可以在一定程度上训练出更好的HMM,提高识别率,但是涉及复杂的遗传算法。此处不采用,仅选用最简单的
,认为第1个状态分布概率为1,其他状态为0。下面主要分析端点检测算法的有效性以及HMM中可观测序列数M和状态数N对识别结果的影响。
- 端点检测
首先对语音信号进行分帧,由于可认为当每帧长度约20ms~30ms的语音信号是稳态信号,采集的语音信号在MATLAB中的采样频率为12KHz,所以对应的帧长在240~360之间,考虑到FFT计算时的快速性,取帧长为256。每帧的间隔即增量取为80。端点检测中涉及的其他参数采用文献中通常设定值。
任选一个语音信号检测端点检测算法的有效性。图3表示的数字6的原始信号和经过端点检测后截断的信号。两条红线为端点检测算法判断得到的信号起止点,判断准确,并且消除了原始信号前端的小噪声。经过截断的信号在不丢失有效信息的情况下将计算量降低为原始的1/5。所以端点检测算法的各参数设置合理,算法有效,能够准确识别信号的起止点。
图 3 数字6的原始信号和经过端点检测后截断的信号
- 观测序列数M的选取
由图4可以看出,同样的语音数字信号3,说话人1和说话人2的发音波形是有明显区别的。所以训练的语音信号越多即观测序列数M越大,得到的语音信号特征才能够越丰富,才能使训练得到的HMM的模型参数具有一般性,保证识别准确率大。
图 4 说话人1和说话人2的数字3的发音信号波形
但是考虑实验的限制,采集的样本有限,计算量有限,所以M不可能无限大。我们分别选取了M为4以及M为6时进行识别,对比了识别的错误个数。由表格1可以得到观测序列数增大,可以有效的降低识别错误个数,提高识别率。所以仿真最终选择的训练样本数也就是M为6。
表格 1 在M=6和M=4的情况下,4个人的0—9语音信号的3次识别错误个数
第1次识别 | 第2次识别 | 第3次识别 | ||
第1个人 | M=6 | 1 | 1 | 2 |
M=4 | 2 | 2 | 2 | |
第2个人 | M=6 | 1 | 1 | 2 |
M=4 | 2 | 1 | 2 | |
第3个人 | M=6 | 4 | 3 | 3 |
M=4 | 5 | 4 | 4 | |
第4个人 | M=6 | 2 | 3 | 2 |
M=4 | 3 | 3 | 1 |
- 状态数N的选取
参考文献中给出的状态数选取一般为4~10,并且指出状态数并不是越多越好。在M=6时,实验仿真对比了状态数N为4,5,6三种情况下识别的错误个数。由表格2得到增加了状态数并没有稳定的降低识别错误个数。但是状态数的增加会使得计算量变大,所以我们选择状态数N为4。
表格 2 在N=4,5,6三种情况下4个人的0—9语音信号的3次识别错误个数
第1次识别 | 第2次识别 | 第3次识别 | ||
第1个人 | N=4 | 1 | 1 | 2 |
N=5 | 1 | 2 | 2 | |
N=6 | 2 | 3 | 1 | |
第2个人 | N=4 | 1 | 1 | 2 |
N=5 | 2 | 2 | 2 | |
N=6 | 2 | 2 | 2 | |
第3个人 | N=4 | 4 | 3 | 3 |
N=5 | 2 | 4 | 3 | |
N=6 | 4 | 5 | 4 | |
第4个人 | N=4 | 2 | 3 | 2 |
N=5 | 4 | 3 | 3 | |
N=6 | 2 | 3 | 2 |
在M=6,N=4的条件下,得到的识别准确率大约为79.1%。通过对比多次识别的结果,发现有的语音信号总是会识别错误,并且基本上都会错误的识别为一个固定的数字。比如第3个人的数字0发音总是被识别为数字9。对原语音信号分析得到原因是这个样本采集的效果差,0的发音太过短促。分析其他的错误识别原因也基本上如此。因此可以推断整个语音识别系统的设计在采集的语音信号质量比较高,即无噪声,信号完整的情况下识别准确率会很大,但是当语音质量下降时会极大的降低识别准确率。
4 结束语
本文基于HMM训练识别思想,利用MATLAB仿真,实现了简单语音信号0-9较高的识别率,为79.1%。通过本次语音识别系统的设计对HMM有了更深的理解,第一次真实的体会到复杂艰涩的数学理论应用于实践中的有效性。同时熟练了MATLAB的使用,了解了大量语音处理函数及其背后的算法思想。
参考文献
- 沈泉波, 韩慧莲. 基于 HMM 的语音识别系统的 Matlab 仿真[J]. 电声技术, 2012, 36(10): 56-57.
- 王一平. 用遗传算法改进 HMM 的语音识别算法研究[D]. 太原理工大学, 2007.
- 张仁志, 崔慧娟. 基于短时能量的语音端点检测算法研究[J]. 电声技术, 2005, 7: 52-54.
- 王华朋, 杨洪臣. 声纹识别特征 MFCC 的提取方法研究[J]. 中国人民公安大学学报: 自然科学版, 2008 (1): 28-30.
- 张杰,黄志同.语音识别中隐马尔可夫模型状态数的选取原则及研究[J].计算机工程与应用, 2000, 36(1): 67-69.
- 段红梅,汪军,马良河,等.隐马尔可夫模型在语音识别中的应用[J].工科数学, 2002, 18(6): 16-20.
标签:
相关文章
最新发布
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj