博客
关于我
详解 WebRTC 高音质低延时的背后 — AGC
阅读量:790 次
发布时间:2019-03-25

本文共 3355 字,大约阅读时间需要 11 分钟。

WebRTC AGC 自动增益控制技术解析

自动增益控制(AGC:Auto Gain Control)是音频处理中的重要算法模块,主要用于实现音频信号的动态均衡。AGC 在 WebRTC 中的作用是弥补设备采集差异、调节不同说话人音量差异,以及防止音频爆音或过低音量的问题。以下将深入解析 WebRTC AGC 的核心框架、工作模式及优化方向。

AGC 在 WebRTC 中的核心参数

AGC 的核心参数主要包括以下几个:

  • 目标音量(targetLevelDbfs):表示音量均衡结果的目标值。例如,设置为 1 表示输出音量的目标值为 -1dB。

  • 增益能力(compressionGaindB):表示音频最大的增益能力。例如,设置为 12dB,最大可以被提升 12dB。

  • 压限器开关(limiterEnable):与目标音量配合使用,用于防止音频爆音。压限器主要负责超过目标音量的部分进行限制。

  • 增益表(gainTable):用于存储音频调节增益值。其定义如下:

    typedef struct {     int16_t targetLevelDbfs;    // 目标音量    int16_t compressionGaindB;  // 增益能力    uint8_t limiterEnable;      // 压限器开关} AliyunAgcConfig;

AGC 的工作模式

AGC 提供三种工作模式:固定数字增益(FixedDigital)自适应模拟增益(AdaptiveAnalog)自适应数字增益(AdaptiveDigital)

1. 固定数字增益(FixedDigital)

固定数字增益模式是 AGC 的基础,其他模式都是在此模式基础上扩展得到的。主要特点是对输入信号进行固定增益处理,最大增益不超过设置的 compressionGaindB,结合压限器时上限不超过设置的目标音量 targetLevelDbfs

语音检测模块(VAD)

语音检测模块是 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);

    WebRtcAgc_ProcessDigital 如何对音频数据进行增益

    1. 根据目标增益与增益能力计算增益表

    // 根据设置的目标增益与增益能力,计算增益表if (WebRtcAgc_CalculateGainTable(&stt->digitalAgc.gainTable[0], stt->compressionGaindB, stt->targetLevelDbfs, stt->limiterEnable, stt->analogTarget) == -1) {    return -1;}

    增益表 gainTable 是基于样本点能量值的量化,区间为 [0, 32768],通过整数部分和小数部分组合生成增益值。

    2. 根据输入信号包络在增益表中查找增益值,并应用增益到输入信号

    // 右移 16 位后获得实际增益值intPart = (uint16_t)(absInLevel >> 14); // 提取整数部分fracPart = (uint16_t)(absInLevel & 0x00003FFF); // 提取小数部分// 根据整数部分和小数部分生成增益值gainTable[i] = (1 << intPart) + WebRtcSpl_ShiftW32(fracPart, intPart - 14);

    2. 自适应模拟增益(AdaptiveAnalog)

    在 PC 端,模拟增益调节是通过操作系统 API 来实现的。如 MAC 端和 Windows 端的模拟增益能力分别如下:

    MAC 端模拟增益调节

    // 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 端麦克风阵列增益

    // Windows 端麦克风阵列增益能力uint32_t max_volume;max_volume = ...
    enableMFCFilter(out put); // 解决回声问题

    存在的问题

  • 无语音状态下的模拟值上调行为:在无语音状态下反复上调模拟增益值会导致频繁的操作系统 API 调用,影响性能。

  • 调整幅度过大:模拟增益调节幅度较大,容易导致音频包络出现明显起伏。

  • 性能消耗过高:频繁调用操作系统 API 导致线程阻塞,影响实时性。

  • 3. 自适应数字增益(AdaptiveDigital)

    移动端设备通常没有类似 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/

    你可能感兴趣的文章
    MQ 重复消费如何解决?
    查看>>
    mqtt broker服务端
    查看>>
    MQTT 保留消息
    查看>>
    MQTT 持久会话与 Clean Session 详解
    查看>>
    MQTT工作笔记0007---剩余长度
    查看>>
    MQTT工作笔记0009---订阅主题和订阅确认
    查看>>
    Mqtt搭建代理服务器进行通信-浅析
    查看>>
    MS Edge浏览器“STATUS_INVALID_IMAGE_HASH“兼容性问题
    查看>>
    ms sql server 2008 sp2更新异常
    查看>>
    MS UC 2013-0-Prepare Tool
    查看>>
    MSBuild 教程(2)
    查看>>
    msbuild发布web应用程序
    查看>>
    MSB与LSB
    查看>>
    MSCRM调用外部JS文件
    查看>>
    MSCRM调用外部JS文件
    查看>>
    MSEdgeDriver (Chromium) 不适用于版本 >= 79.0.313 (Canary)
    查看>>
    MsEdgeTTS开源项目使用教程
    查看>>
    msf
    查看>>
    MSSQL数据库查询优化(一)
    查看>>
    MSSQL数据库迁移到Oracle(二)
    查看>>