基于双门限法的语音活动检测 (VAD) 算法
项目简介
本项目提供了一套基于MATLAB实现的语音活动检测(Voice Activity Detection, VAD)系统。该算法采用经典的“双门限端点检测”原理,结合
短时能量(Short-Term Energy)和
短时过零率(Short-Term Zero Crossing Rate, ZCR)特征,能够从连续的含噪音频流中自动识别并分割出有效的语音片段。
本程序无需外部音频文件,内置了信号合成模块,可直接运行演示。它展示了完整的信号处理流程,包括预处理、特征提取、双阈值状态机判定以及基于过零率的边界修正,是学习语音信号处理及静音检测算法的理想参考。
功能特性
- 内置信号生成:自动生成包含背景白噪声和三段不同频率正弦波模拟语音的测试信号,无需外部数据源。
- 信号预处理:包含预加重滤波,用于提升高频分量,以及标准的汉明窗(Hamming Window)分帧处理。
- 双特征提取:同时计算每一帧的短时能量和短时过零率,作为判决依据。
- 自适应阈值:基于前导静音帧的统计特性(均值与标准差)动态计算高低能量门限及过零率门限。
- 鲁棒的检测逻辑:采用四状态机(静音、可能开始、语音段、可能结束)逻辑,包含“挂起(Handover)”机制,防止因语音中间短暂停顿导致的断裂。
- 边界修正:利用过零率特征向双向搜索,精确找回清音(如摩擦音、爆破音)导致的低能量语音起始和结束点。
- 可视化结果:提供波形图(标记语音段)、能量曲线(含高低阈值)和过零率曲线(含阈值)的直观展示。
系统要求
- MATLAB R2016a 或更高版本
- Signal Processing Toolbox(用于
hamming 窗函数和 filter 函数)
使用方法
- 确保计算机上安装了MATLAB环境。
- 将源程序保存为
main.m。 - 在MATLAB命令行窗口输入
main 并回车,或直接并在编辑器中点击运行。 - 程序将自动执行以下操作:
* 生成4秒长的合成信号。
* 执行VAD检测算法。
* 弹出图形窗口显示波形、能量和过零率分析图。
* 在命令行打印检测到的语音段的具体起止时间。
算法原理与实现细节
本程序的核心逻辑完全包含在主函数中,具体实现步骤如下:
1. 信号模拟与预处理
程序首先构建一个采样率为8000Hz、时长4秒的信号。信号由高斯白噪声和三段不同时间点、不同频率的正弦波叠加而成,模拟真实的“静音-语音-静音”场景。
- 预加重:通过一阶高通滤波器 $H(z) = 1 - 0.98z^{-1}$ 处理信号,目的是为了补偿语音信号高频部分的衰减。
- 分帧加窗:采用25ms帧长和10ms帧移。对每一帧信号乘以汉明窗,以减少频谱泄露并保证短时平稳性。
2. 特征提取
- 短时能量 ($E_n$):计算每一帧内信号幅度的平方和。该特征用于区分高能量的浊音和低能量的背景噪声。
- 短时过零率 ($ZCR$):计算帧内信号穿过零电平的次数。该特征用于区分清音(高过零率)和浊音/静音(低过零率)。
3. 阈值设定
程序假设信号的前10帧为静音/背景噪声段,据此计算噪声的均值和标准差,从而设定三个关键阈值:
- 高能量门限 (MH):用于确信语音存在的较高阈值(均值 + 4倍标准差)。
- 低能量门限 (ML):用于确定语音大致范围的较低阈值(均值 + 2倍标准差)。
- 过零率门限 (Zs):用于修正清音端点的阈值。
4. 状态机搜索策略 (核心逻辑)
算法通过一个
While 循环遍历所有帧,维护一个状态变量
status,其流转逻辑如下:
- 静音状态 (0):若当前帧能量 > ML,进入“可能开始”状态,标记起始点
x1。 - 可能开始状态 (1):
* 若能量 > MH,确认为“语音状态”,标记核心点。
* 若能量掉落至 < ML,判定为噪声脉冲,回归“静音状态”。
- 语音状态 (2):若能量 < ML,进入“可能结束”状态。
- 可能结束状态 (3):这是一个“挂起”阶段,允许语音中有短时的低能量停顿(最大允许8帧静音)。
* 若能量回升 > ML,重置静音计数,回归“语音状态”。
* 若由于静音帧数超时,判定语音段结束,记录结束点
x2。
5. 双向边界修正
当一段语音被能量阈值初步判定结束后,程序会执行关键的
ZCR修正步骤:
- 向前搜索:从能量起始点
x1 向前(左)搜索,若前一帧的过零率 > Zs,则将起始点前移。这能有效找回以清音(如 's', 'f', 't' 等)开头的语音。 - 向后搜索:从能量结束点
x2 向后(右)搜索,若后一帧的过零率 > Zs,则将结束点后移,找回以清音结尾的部分。
6. 结果输出
算法最后将检测到的帧索引转换为时间刻度,并在控制台输出统计报告,并在绘图中以红色半透明区域标记出检测到的语音活动范围,直观对比原始波形与检测结果。