基于MFCC与GMM的MATLAB语者识别系统
项目简介
本项目是一个基于MATLAB平台开发的高精度语者识别(声纹识别)系统仿真。系统完整实现了从语音信号产生、预处理、特征提取到模型训练及识别的全流程。核心算法采用梅尔频率倒谱系数(MFCC)作为声纹特征,并使用高斯混合模型(GMM)结合期望最大化(EM)算法进行建模与分类。
该项目特别设计为独立运行模式,内置了语音数据生成引擎,无需外部录音文件或WAV数据集即可直接运行,方便用于算法原理验证、教学演示及生物特征识别系统的底层逻辑研究。
主要功能特性
- 内置数据生成:无需外部数据集,通过数学模型自动合成包含基频、谐波、幅度包络及噪声的模拟语音信号。
- 完整的信号预处理:包含预加重滤波、分帧加窗(Hamming Window)。
- 鲁棒的端点检测 (VAD):结合短时能量与过零率(ZCR)的双门限检测算法,并利用中值滤波平滑处理,有效剔除静音段。
- 经典的特征提取:实现标准的MFCC特征提取流程,包含Mel滤波器组映射、DCT变换、倒谱提升(Liftering)及倒谱均值归一化(CMN)。
- 概率统计建模:基于EM算法训练GMM模型,支持多维高斯分布的参数估计(均值、方差、权重)。
- 最大似然识别:对测试语音计算在不同模型下的对数似然度(Log-Likelihood),判定说话人身份。
- 可视化评估:自动生成MFCC特征分布散点图及识别结果混淆矩阵热力图。
系统要求
- MATLAB R2016a 或更高版本
- 不需要额外的工具箱(代码纯手写实现了DCT、FFT处理及GMM-EM算法,未依赖仅限于Audio Toolbox的高级封装函数)
使用方法
- 确保MATLAB环境已安装。
- 将代码保存为脚本文件。
- 直接运行主函数。
- 控制台将输出训练进度、测试结果列表及最终准确率,并弹出特征分布图和混淆矩阵图。
核心算法与实现细节
本项目在一个脚本中集成了所有子模块,具体逻辑流如下:
1. 模拟数据生成
系统不读取外部文件,而是通过
generate_synthetic_data函数生成数据。
- 原理:为3位不同的说话人设定不同的基频(Base Frequency)。
- 合成:通过叠加基频与其谐波的正弦波,乘以时变的幅度包络(模拟音节变化),并加入高斯白噪声。
- 差异化:训练集与测试集在频率与噪声分布上存在微小差异,以模拟真实的语音变异。
2. 预处理与VAD
在特征提取前,对原始信号进行严格的清洗:
- 预加重:使用系数为0.97的一阶FIR高通滤波器,补偿高频分量。
- 端点检测 (VAD):
* 计算每帧的短时能量和过零率。
* 设置双阈值,任意指标超过阈值即判定为语音帧。
* 使用中值滤波(窗口长度5)去除短暂的误判(平滑空洞),仅保留有效语音片段。
3. MFCC 特征提取
系统提取12维MFCC特征,具体步骤包括:
- 分帧:帧长256点,帧移128点,加汉明窗。
- 频谱计算:进行FFT变换并计算功率谱。
- Mel滤波:构建包含26个三角形滤波器的Mel滤波器组,将线性频率映射到Mel频域。
- 对数能量:计算滤波器组输出的对数能量(防止log(0)错误)。
- DCT变换:进行离散余弦变换,取第2至13个系数(去除直流分量C0)。
- 倒谱提升 (Liftering):应用正弦提升窗口,强调高阶倒谱系数。
- 归一化 (CMN):减去特征序列的均值,消除信道效应。
4. GMM 模型训练 (EM算法)
系统为每位注册语者训练一个独立的GMM模型(默认8个混合分量):
- 初始化:采用随机样本作为初始均值,全局方差作为初始协方差,均等权重。
- E步 (Expectation):计算每个数据点属于各个高斯分量的后验概率。利用Log-Sum-Exp技巧防止数值计算下溢。
- M步 (Maximization):根据后验概率加权更新每个分量的权重、均值和对角协方差矩阵。
- 正则化:引入方差地板(Variance Flooring),防止方差过小导致矩阵奇异。
5. 识别判决
- 打分机制:对于输入的测试语音MFCC特征序列,计算其在所有已训练GMM模型下的累积对数似然度。
- 决策:比较所有模型的似然度得分,选择得分最高的模型对应的ID作为识别结果(最大似然准则)。
结果可视化
程序运行结束后会展示两个图表:
- MFCC特征空间分布图:展示不同说话人在MFCC前两个维度(Dim 1 vs Dim 2)上的投影,直观展示特征的可分离性。
- 混淆矩阵热力图:展示真实标签与预测结果的对应关系,并标注具体的识别数量和总体准确率。