自动增益控制 · 音量忽大忽小怎么办
你离麦克风远近、说话大小声,音量忽高忽低——AGC 自动把它拉到稳定水平。这一章讲清 AGC 的目标电平、模拟增益(调麦克风)与数字增益(AGC2)的两级、以及它如何在「够响」和「不削顶」之间平衡。
自动增益控制 · 音量忽大忽小怎么办
回声消掉了,但还有个问题:音量不稳。你凑近麦克风声音就大、往后一靠就小,不同人音量差异也大。对方一会儿要调大音量、一会儿被震到——体验糟糕。AGC(Automatic Gain Control,自动增益控制) 就是把音量自动拉到一个稳定、舒适的水平。这一章看它。
目标:稳定的响度
AGC 持续监测音频的响度,自动施加增益(放大或衰减),把它拉向一个目标电平**——太小就放大,太大就压低,让对方听到的音量始终稳定舒适。** 目标是让“不管你离麦克风远近、说话大小声,对方听到的响度都差不多”。这需要自适应:AGC 追踪你当前的音量,和目标比较,动态调整增益。你突然大声,它快速压一下(别削顶失真);你压低嗓子,它慢慢放大(让对方听清)。
难点在“快慢的拿捏”:调得太快,会把每个字的自然强弱都抹平(听着不自然、像机器人);调得太慢,音量骤变时来不及反应(先震一下 / 先没声)。所以 AGC 对“骤增”反应快(防削顶),对“缓变”反应慢(保自然)——又是一个快慢不对称的权衡。
两级:模拟增益 + 数字增益
WebRTC 的 AGC 分两级(对应 AGC1 与 AGC2 的演进):
模拟增益调“麦克风的采集音量”(在数字化之前),数字增益调“已采集音频的数值”(在数字化之后)——两级配合,既充分利用硬件动态范围,又精细控制。
- 模拟增益(analog) —— 直接调麦克风 / 声卡的硬件增益(采集音量旋钮)。好处:在信号数字化之前放大,能更好地利用麦克风的动态范围、信噪比更优。但它粗、慢(调硬件有延迟),且有上下限。
- 数字增益(AGC2,digital) —— 在音频已经是数字之后,直接乘一个增益系数。好处:快、精细、可做复杂处理(如限幅器防削顶)。AGC2 是现代的数字增益实现,算法更精细。
两级搭配:模拟增益负责“大方向”(把硬件采集调到合适档位),数字增益负责“精修”(在数字域精细拉平)。这利用了两者各自的优势——模拟的信噪比 + 数字的精度。先在源头(硬件)调对大概,再在数字域精调,是信号处理的常见分工。
别把噪声也放大
AGC 有个要小心的副作用,和链条顺序有关:
小结与下一章
AGC 把忽大忽小的音量拉到稳定的目标电平(远近、大小声都听着一致),自适应调整,对骤增快反应(防削顶)、缓变慢反应(保自然)。两级:模拟增益(调麦克风硬件采集音量,信噪比优)+ 数字增益(AGC2)(数字域精细拉平、限幅)。它放在NS 降噪之后(别把噪声一起放大),常配 VAD(只在说话时调)。
链条还剩降噪和语音检测。下一章一起讲。👉 降噪与语音检测。
参考资料
- [1] libwebrtc 源码.
modules/audio_processing/agc/、agc2/(adaptive_agc.h、gain_controller2.h)。 - [2] 自动增益控制 —— 音频动态范围处理。
- [3] 关联APM 处理链顺序。