Retour à l'accueil

AGC pour Linux ALSA : implémentation et configuration

L'article décrit l'implémentation AGC pour la normalisation du volume dans les systèmes VoIP sur Linux ALSA. Compare speex, les plugins FFmpeg dynaudnorm et le code personnalisé C++20. Latence de 400 ms atteinte à +3 % CPU.

AGC en action : de speex à C++20 pour VoIP
Advertisement 728x90

Contrôle automatique de gain pour systèmes embarqués : implémentation Linux ALSA

L'algorithme AGC (Contrôle automatique de gain) normalise les niveaux de signal audio en temps réel, rendant inutiles les réglages manuels. Dans les systèmes de communication Linux sous ALSA, il corrige les variations de volume provenant de sources hétérogènes. Cette implémentation cible le format S16_LE, 8000 Hz, mono, avec une latence maximale de 500 ms et une utilisation CPU inférieure à 3 %.

L'objectif est de traiter des transmissions vocales courtes sans moyenne sur fichier complet. Les tests évaluent des critères subjectifs (intelligibilité de la parole) et objectifs (réduction de la dynamique).

Analyse des solutions prêtes à l'emploi : IA et plugins

Le modèle studiovoice de Nvidia normalise le volume et supprime le bruit, mais nécessite un rééchantillonnage de 48 kHz à 8 kHz, augmentant la latence. L'utilisation locale est impossible en raison des dépendances.

Google AdInline article slot

Le plugin ALSA speex (basé sur speexdsp) s'active avec agc on et agc_level (1–32768). Configuration dans /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
}

Test : arecord -D dev_in | aplay -D test_agc. Problèmes : fondu initial, "craquements" dus aux sous-débits, paramètres frames et filter_length non documentés. Verdict : acceptable.

FFmpeg dynaudnorm : décryptage de l'algorithme

Le filtre dynaudnorm est idéal : ffmpeg -f alsa -i dev_in -filter:a "dynaudnorm=f=20:g=33:m=100:c=1" output.wav.

Google AdInline article slot

Paramètres :

  • f=20 — trame de 20 ms pour transmissions courtes ;
  • g=33 — lissage gaussien (équilibre latence/lissité) ;
  • m=100 — gain max (lié au niveau sonore) ;
  • c=1 — correction CC (supprime le décalage des interférences).

Algorithme :

  • Trame d'entrée de taille F ;
  • Correction CC ;
  • Détection de pic ;
  • Calcul du coefficient de gain ;
  • Filtre gaussien pour lissage ;
  • Application du gain et sortie.

Le filtre ne supprime pas le bruit. Alternatives : filtres FFmpeg afftdn, anlmdn, arnndn, ou rnnoise ALSA avec RNN.

Google AdInline article slot

Implémentation personnalisée en C++20

Prototype Python/Jupyter simule le traitement temps réel : tampons de 20 ms sans charger le fichier entier. Visualisation oscilloscope confirme la compression de dynamique.

Version finale : C++20 avec classes AutomaticGainControl et GaussianFilter. Structure du projet :

  • libagc — bibliothèque statique ;
  • agc_pipe — utilitaire de tuyau ;
  • Plugin ALSA libasound_module_pcm_agc.so.

Options agc_pipe :

Options autorisées :

-h [ --help ] Afficher l'aide

-m [ --msec ] arg (=20) Durée trame en ms

-c [ --channel ] arg (=1) Canaux à filtrer

-r [ --rate ] arg (=8000) Fréquence d'échantillonnage

-f [ --filter ] arg (=13) Taille filtre gaussien

-p [ --peak ] arg (=0.950000) Pic max

-g [ --gain ] arg (=100) Gain max

-v [ --verbose ] Logs verbeux

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

Performances : +3 % CPU pour une source, ~400 ms latence (FrameLenMs=20, FilterSize=13). Utilise std::span pour sécurité.

Points clés

  • L'AGC réduit la dynamique sans dégrader la clarté vocale ;
  • La correction CC est indispensable pour éliminer les artefacts matériels ;
  • Le filtrage gaussien assure des transitions fluides, minimisant les coupures ;
  • L'implémentation OOP C++20 surpasse FFmpeg en maintenabilité et extensibilité ;
  • Idéal pour VoIP embarqué : faible charge CPU, latence minimale.

— Editorial Team

Advertisement 728x90

Lire ensuite