欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

WebRTC 高音质和低延迟背后的细节 - AGC(自动增益控制) - 自适应数字增益 - AdaptiveDigital

最编程 2024-05-05 20:04:37
...

基于音频视频通信的娱乐、社交、在线教育等领域离不开多种多样的智能手机和平板设备,然而这些移动端并没有类似 PC 端调节模拟增益的接口。声源与设备的距离,声源音量以及硬件采集能力等因素都会影响采集音量,单纯依赖固定数字增益效果十分有限,尤其是多人会议的时候会明显感受到不同说话人的音量并不一致,听感上音量起伏较大。


为了解决这个问题,WebRTC 科学家仿照了 PC 端模拟增益调节的能力,基于模拟增益框架新增了虚拟麦克风调节模块:WebRtcAgc_VirtualMic,利用两个长度为 128 的数组:增益曲线 - kGainTableVirtualMic 和抑制曲线 - kSuppressionTableVirtualMic 来模拟 PC 端模拟增益(增益部分为单调递增的直线,抑制部分为单调递减的凹曲线),前者提供 1.0~3.0 倍的增益能力,后者提供 1.0~0.1 的下压能力。

image.png 图 5 增益曲线与抑制曲线


核心逻辑逻辑与自适应模拟增益一致。


1. 与自适应模式增益模式一样,依然利用 WebRtcAgc_ProcessAnalog 更新 micVol


2. 根据 micVol 在 WebRtcAgc_VirtualMic 模块中更新增益下标 gainIdx,并查表得到新的增益 gain;

/* 设置期望的音量水平 */
  gainIdx = stt->micVol;
  if (gainIdx > 127) {
    gain = kGainTableVirtualMic[gainIdx - 128];
  } else {
    gain = kSuppressionTableVirtualMic[127 - gainIdx];
  }

3. 应用增益 gain,期间一旦检测到饱和,会逐步递减 gainIdx;

/* 饱和检测更新增益 */
if (tmpFlt > 32767) {
    tmpFlt = 32767;
    gainIdx--;
    if (gainIdx >= 127) {
        gain = kGainTableVirtualMic[gainIdx - 127];
    } else {
        gain = kSuppressionTableVirtualMic[127 - gainIdx];
    }
}
if (tmpFlt < -32768) {
    tmpFlt = -32768;
    gainIdx--;
    if (gainIdx >= 127) {
        gain = kGainTableVirtualMic[gainIdx - 127];
    } else {
        gain = kSuppressionTableVirtualMic[127 - gainIdx];
    }
}

4. 增益后的数据传入 WebRtcAgc_AddMic,检查 micVol 是否大于最大值 maxAnalog 决定是否需要激活额外的补偿。


音频数据流框图如下: image.png

存在的问题与自适应模式增益相似,这里需要明确说的一个问题是数字增益自适应调节灵敏度不高,当输入音量起伏时容易出现块状拉升或压缩,用一个比较明显的例子说明:遇到大音量时需要调用压缩曲线,如果后面紧跟较小音量,会导致小音量进一步压缩,接着会调大增益,此时小音量后续如果接着跟大音量,会导致大音量爆音,需要 limiter 参与压限,对音质是存在失真的。 image.png

image.png

总结与优化方向

为了更好的听感体验,AGC 算法的目标就是忽略设备采集差异,依然能够将推流端音频音量均衡到理想位置,杜绝音量小、杜绝爆音、解决多人混音后不同人声音量起伏等核心问题。


针对上述章节提到的各个模式存在的问题,有如下几点启示:


  1. 模拟增益调节,必须修复调节频繁,步长过大等问题;

  2. AddMic 部分精度不够,可以提前预判,不要等到检测到爆音再回调;

  3. PC 端数字增益和模拟增益模块上是相互独立的,但是效果上应该是相互补偿的;

  4. AGC 对音量的均衡不应该影响 MOS,不能因为追求灵敏度放弃了 MOS。


另外,代码中很多位运算初读起来比较容易劝退,希望大家抓核心代码,形成整体框架后多实践,再吸收消化。


最后,让我们看看优化后的效果:


1. 模拟增益调节之后,采集的音频信号音量存在起伏,经过数字部分均衡后音频包络保持较好,音量整体一致。 image.png

2. 语音和环境中的杂音,经过 AGC 之后语音部分音量起伏减小,杂音部分未见明显提升;
image.gif image.png

3. 一个比较极端的 case,小语音部分最大提升了 35dB,收敛时间保持在 10s 以内;

image.png


「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。公众号后台回复【技术】可加入阿里云视频云技术交流群,和作者一起探讨音视频技术,获取更多行业最新信息。


扫码入群和作者一起探讨音视频技术,获取更多视频云行业最新信息????


image.png