麦克风写下的是一条混在一起的气压变化:你的声音加风扇。VAD 只回答什么时候在说话。时间门控把这个答案当成开关。频谱降噪问得更细:这一时刻、这一频率,该保留多少。
先分开
说「把声音处理好」时,其实常常混了四件事。
录音不会预先分成「人声轨」和「风扇轨」。每个时刻,文件里只有两者相加。
y(t) = s(t) + n(t)
你一边说话,旁边风扇一边响。麦克风记录的是叠加后的压力变化,并没有分好的「人声」和「风扇」。
| 技术 | 主要判断或处理什么 | 输出 |
|---|---|---|
| VAD | 哪些时间段像语音 | 标签、分数或语音时间区间 |
| 语音增强 | 混合声音里哪些成分该压低 | 处理后的声音 |
| 目标说话人提取 | 多人同时说话时要保留谁 | 某一个人的声音 |
| 均衡、压缩、音量 | 怎样改变音色、控制强弱 | 听感经过调整的声音 |
下面仍用上一页的波形、频谱和声谱图来读。教学合成音:元音、一段 s,再加稳定背景噪声。
同一段
时间门控,和一次简单的频谱降噪。
教学合成:元音 + s 类摩擦声 + 稳定背景噪声。三图用相同色阶。
三段用相同播放增益,中间空半秒。
- A → B:没有语音的整段时间变白了;说话期间,背景噪声仍在。
- A → C:说话期间的背景能量也被压低;语音结构尽量保留。
- s 所在区域:它本来就像一片高频噪声,却是需要保留的语音成分。
s、f、sh 在声谱图上可以长得像噪声。把「看起来像嘶声的东西」全删掉,辅音也会一起被吃掉。
图 B 故意用已知的真实语音时段,把检测错误排除在外。即使 VAD 完全正确,时间门控也不能清除讲话期间混入的噪声。
VAD
语音活动,不是声带正在周期性地振动。
VAD 首先只解决时间上的判断。它把录音分成短帧,结合频率分布和时间变化,判断每一帧更像语音还是非语音。
- s、f、sh 等清辅音没有稳定 F0,但仍属于语音。
- 机械嗡声可能很有周期性,却不是人在说话。
- 因此 VAD 不能简单地采用「检测到 F0 就保留」。
这和上一页是同一条线:周期性只是线索,不是「这是不是语音」的定义。
最简单的办法是超过音量阈值就算有人说话。拍桌子很响,却不是语音;轻声说话很小,却应该保留。更完整的方法会结合多个频段的能量和统计特征,例如传统 WebRTC VAD。Silero 一类模型可以输出语音时间区间。
实际系统还会给判断加一些时间上的缓冲:避免一个很短的停顿就关闭,或在确认开始说话后,保留之前缓存的一小段声音。这能减少「第一个字被吃掉」「尾音突然消失」。检测完成后,是否静音、截取或送给识别,是后续模块的决定。
把 VAD 的判断用于开关音频,就形成了时间门控。有语音时打开,没有语音时关闭或衰减。
但你说话时,风扇仍然在响。开门放进来的,仍是「语音 + 风扇」。
掩蔽
从「这一段时间」,到「这一时刻的这一频率」。
声谱图里每一个小格子,都对应一个时间和一个频率。常见的抑制型降噪,会为这些格子计算不同的保留比例,也叫增益或掩码,再逆变换、重叠拼接还原成声音。
Ŝ(t, f) = G(t, f) Y(t, f)
- Y(t, f):混合声音的复数频谱
- G(t, f):这个位置的保留比例
- Ŝ(t, f):处理后估计得到的语音频谱
增益接近 1,表示大部分保留;接近 0,表示强烈压低。
时间门控像对整列做开关;频谱降噪则能对一列里的不同格子分别处理。
不过,同一个格子里如果同时包含人声和噪声,乘一个增益时,两者都会缩小。整体效果的改善,来自尽量保留语音占优势的区域、压低噪声占优势的区域。它并没有在每一个格子里实现完美分离。
传统方法可以先观察没有语音的时段,估计背景噪声在各个频率上的平均功率。这里估计的是噪声的统计特征,不是把开头一小段风扇波形复制出来直接相减。风扇噪声的瞬时波形一直在变化。VAD 可以帮助决定什么时候适合更新噪声估计,但不是所有降噪系统都必须先经过一个独立 VAD。
神经网络方法则通过大量「干净语音 + 不同噪声」的例子,学习更合适的增益。它仍然可能把轻声、气声或某些辅音误当成噪声。稳定风扇比较适合统计估计;突然敲键盘或杯子碰桌子就要难得多,因为过去估计的噪声不能充分代表当前噪声。
哪路人声
「突出人声」还要看你想突出的是哪一种声音。
如果是「我的声音 + 风扇」,普通语音降噪就符合目标。
如果是「我和旁边的人同时讲话」,两个声音都有谐波、共振峰和语音节奏。普通 VAD 会认为两个人都是语音,它无法仅凭「是不是人声」决定应该留下谁。
这时需要额外信息。
常见线索例如:
- 说话人身份:提供目标人的参考声音。Google VoiceFilter 就采用了这种思路。
- 声源方向:多个麦克风利用到达时间、相位差,对目标方向做空间滤波,即波束形成。
- 声音类别:从歌曲中提取人声、压低伴奏,属于另一类声源分离任务。
| 处理 | 改变了什么 | 要注意什么 |
|---|---|---|
| 均衡 EQ | 调整不同频段的强弱 | 与人声同频段的噪声也会被改变 |
| 动态压缩、自动增益 | 缩小或调整音量变化 | 小声段的背景噪声也可能被抬高 |
| 去混响 | 减少房间反射带来的拖尾 | 与抑制风扇声是不同问题 |
| 目标说话人提取 | 尽量保留指定的人 | 需要身份等线索,仍可能发生串音 |
单纯把整段录音放大,通常不会提高信噪比。假如人声功率是 4、噪声功率是 1,统一放大以后两者一起增加,比例仍然是 4:1。
怎么听
判断处理是否成功,不能只听停顿时有多安静。
真正值得听的是讲话期间的细节。
- 第一个字、最后一个字是否完整?
- s、f、sh 等较弱的辅音是否还在?
- 语音背后的噪声是否减少?
- 是否出现水声、金属声、忽大忽小或断断续续?
- 背景更安静以后,字是否更容易听懂,声音是否仍然自然?
一个直观的例子:把「沙」的摩擦部分过度压掉,背景可能更干净,但字也可能变得不清楚。降噪始终需要在压低噪声与保留语音之间做取舍。
核对
先想好,再点。
停顿变静很容易。讲话期间的混合物,才是真正的考题。
1. VAD 完全正确,再按它做时间门控。说话时的风扇声能消失吗?
2. s 没有稳定 F0。VAD 是否应该丢掉它?
3. 一个时频格子里同时有共振峰和风扇。增益取 0.5,会发生什么?
4. 把整段录音统一放大。人声是 4,噪声是 1。新的信噪比?
5. 降噪后停顿很静,但「沙」变钝了。怎样评价?
噪声会骗耳朵。粤调仍然要看见音高。
若门控吃掉第一个字,或掩蔽咬掉 s,声调图会因为错误的原因看起来断了。先找一个稳定的房间录音,再让 App 盯着 F0。
JYUTONE