前言
自动增益控制(AGC:Auto Gain Control)是我认为链路最长,最影响音质和主观听感的音频算法模块,一方面是 AGC 必须作用于发送端来应对移动端与 PC 端多样的采集设备,另一方面 AGC 也常被作为压限器作用于接收端,均衡混音信号防止爆音。设备的多样性最直接的体现就是音频采集的差异,一般表现为音量过大导致爆音,采集音量过小对端听起来很吃力。
在音视频通话的现实场景中,不同的参会人说话音量各有不同,参会用户需要频繁的调整播放音量来满足听感的需要,戴耳机的用户随时承受着大音量对耳朵的“暴击”。因此,对发送端音量的均衡在上述场景中显得尤为重要,优秀的自动增益控制算法能够统一音频音量大小,极大地缓解了由设备采集差异、说话人音量大小、距离远近等因素导致的音量的差异。
02
AGC 在 WebRTC 中的位置
在讲 AGC 音频流处理框架之前,我们先看看 AGC 在音视频实时通信中的位置,如图 1 展示了同一设备作为发送端音频数据从采集到编码,以及作为接收端音频数据从解码到播放的过程。AGC 在发送端作为均衡器和压限器调整推流音量,在接收端仅作为压限器防止混音之后播放的音频数据爆音,理论上推流端 AGC 做的足够鲁棒之后,拉流端仅作为压限器是足够的,有的厂家为了进一步减小混音之后不同人声的音量差异也会再做一次 AGC。
图 1 WebRTC 中音频信号上下行处理流程框图
03
AGC 的核心参数
先科普一下样本点幅度值 Sample 与分贝 dB 之间的关系,以 16bit 量化的音频采样点为例:dB = 20 * log10(Sample / 32768.0),与 Adobe Audition 右侧纵坐标刻度一致。
幅度值表示:16bit 采样最小值为 0,最大值绝对值为 32768(幅度值如下图右边栏纵坐标)。
分贝表示:最大值为 0 分贝(分贝值如下图右边栏纵坐标),一般音量到达 -3dB 已经比较大了,3 也经常设置为 AGC 目标音量。
核心参数有:
typedef struct {
int16_t targetLevelDbfs; // 目标音量
int16_t compressionGaindB; // 增益能力
uint8_t limiterEnable; // 压限器开关
} AliyunAgcConfig;
目标音量 - targetLevelDbfs:表示音量均衡结果的目标值,如设置为 1 表示输出音量的目标值为-1dB;
增益能力 - compressionGaindB:表示音频最大的增益能力,如设置为 12dB,最大可以被提升 12dB;
压限器开关 - limiterEnable:一般与 targetLevelDbfs 配合使用,compressionGaindB 是调节小音量的增益范围,limiter 则是对超过 targetLevelDbfs 的部分进行限制,避免数据爆音。
04
AGC 的核心模式
除了以上三个核心的参数外,针对不同的接入设备 WebRTC AGC 提供了以下三种模式:
enum {
kAgcModeUnchanged,
kAgcModeAdaptiveAnalog, // 自适应模拟模式
kAgcModeAdaptiveDigital, // 自适应数字增益模式
kAgcModeFixedDigital // 固定数字增益模式
};
以下我们会结合实例从基本功能,适用场景,信号流图以及存在的问题等方面阐述这三个模式。
【CSDN后台扣1,免费分享】资料包括《Andoird音视频开发必备手册+音视频学习视频+学习文档资料包+大厂面试真题+2022最新学习路线图》等
>固定数字增益 - FixedDigital
固定数字增益模式最基础的增益模式也是 AGC 的核心,其他两种模式都是在此基础上扩展得到。主要是对信号进行固定增益的放大,最大增益不超过设置的增益能力 compressionGaindB,结合 limiter 使用的时候上限不超过设置的目标音量 targetLevelDbfs。
固定数字增益模式下仅依靠核心函数 WebRtcAgc_ProcessDigital 对输入信号音量进行均衡,由于没有反馈机制,其信号处理流程也是极其简单,设置好参数之后信号会经过如下流程:
固定数字增益模式是最核心的模式,主要有如下两个方面值得我们深入学习:
语音检测模块 WebRtcAgc_ProcessVad 的基本思想
在实时通信的场景中,麦克风采集的近端信号中会存在远端的信号的成分,流程中会先通过 WebRtcAgc_ProcessVad 函数对远端信号进行分析,在探测实际近端信号包络的时候需要剔除远端信号这个干扰项,避免因残留的回声信号影响了近端信号包络等参数的统计。最传统的 VAD 会基于能量,过零率和噪声门限等指标区分语音段和无话段,WebRTC AGC 中为粗略的区分语音段提供了新的思路:
1. 计算短时均值和方差,描述语音包络瞬时变化,能够准确反映语音的包