本文共 3355 字,大约阅读时间需要 11 分钟。
自动增益控制(AGC:Auto Gain Control)是音频处理中的重要算法模块,主要用于实现音频信号的动态均衡。AGC 在 WebRTC 中的作用是弥补设备采集差异、调节不同说话人音量差异,以及防止音频爆音或过低音量的问题。以下将深入解析 WebRTC AGC 的核心框架、工作模式及优化方向。
AGC 的核心参数主要包括以下几个:
目标音量(targetLevelDbfs):表示音量均衡结果的目标值。例如,设置为 1 表示输出音量的目标值为 -1dB。
增益能力(compressionGaindB):表示音频最大的增益能力。例如,设置为 12dB,最大可以被提升 12dB。
压限器开关(limiterEnable):与目标音量配合使用,用于防止音频爆音。压限器主要负责超过目标音量的部分进行限制。
增益表(gainTable):用于存储音频调节增益值。其定义如下:
typedef struct { int16_t targetLevelDbfs; // 目标音量 int16_t compressionGaindB; // 增益能力 uint8_t limiterEnable; // 压限器开关} AliyunAgcConfig;
AGC 提供三种工作模式:固定数字增益(FixedDigital)、自适应模拟增益(AdaptiveAnalog) 和 自适应数字增益(AdaptiveDigital)。
固定数字增益模式是 AGC 的基础,其他模式都是在此模式基础上扩展得到的。主要特点是对输入信号进行固定增益处理,最大增益不超过设置的 compressionGaindB
,结合压限器时上限不超过设置的目标音量 targetLevelDbfs
。
语音检测模块是 AGC 的重要组成部分,其基本思想是基于音频信号的能量和方差检测语音段。具体步骤如下:
短时均值与方差:描述语音包络的瞬时变化,能够准确反映语音的包络变化,如图左红色曲线。
长时均值与方差:描述信号的整体缓慢变化趋势,勾勒信号的“重心线”,如图左蓝色曲线。
标准差与对数比率:计算短时均值与“重心线”的偏差,位于中心之上的部分可以认为发生语音活动的可能性极大。
以下是相关代码示例:
// 更新短时能量级估计uint32_t tmp32 = state->meanShortTerm * 15 + dB;state->meanShortTerm = (int16_t)(tmp32 >> 4);// 更新短时方差估计tmp32 = (dB * dB) >> 12;tmp32 += state->varianceShortTerm * 15;state->varianceShortTerm = tmp32 / 16;// 更新短时标准差估计tmp32 = state->meanShortTerm * state->meanShortTerm;tmp32 = (state->varianceShortTerm << 12) - tmp32;state->stdShortTerm = (int16_t) WebRtcSpl_Sqrt(tmp32);
// 根据设置的目标增益与增益能力,计算增益表if (WebRtcAgc_CalculateGainTable(&stt->digitalAgc.gainTable[0], stt->compressionGaindB, stt->targetLevelDbfs, stt->limiterEnable, stt->analogTarget) == -1) { return -1;}
增益表 gainTable
是基于样本点能量值的量化,区间为 [0, 32768],通过整数部分和小数部分组合生成增益值。
// 右移 16 位后获得实际增益值intPart = (uint16_t)(absInLevel >> 14); // 提取整数部分fracPart = (uint16_t)(absInLevel & 0x00003FFF); // 提取小数部分// 根据整数部分和小数部分生成增益值gainTable[i] = (1 << intPart) + WebRtcSpl_ShiftW32(fracPart, intPart - 14);
在 PC 端,模拟增益调节是通过操作系统 API 来实现的。如 MAC 端和 Windows 端的模拟增益能力分别如下:
// MAC 端模拟增益调节示例代码uint32_t new_voe_mic_level = shared_->transmit_mixer()->CaptureLevel();if (new_voe_mic_level != voe_mic_level) { // 返回新的体验级度 new_mic_volume = static_cast((new_voe_mic_level * max_volume + kMaxVolumeLevel / 2) / kMaxVolumeLevel); return new_mic_volume;}
// Windows 端麦克风阵列增益能力uint32_t max_volume;max_volume = ...enableMFCFilter(out put); // 解决回声问题
无语音状态下的模拟值上调行为:在无语音状态下反复上调模拟增益值会导致频繁的操作系统 API 调用,影响性能。
调整幅度过大:模拟增益调节幅度较大,容易导致音频包络出现明显起伏。
性能消耗过高:频繁调用操作系统 API 导致线程阻塞,影响实时性。
移动端设备通常没有类似 PC 端的模拟增益调节接口,因此 WebRTC 开发了虚拟麦克风调节模块 WebRtcAgc_VirtualMic
,通过增益曲线和抑制曲线模拟 PC 端的模拟增益能力。
// 更新模拟增益值uint32_t new_mic_level = WebRtcSpl_NormU32(current_mic_level);if (new_mic_level != current_mic_level) { // 返回新的体验级度 new_mic_volume = static_cast((new_mic_level * max_volume + kMaxVolumeLevel / 2) / kMaxVolumeLevel); return new_mic_volume;}
灵敏度不足:输入音量的起伏较大时,会导致增益调节出现块状拉升或压缩。
信号失真风险:增益补偿不足时,易导致音质失真。
为了实现更好的听感体验,AGC 算法需要在以下方面进行优化:
模拟增益调节频繁:可以增加调节步长限制,减少操作系统 API 调用频率。
AddMic 模块精度不足:可以增加增益表精度,减少爆音风险。
数字增益与模拟增益的配合:适当增加模拟增益调节能力,提高整体音频质量。
MOS 维度平衡:在追求听感灵敏度的同时,确保 MOS(音质评价)维度不受影响。
通过以上分析和优化,可以显著提升 WebRTC AGC 的音质表现,减少设备采集差异对音频质量的影响,从而提升实时通信体验。
转载地址:http://axvuk.baihongyu.com/