基于动态时间规整(DTW)的语音信号识别系统
项目介绍
本项目实现了一个完整的语音孤立词识别原型系统。系统采用经典的动态时间规整(DTW)算法作为核心识别引擎,针对语音信号在时间轴上的非线性伸缩特性,通过对比测试样本与参考模板之间的相似度来实现分类。系统集成了信号模拟、端点检测、梅尔频率倒谱系数(MFCC)特征提取、路径对齐计算以及结果可视化等功能模块,形成了一个从原始信号到识别结论的闭环处理流程。
功能特性
- 鲁棒的端点检测:结合短时能量与短时过零率的双门限策略,能够有效从背景噪声中定位语音起始和终止点。
- 标准的特征提取:完整实现了MFCC参数计算流程,包括预加重、分帧加窗、功率谱计算及梅尔滤波器组映射。
- 非线性时间对齐:DTW算法通过动态规划寻找最优匹配路径,能够克服说话人语速变化对识别结果的影响。
- 综合可视化界面:程序运行后自动生成多维度图表,包括端点识别波形、MFCC特征热图、DTW累计代价矩阵路径以及各模板距离对比图。
使用方法- 确保计算机已安装MATLAB软件。
- 将主程序代码复制到MATLAB编辑器中。
- 运行脚本,系统将自动生成模拟的参考模板语音(语音A和语音B)以及一段带有环境噪声和起始偏移的测试语音。
- 程序将自动执行预处理、特征对比并输出识别结果。
- 通过生成的图形窗口直观观察识别效果和算法中间结果。
系统要求
- 软件支持:MATLAB R2016b 及以上版本(需支持信号处理工具箱中的某些基本函数)。
- 硬件环境:普通个人电脑即可,建议内存4GB以上。
系统实现逻辑说明- 参数初始化
系统预设了采样频率(8000Hz)、帧长(256采样点)、帧移(128采样点)等核心参数,并定义了13维MFCC系数作为识别特征。
- 语音模拟数据生成
为了演示识别流程,系统手动合成了两段具有不同频率特性的正弦指数衰减信号作为模板,并构造了一段带有静音段、背景噪声且主频略有偏差的测试信号。
- 端点检测(EPD)模块
- 首先对信号进行高通预测(系数0.97的预加重)以提升高频分辨率。
- 采用手动分帧技术,计算每帧信号的短时能量(STE)和短时过零率(ZCR)。
- 使用基于能量峰值10%的动态阈值定位语音区间,并结合过零率修正边缘,提取出纯净的语音片段。
- MFCC特征提取模块
- 对提取出的语音段进行汉明窗(Hamming Window)处理以减少频谱泄漏。
- 通过快速傅里叶变换(FFT)获取功率谱。
- 构造24个梅尔滤波器组(Mel Filter Bank),将线性频率映射到符合人类听觉的梅尔刻度。
- 对滤波器输出取对数后执行离散余弦变换(DCT),提取前13维倒谱系数作为最终特征向量。
- DTW识别引擎实现
- 计算测试序列与每个参考模板之间的欧氏距离矩阵。
- 构造累计代价矩阵 D,其递归逻辑为:当前位置的最小代价值等于当前距离加上左侧、下方或左下角三个邻域中的最小值。
- 根据 D(N,M) 的结果判定最小距离,并通过回溯算法从终点反向寻找最优对齐路径。
- 结果判定与可视化
- 选取 DTW 累计距离最小的模板作为识别目标。
- 繪制测试语音在原始波形中的端点位置。
- 展示13维特征的横纵轴分布。
- 在代价矩阵的热图上绘制白色的最佳匹配路径线条。
- 通过柱状图对比不同语音模板的匹配分值。
关键算法与技术细节分析- 双门限法平衡:代码中通过
ampThres 和 zcrThres 共同作用,确保了在低信噪比环境下也能识别出语音的启停,避免了前后端静音段参与后续计算。 - 梅尔滤波组映射:
getMelBank 函数实现了频率到梅尔刻度的非线性转换,其公式遵循 $2595 times log10(1 + f/700)$,利用三角滤波窗口对频谱进行平滑,有效模拟了人耳对不同频率的敏感度。 - 动态规划策略:在
calculateDTW 函数中,通过初始化第一行和第一列的边界值,并利用三向选择的最优递归公式填充矩阵,解决了语音信号在时间轴上的不对等压缩和扩展问题。 - 回溯路径寻找:回溯算法通过判断 [n-1,m], [n,m-1], [n-1,m-1] 三个方向的最小值,确保了路径在时间维度的单调性和连续性约束。