降噪与语音检测 · NS 与 VAD

降噪(NS)把风扇、空调这类稳态背景噪声压下去;语音活动检测(VAD)判断此刻有没有人在说话。这一章讲清 NS 的频域降噪原理、VAD 的用途(DTX、增益门控、舒适噪声),以及它们在 APM 链条里的角色。收尾第 7 部分的处理链。

作者 David更新于 第 75 篇(共 112 篇)

降噪与语音检测 · NS 与 VAD

APM 处理链还剩两个环节:NS(降噪) 把背景噪声压下去,VAD(语音活动检测) 判断有没有人说话。它俩一个“洗”,一个“判”,收尾发送侧的音频处理。

NS:压掉稳态噪声

NS(Noise Suppression) 对付的是稳态背景噪声——风扇嗡嗡、空调声、键盘声底、街道白噪:

NS 在频域工作:它估计出“背景噪声的频谱”(哪些频段一直有稳定的噪声能量),然后在每一帧里衰减这些频段的噪声成分**,保留人声。** 原理基于一个观察:噪声通常是“稳态”的(风扇声持续、频谱稳定),而人声是“变化”的(时有时无、频谱多变)。NS 在你不说话的间隙观察出“本底噪声长什么样”(频谱),说话时就用这个模型,从信号里减掉噪声占主导的部分。像回声抑制一样,它是“按频段衰减”,不是精确相减。

难点还是平衡:降噪太狠,人声的某些频段也被削,声音发闷、有“水声 / 电音”(musical noise);降噪太弱,噪声没除干净。所以 NS 有强度档位,在“去噪”和“保真”之间取舍。它和AEC 回声消除的分工:AEC 除的是“扬声器漏回的结构化回声”,NS 除的是“环境里弥散的稳态噪声”——两种不同的“脏”,各有各的算法。

VAD:有人在说话吗

VAD(Voice Activity Detection) 不“洗”音频,而是判断:此刻这段音频,是人在说话,还是静音 / 纯噪声?

VAD 输出一个简单的判断——“有语音”或“无语音”,但这个判断被下游好几个环节依赖:

别小看这个二元判断——它是很多“只在说话时才做 / 不做某事”逻辑的触发器。判断怎么下?综合信号的能量(说话通常比静音响)、频谱特征(人声有特定的频谱结构)、过零率等特征。VAD 要快而准:误判“有语音”(其实是噪声)会浪费带宽 / 放大噪声,误判“无语音”(其实在小声说)会切掉话头(对方听你“吞字”)。所以 VAD 在灵敏度上要仔细校准——宁可偶尔多传一点,也别切掉真的语音。

在链条里的协作

把整条 APM 链和 VAD 的协作画出来:

图表加载中…

处理链一道道洗(HPF→AEC→NS→AGC),VAD 在旁边判断、门控各环节——净化 + 判断,合力把麦克风的脏音,变成干净、响度稳定、静音省带宽的人声,交给编码。

小结与下一章

NS(降噪) 在频域估计稳态噪声频谱、衰减噪声频段(利用“噪声稳态、人声多变”),和 AEC 除结构化回声分工;难在“去噪 vs 保真”平衡。VAD(语音检测) 判断“有无语音”,触发DTX 省带宽、AGC 门控、NS 更新噪声模型——小小二元判断,是很多逻辑的开关,要快准(别切话头)。至此 APM 处理链完整。

发送侧(APM)和接收侧(NetEq)都讲透了。最后补上音频的“两头”——采集播放的设备抽象,和多路混音。下一章收尾第 7 部分。👉 音频设备与混音。

参考资料

  • [1] libwebrtc 源码.modules/audio_processing/ns/(降噪)、modules/audio_processing/vad/、common_audio/vad/。
  • [2] 频域降噪(谱减法)、VAD —— 语音信号处理基础。
  • [3] 关联APM 总览、Opus DTX。

本页目录