基于隐马尔可夫模型(HMM)的孤立词语音识别系统
项目介绍
本项目是一个在MATLAB环境下开发的孤立词语音识别系统。系统通过模拟生成特定词汇的语音信号,涵盖了从原始信号预处理、特征提取、矢量量化到统计模型训练与识别的完整流程。该系统旨在通过数学建模和统计推理,识别四个指定的中文词汇指令:“向上”、“向下”、“向左”和“向右”。
功能特性
- 自动化数据模拟:内置语音信号生成引擎,可模拟具有不同频率特征、指数衰减和随机噪声的语音数据。
- 鲁棒的特征提取:实现了标准的梅尔频率倒谱系数(MFCC)提取流程。
- 特征离散化:利用矢量量化(VQ)技术将连续的语音特征压缩为离散的码本索引。
- 分级模型训练:针对每个指定词汇独立训练左到右结构的离散隐马尔可夫模型。
- 高效识别算法:基于Viterbi算法进行概率解码。
- 结果可视化:自动生成混淆矩阵图表及模型匹配得分统计图。
系统要求
- 运行环境:MATLAB R2018b 或更高版本。
- 核心组件:基础算法库(包括信号处理和矩阵运算)。
- 内存需求:建议 4GB RAM 或以上,以支持大规模特征矩阵运算。
实现逻辑与流程
1. 系统初始化与参数配置
系统首先定义了一系列关键超参数。采样率设定为 8000Hz,MFCC 特征采用 24 组 Mel 滤波器并保留前 13 阶系数。帧长设置为 256 点,帧移 128 点。HMM 状态数固定为 5 状态。
2. 数据模拟生成
系统通过函数生成训练和测试样本。它利用正弦波叠加指数衰减函数模拟语音的瞬态特性,并通过调整基频来区分不同的词汇词条。每个生成的信号都会叠加随机噪声,以模拟真实环境中的干扰。
3. MFCC 特征提取
对模拟语音信号执行以下序列处理:
- 预加重:使用高通滤波器提升高频分量。
- 分帧加窗:将长信号切分为重叠的短帧,并施加 Hamming 窗以减少频谱泄露。
- 频谱计算:执行 512 点 FFT 并计算功率谱。
- 梅尔滤波:通过 Mel 滤波器组进行频域积分,模拟人类听觉。
- 倒谱变换:通过离散余弦变换(DCT)提取倒谱系数。
4. 矢量量化 (VQ)
系统采用 LBG 算法(Linde-Buzo-Gray)训练全局码本。该算法从所有训练数据的平均值开始,通过不断分裂质心(±epsilon)并进行迭代优化,直到生成大小为 64 的码本。之后,所有连续的 MFCC 向量通过计算欧式距离被映射为最接近的码本索引。
5. HMM 模型训练
为每个词汇建立一个离散 HMM。
- 结构配置:初始化为严格的“左到右”模型,确保状态转移具有时间先后顺序。
- Baum-Welch 算法:使用简化版的期望最大化(EM)算法。通过前向-后向算法计算期望统计量,并反复迭代更新状态转移概率矩阵 A 和观测概率矩阵 B。
6. 语音识别与测试
在测试阶段,测试样本经过相同的 MFCC 提取和 VQ 量化流程。随后,系统使用 Viterbi 算法在对数域内计算观察序列在该词汇模型下的最大对数似然概率。系统将输入判定为得分最高的模型所对应的词汇。
关键算法与细节分析
VQ 码本训练 (LBG 算法)
系统通过嵌套循环实现质心分裂。每次迭代中,利用 pdist2 计算样本与码本之间的距离矩阵,根据最小距离原则对样本归类,并重新计算各类别的均值作为新的质心。通过设置分裂系数 epsilon 保证了码本能够有效覆盖特征空间。
离散 HMM Baum-Welch 实现
在训练函数中,系统集成了数值稳定性处理。在计算 Alpha(前向)和 Beta(后向)概率时,引入了归一化步骤以防止长序列带来的浮点数下溢风险。Xi(状态转移期望)和 Gamma(状态占据期望)的计算确保了模型参数 A 和 B 能够向最大似然方向收敛。
Viterbi 解码
解码过程在对数空间执行。通过将概率乘法转换为对数加法,有效避免了长序列识别时的精度丢失。算法通过递推计算每个时刻到达每个状态的最大对数概率,最终输出序列的可能性得分。
性能指标与展示
系统最终会输出识别准确率,并绘制混淆矩阵直观展示系统在不同词汇间的区分能力。同时,通过柱状图展示测试样本在各个模型下的对数概率分布,便于分析模型分类的置信度。