webrtc-agc2

本文详细介绍了WebRTC中AGC2模块的编译与效果测试,探讨了不同版本的改进,包括引入的噪声估计和增益求解算法。文章提供了编译所需的文件列表和CMakeLists.txt配置,并分享了一个可能存在问题的测试demo,期待社区的反馈与指正。测试结果显示,该模块在某些特定场景下,如语音能量小或存在大小声变化时,自适应效果不理想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要整理了webrtcagc2模块。目前为止,webrtc提供的agc总共有三个版本,最老的版本在legacy文件夹下,然后就是agc文件下的一个版本,最后一个就是位于agc2文件下的另一版本。相较于之前的版本,agc2引入了RNNvad估计。当然其它的部分也有所改进,如噪声估计、增益求解。webrtcagc2模块打算分两次博文介绍,本篇主要介绍编译以及agc2效果测试,下一篇博文主要介绍自己对agc2算法的理解。agc2的编译所需文件包括:apicommon_audiortc_basesystem_wrappersthird_party以及modules模块下的大部分文件。具体的文件可以参见我的github链接https://github.com/ctwgL/webrtc_agc2。上述文件准备完毕后,编写CMakeLists.txt文件,该部分主要参考https://github.com/lyapple2008/webrtc_apm_cmake

cmake_minimum_required(VERSION 3.6)

project(webrtc_apm)

set(CMAKE_CXX_STANDARD 14)

if (WIN32)
  set(CMAKE_C_FLAGS "/arch:AVX2")
else ()
  set(CMAKE_C_FLAGS "-mavx2 -mfma")
endif()

add_compile_options(-march=native)

if (UNIX)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
endif()

if (WIN32)
  add_definitions(-DWEBRTC_WIN)
else()
  add_definitions(-DWEBRTC_POSIX)
endif ()

if (UNIX)
  add_definitions(-DWEBRTC_LINUX)
endif ()
add_definitions(-DWEBRTC_NS_FLOAT)
add_definitions(-DWEBRTC_APM_DEBUG_DUMP=1)

set(CURRENT_DIR ${CMAKE_CURRENT_SOURCE_DIR})

# api
set(WEBRTC_API_DIR ${CURRENT_DIR}/api)
set(WEBRTC_API_INCLUDE ${CURRENT_DIR}/api)
set(WEBRTC_API_AUDIO_DIR ${CURRENT_DIR}/api/audio)
set(WEBRTC_API_TASK_QUEUE_DIR ${CURRENT_DIR}/api/task_queue)

# common_audio
set(WEBRTC_COMMON_AUDIO_DIR ${CURRENT_DIR}/common_audio)
set(WEBRTC_COMMON_AUDIO_INCLUDE ${CURRENT_DIR}/common_audio)
set(WEBRTC_COMMON_AUDIO_RESAMPLER_DIR ${CURRENT_DIR}/common_audio/resampler)
set(WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_DIR ${CURRENT_DIR}/common_audio/signal_processing)
set(WEBRTC_COMMON_AUDIO_THIRD_PARTY_OOURA_128_DIR ${CURRENT_DIR}/common_audio/third_party/ooura/fft_size_128)
set(WEBRTC_COMMON_AUDIO_THIRD_PARTY_OOURA_256_DIR ${CURRENT_DIR}/common_audio/third_party/ooura/fft_size_256)
set(WEBRTC_COMMON_AUDIO_THIRD_PARTY_SPL_DIR ${CURRENT_DIR}/common_audio/third_party/spl_sqrt_floor)
set(WEBRTC_COMMON_AUDIO_VAD_DIR ${CURRENT_DIR}/common_audio/vad)
set(WEBRTC_COMMON_AUDIO_VAD_INCLUDE ${CURRENT_DIR}/common_audio/vad/include)

# modules
set(WEBRTC_MODULES_AUDIO_CODING_ISAC_VAD_DIR ${CURRENT_DIR}/modules/audio_coding/codecs/isac/main/source)
# modules->audio_processing
set(WEBRTC_MODULES_AUDIO_PROCESSING_DIR ${CURRENT_DIR}/modules/audio_processing)
set(WEBRTC_MODULES_AUDIO_PROCESSING_INCLUDE ${WEBRTC_MODULES_AUDIO_PROCESSING_DIR}/include)
set(WEBRTC_MODULES_AUDIO_PROCESSING_AEC_DUMP_DIR ${WEBRTC_MODULES_AUDIO_PROCESSING_DIR}/aec_dump)
set(WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_DIR ${WEBRTC_MODULES_AUDIO_PROCESSING_DIR}/aec3)
set(WEBRTC_MODULES_AUDIO_PROCESSING_AECM_DIR ${WEBRTC_MODULES_AUDIO_PROCESSING_DIR}/aecm)
set(WEBRTC_MODULES_AUDIO_PROCESSING_AGC_DIR ${WEBRTC_MODULES_AUDIO_PROCESSING_DIR}/agc)
set(WEBRTC_MODULES_AUDIO_PROCESSING_AGC_LEGA
### WebRTCAGC(自动增益控制)功能的 C++ 使用教程 在 WebRTC 的音频处理模块中,AGC 是一项重要的功能,用于动态调整麦克风输入音量以保持一致的声音水平。以下是关于如何在 C++ 中使用 WebRTCAGC 功能的相关说明。 #### 1. 初始化 AudioProcessing 模块 WebRTC 提供了一个名为 `AudioProcessing` 的核心模块来管理各种音频增强功能,包括 AEC(回声消除)、NS(噪声抑制)以及 AGC(自动增益控制)。要启用这些功能,首先需要初始化该模块并配置其参数。 ```cpp #include "api/audio/audio_processing_builder.h" #include "modules/audio_processing/include/audio_processing.h" rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing = webrtc::AudioProcessingBuilder().Create(); if (!audio_processing) { // 处理创建失败的情况 } ``` 上述代码片段展示了如何通过 `AudioProcessingBuilder` 创建一个 `AudioProcessing` 对象实例[^1]。 #### 2. 启用和配置 AGC 功能 一旦成功初始化了 `AudioProcessing` 模块,就可以进一步设置具体的子模块选项。对于 AGC 来说,可以通过调用相应的 API 方法实现开启或关闭操作: ```cpp // 获取指针以便访问内部组件接口 webrtc::AudioProcessing* apm = audio_processing.get(); // 设置模式为 kAdaptiveAnalog 表示自适应模拟增益调节方式; bool result = apm->gain_control()->Enable(true); result &= apm->gain_control()->set_mode( webrtc::GainControl::Mode::kAdaptiveDigital); if (result) { std::cout << "Successfully enabled and configured AGC." << std::endl; } else { std::cerr << "Failed to enable or configure AGC." << std::endl; } ``` 这里选择了数字域内的自适应增益控制策略 (`kAdaptiveDigital`) 而不是传统的模拟电路级方案(`kFixedDigital`, `kAdaptiveAnalog`) ,因为前者通常能提供更好的性能表现[^4]。 #### 3. 数据流接入与处理流程集成 完成以上准备工作之后,在实际应用过程中还需要考虑如何将原始采集的数据送入 AP Module 并获取经过优化后的输出样本序列。这一步骤涉及到对每帧 PCM 编码格式声音数据的操作逻辑设计。 假设已经拥有了来自硬件设备驱动层读取得到的一段缓冲区内容,则可以按照如下方式进行传递给 WebRTC 进行实时预处理: ```cpp const int sample_rate_hz = 16000; // 示例采样率设定值 unsigned char input_buffer[FRAME_SIZE]; // 输入缓存定义大小需匹配具体需求场景 float output_buffer[FRAME_SIZE]; // 输出浮点型数组存储最终结果 // 将字节形式转换成适合运算的标准数值表示法(短整型) int16_t pcm_samples[NUM_SAMPLES]; for(int i=0;i<NUM_SAMPLES;++i){ pcm_samples[i]=static_cast<int16_t>(input_buffer[i]); } // 执行单次完整的语音信号链路分析合成过程 apm->ProcessStream(pcm_samples, sample_rate_hz ,output_buffer ); ``` 此部分实现了从原始二进制位串到标准化量化单位之间的映射关系建立,并且利用 ProcessStream 函数完成了整个框架下的各项修正措施执行动作[^2]。 --- ### 注意事项 尽管上面给出了一套较为通用的技术路线指导方针,但在真实项目开发阶段仍有许多细节值得深入探讨研究。例如不同平台架构下可能存在的兼容性差异问题;或者针对特定业务诉求定制化扩展现有基础能力等等都需要额外投入精力解决。 此外值得注意的是,虽然本文重点讨论了基于 C++ SDK 版本的解决方案,但对于其他编程环境而言也可能存在类似的机制可供借鉴参考[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值