返回首页

Linux ALSA 的 AGC:实现与设置

本文描述了在 Linux ALSA 的 VoIP 系统上用于音量标准化的 AGC 实现。比较了 speex、FFmpeg dynaudnorm 插件和自定义 C++20 代码。实现了 400 ms 延迟,+3% CPU。

AGC 实战:从 speex 到 C++20 用于 VoIP
Advertisement 728x90

嵌入式系统自动增益控制:Linux ALSA 实现

AGC(自动增益控制)算法实时标准化音频信号电平,无需手动调节。在使用 ALSA 的 Linux 通信系统中,它能有效解决不同来源音量不均的问题。本实现针对 S16_LE 格式、8000 Hz、单声道,延迟最高 500 ms,CPU 占用低于 3%。

目标是处理短语音传输,而非整文件平均。测试涵盖主观标准(语音清晰度)和客观标准(动态范围压缩)。

现成解决方案分析:AI 模型与插件

Nvidia 的 studiovoice 模型能标准化音量并抑制噪声,但需从 48 kHz 重采样到 8 kHz,增加延迟。因依赖问题,无法本地部署。

Google AdInline article slot

ALSA speex 插件(基于 speexdsp)通过 agc onagc_level(1–32768)激活。在 /etc/asound.conf 中配置:

pcm.agc_pcm {
  type speex
  agc on
  agc_level 23400
  slave.pcm "dev_out"
}

pcm.test_agc {
  type plug
  slave.pcm agc_pcm
}

测试命令:arecord -D dev_in | aplay -D test_agc。问题:初始淡出、欠载引起的“爆音”,framesfilter_length 未文档化。结论:可用。

FFmpeg dynaudnorm:算法详解

dynaudnorm 滤镜完美契合:ffmpeg -f alsa -i dev_in -filter:a "dynaudnorm=f=20:g=33:m=100:c=1" output.wav

Google AdInline article slot

参数说明:

  • f=20 — 20 ms 帧长,适合短传输;
  • g=33 — 高斯平滑(平衡延迟与平滑度);
  • m=100 — 最大增益(与音量上限相关);
  • c=1 — DC 校正(去除干扰偏移)。

算法流程:

  • 输入帧大小 F;
  • DC 校正;
  • 峰值检测;
  • 增益系数计算;
  • 高斯滤波平滑;
  • 应用增益并输出。

该滤镜不抑制噪声。替代方案:FFmpeg 的 afftdnanlmdnarnndn,或 ALSA 的 rnnoise(RNN 模型)。

Google AdInline article slot

自定义 C++20 实现

Python/Jupyter 原型模拟实时处理:20 ms 缓冲区,无需加载整文件。示波器视图确认动态范围压缩效果。

最终版:C++20,使用 AutomaticGainControlGaussianFilter 类。项目结构:

  • libagc — 静态库;
  • agc_pipe — 管道工具;
  • ALSA 插件 libasound_module_pcm_agc.so

agc_pipe 选项:

允许选项:

-h [ --help ] 显示帮助

-m [ --msec ] arg (=20) 帧长(毫秒)

-c [ --channel ] arg (=1) 声道数

-r [ --rate ] arg (=8000) 采样率

-f [ --filter ] arg (=13) 高斯滤波器尺寸

-p [ --peak ] arg (=0.950000) 最大峰值

-g [ --gain ] arg (=100) 最大增益

-v [ --verbose ] 启用详细日志

测试:arecord -D <input> -f S16_LE -t raw | ./agc_pipe -f 7 -g 99 | aplay -D <output> -f S16_LE -t raw

性能:单源 +3% CPU,约 400 ms 延迟(FrameLenMs=20,FilterSize=13)。使用 std::span 确保安全。

关键要点

  • AGC 压缩动态范围,同时保持语音清晰;
  • DC 校正是消除硬件伪影的关键;
  • 高斯滤波确保平滑过渡,减少削波;
  • C++20 面向对象实现优于 FFmpeg 的可维护性和扩展性;
  • 完美适用于嵌入式 VoIP:低 CPU 负载、最小延迟。

— Editorial Team

Advertisement 728x90

继续阅读