首页专栏

什么时候有人在说话,和哪些成分是噪声,不是同一件事。

麦克风写下的是一条混在一起的气压变化:你的声音加风扇。VAD 只回答什么时候在说话。时间门控把这个答案当成开关。频谱降噪问得更细:这一时刻、这一频率,该保留多少。

先分开

说「把声音处理好」时,其实常常混了四件事。

录音不会预先分成「人声轨」和「风扇轨」。每个时刻,文件里只有两者相加。

y(t) = s(t) + n(t)

你一边说话,旁边风扇一边响。麦克风记录的是叠加后的压力变化,并没有分好的「人声」和「风扇」。

技术主要判断或处理什么输出
VAD哪些时间段像语音标签、分数或语音时间区间
语音增强混合声音里哪些成分该压低处理后的声音
目标说话人提取多人同时说话时要保留谁某一个人的声音
均衡、压缩、音量怎样改变音色、控制强弱听感经过调整的声音

下面仍用上一页的波形、频谱和声谱图来读。教学合成音:元音、一段 s,再加稳定背景噪声。

同一段

时间门控,和一次简单的频谱降噪。

教学合成:元音 + s 类摩擦声 + 稳定背景噪声。三图用相同色阶。

A混合录音说话与停顿期间,都有背景噪声
B根据真实语音时段做门控停顿被压低;说话期间的混合声音仍然保留
C简单频谱降噪说话期间也抑制噪声;仍会有残留与语音失真

绿色短线:已知语音时段(含 s)。B 使用真值,不是实际 VAD 模型的预测。颜色越深,频谱能量越强。C 从开头无语音段估计噪声,不代表现代模型的效果上限。

三段用相同播放增益,中间空半秒。

  • 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,表示强烈压低。

混合录音一条波形,语音加噪声
→
分帧与频谱短窗重叠,再做频谱分析
→
估计增益每个时频位置该保留多少
→
还原为声音调整频谱,逆变换再拼接

教学用的一列掩蔽:在 [a] 的某一瞬,共振峰附近保留得多,缝隙压得低。不是训练出来的模型。

时间门控像对整列做开关;频谱降噪则能对一列里的不同格子分别处理。

不过,同一个格子里如果同时包含人声和噪声,乘一个增益时,两者都会缩小。整体效果的改善,来自尽量保留语音占优势的区域、压低噪声占优势的区域。它并没有在每一个格子里实现完美分离。

传统方法可以先观察没有语音的时段,估计背景噪声在各个频率上的平均功率。这里估计的是噪声的统计特征,不是把开头一小段风扇波形复制出来直接相减。风扇噪声的瞬时波形一直在变化。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。