Skip to content
VAD (Voice Activity Detection) 详细参数解释
基本配置参数
MODEL_PATH:
- Silero VAD 模型的文件路径,使用ONNX格式
- 这是一个预训练的深度学习模型,专门用于检测音频中的人声活动
SAMPLE_RATE (8000Hz):
- 采样率,支持8000Hz或16000Hz
- VadHandle中使用8000Hz作为标准配置
- 决定每秒采集的音频样本数,更高的采样率可提供更精确的语音检测
WINDOW_SIZE_SAMPLES:
- 每次处理的音频帧大小(2048个样本)
- 定义每次VAD分析的音频片段长度
- 此值需权衡实时性与准确性
灵敏度阈值
START_THRESHOLD (0.4f):
- 语音开始检测阈值
- 当模型输出的语音概率大于此值时,认为语音已开始
- 设置为0.4提供较高的灵敏度,能够快速捕捉语音开始
- 配合能量阈值使用,避免误判
END_THRESHOLD (0.8f):
- 语音结束检测阈值
- 当模型输出的语音概率低于此值时,开始计算可能的语音结束
- 设置为0.8(高于START_THRESHOLD)确保只有在语音明显结束时才触发
- 这种非对称设计避免了语音中的短暂停顿被误判为结束
能量阈值参数(背景噪音过滤)
ENERGY_THRESHOLD (0.05f):
- 音频能量阈值,用于过滤背景噪音
- 采用RMS (Root Mean Square) 方法计算音频帧的能量值
- 只有当音频能量超过此阈值时,才会触发语音开始事件
- 即使VAD模型检测到语音概率超过START_THRESHOLD,如果能量低于此阈值,也会被过滤掉
- 这种双重检测机制(VAD概率 + 能量阈值)有效防止了低能量背景噪音被误判为语音
- 0.05的设置在大多数场景下能有效过滤空调声、键盘声等环境噪音
ENERGY_THRESHOLD_MULTIPLIER (2.0f):
- 能量阈值动态计算倍数
- 系统会持续统计音频流的平均能量值
- 动态阈值 = 平均能量 × 倍数
- 这种自适应机制使VAD能够根据实际音频环境自动调整灵敏度
- 设置为2.0提供适中的过滤强度,平衡了灵敏度和抗噪性
- 较高的倍数(如2.5-3.0)提供更严格的过滤,适合噪音环境
- 较低的倍数(如1.5)提供更宽松的检测,适合安静环境
能量统计信息:
- 系统实时跟踪以下统计数据:
- 累计平均能量:所有音频帧的平均RMS能量
- 最大能量:检测到的最高能量值
- 最小能量:检测到的最低能量值
- 动态阈值:当前使用的自适应能量阈值
- 这些统计数据可用于调试和优化VAD参数
- 系统实时跟踪以下统计数据:
时间控制参数
MIN_SILENCE_DURATION_MS (300ms):
- 判定语音结束所需的最小静音持续时间
- 在SlieroVadDetector中转换为样本数:samplingRate * minSilenceDurationMs / 1000f
- 此参数也被称为"Speech-Complete-Timeout",可通过MRCP协议动态配置
- 设置为300ms提供快速响应,适合实时对话场景
- 可以通过VadHandle构造函数传入自定义值进行调整
SPEECH_PAD_MS (500ms):
- 在检测到的语音段前后添加的缓冲时间
- 确保语音的开头和结尾不会被截断
- 在SlieroVadDetector中转换为样本数:samplingRate * speechPadMs / 1000f
- 500ms的缓冲时间能够有效保护语音边界的完整性
工作原理
VAD检测器采用双重检测机制,结合深度学习模型和能量分析:
音频预处理:
- 将输入的字节流音频数据转换为归一化的浮点数组(-1.0 到 1.0)
- 计算当前音频帧的RMS能量值
能量统计与自适应阈值:
- 持续统计音频流的能量特征(平均值、最大值、最小值)
- 根据统计数据动态更新能量阈值:energyThreshold = avgEnergy × multiplier
- 这种自适应机制使系统能够适应不同的音频环境
语音开始检测(双重条件):
- 条件1:Silero模型输出的语音概率 ≥ START_THRESHOLD
- 条件2:音频帧的RMS能量 ≥ energyThreshold
- 只有同时满足两个条件才触发语音开始事件
- 这种机制有效过滤了低能量的背景噪音和误检测
语音结束检测:
- 当语音概率 < END_THRESHOLD时,标记临时结束点
- 等待MIN_SILENCE_DURATION_MS的静音持续时间
- 如果期间语音概率再次超过START_THRESHOLD,则取消结束标记
- 只有静音持续足够长才确认语音真正结束
返回结果:
- 语音开始事件:返回起始时间戳、语音概率、能量值
- 语音结束事件:返回结束时间戳、语音概率、能量值
- 无事件:返回空Map
应用场景
在dictation模式下,VAD用于自动分段语音,仅在检测到语音时才发送音频到ASR服务,提高识别效率和准确率。通过能量阈值过滤,可以有效避免将背景噪音、空调声、键盘敲击声等低能量噪音误识别为语音。
参数调优建议
当前默认配置(START_THRESHOLD=0.4, END_THRESHOLD=0.8, MIN_SILENCE_DURATION_MS=300, ENERGY_THRESHOLD=0.05, MULTIPLIER=2.0)适合大多数实时对话场景。如需调整:
安静环境优化:
- 可以降低START_THRESHOLD(如0.3)进一步提高灵敏度
- 降低ENERGY_THRESHOLD(如0.03)或MULTIPLIER(如1.5)
- 保持MIN_SILENCE_DURATION_MS=300ms以维持快速响应
噪音环境优化:
- 保持START_THRESHOLD=0.4(已经较低,配合能量阈值使用)
- 提高ENERGY_THRESHOLD(如0.08-0.1)或MULTIPLIER(如2.5-3.0)
- 适当增加MIN_SILENCE_DURATION_MS(如500-600ms)减少误触发
更快响应场景:
- 减少MIN_SILENCE_DURATION_MS(如200ms)
- 可以适当减少SPEECH_PAD_MS(如300-400ms)
- 注意:过短的静音超时可能导致长句被截断
高准确率场景:
- 增加MIN_SILENCE_DURATION_MS(如500-800ms)
- 提高END_THRESHOLD(如0.85-0.9)
- 保持SPEECH_PAD_MS=500ms确保语音完整性
- 适当提高ENERGY_THRESHOLD过滤更多噪音
Speech-Complete-Timeout动态配置:
- 可通过MRCP协议的SET-PARAMS请求动态设置
- 在VadHandle初始化时传入自定义值:
new VadHandle(speechCompleteTimeoutMs) - 注意:初始化后不支持动态修改,需要重新创建VadHandle实例
