Enregistrer son microphone ET sa sortie audio sous Linux

J'ai eu récemment besoin d'enregistrer sous forme de fichier audio une visio-conférence (ça aurait pu être un fichier vidéo également). Je voulais donc à la fois capturer le son qui entre (mon micro) et celui qui sort (mon casque).

J'utilisais le serveur public de visioconférence d'IndieHosters, qui propose l'enregistrement… Mais pas de récupérer les fichiers. On peut aussi souhaiter ne pas se reposer sur l'enregistrement du logiciel/plateforme, pour des raisons de confidentialité par exemple.

Enfin, cette méthode peut avoir d'autres applications, par exemple pour enregistrer un podcast/émission de radio et y passer de la musique/sons.

C'est dommage que ça ne soit pas plus simple mais en tout cas ça fonctionne. C'est parti 🎶, petite musique, tourne la page…

A. Contexte et pré-requis

Je vous explique comment j'ai procédé, pour ma part j'utilise :

  • La distribution GNU/Linux Debian 11 Bullseye
  • L'environnement de bureau gnome
  • le logiciel Enregistreur de sons (gnome-sound-recorder)

… La procédure devrait être la même sur toutes les distributions/bureaux/ Linux1 et fonctionner avec tous les logiciels capables de capturer du son.

Il est nécessaire d'être familier avec la ligne de commande.

Il est nécessaire d'installer le logiciel pavucontrol. Sous Debian/Ubuntu/Mint, ça se fait avec :

$ sudo apt install pavucontrol


B. Logique générale

Sous GNU/Linux, avec des logiciels comme l'Enregistreur de sons gnome, on enregistre une seule source audio à la fois.

Nous allons donc créer une source audio virtuelle qui « fusionnera » une entrée et une sortie pour les présenter au logiciel comme une source unique.

C. Préparation

Repérer les sources audio qui m'intéressent

La commande suivante va nous permettre d'afficher toutes les sources audio disponibles :

$ pactl list

Beaucoup d'infos sont affichées, on peut filtrer l'affichage pour aller à l'essentiel avec la commande suivante :

$ LANG=C pactl list sources |grep 'Name' -A1

Chez moi, avec un kit mains libres bluetooth connecté, ça affiche ceci (ça sera subtilement différent chez toi) :

    Name: alsa_output.pci-0000_00_1b.0.analog-stereo.monitor
    Description: Monitor of Audio interne Stéréo analogique
--
    Name: alsa_input.pci-0000_00_1b.0.analog-stereo
    Description: Audio interne Stéréo analogique
--
    Name: bluez_sink.90_7A_XX_XX_XX_XX.headset_head_unit.monitor
    Description: Monitor of WI-C310
--
    Name: bluez_source.90_7A_XX_XX_XX_XX.headset_head_unit
    Description: WI-C310

NB: si une source audio est « mutée » (volume à zéro), elle n'apparaîtra pas dans la liste.

Détaillons les 4 sources audio proposées :

Identifiant Appareil concerné Permet de capturer
alsa_output.pci-0000_00_1b.0.analog-stereo.monitor carte son interne à l'ordi portable hauts parleurs intégrés (ou prise casque)
alsa_input.pci-0000_00_1b.0.analog-stereo carte son interne à l'ordi portable micro intégré (ou prise micro)
bluez_sink.90_7A_XX_XX_XX_XX.headset_head_unit.monitor kit main libre bluetooth oreillettes du kit main libre
bluez_source.90_7A_XX_XX_XX_XX.headset_head_unit kit main libre bluetooth micro du kit main libre

Comment s'y repérer et trouver les sources audio qui m'intéressent ?

Le champ description est assez aidant, par ailleurs, quelques mots-clefs :

  • bluez désigne un périphérique bluetooth
  • alsa et pci désignent des cartes son internes
  • monitor output ou sink désignent une sortie (ex: hauts parleurs)
  • source ou input désignent une entrée (ex: microphone)

Puisque c'est le son géré par mon kit mains libres que je souhaite capturer, je repère les deux sources que je souhaite mixer : bluez_sink.90_7A_XX_XX_XX_XX.headset_head_unit.monitor et bluez_source.90_7A_XX_XX_XX_XX.headset_head_unit.

Créer la sortie virtuelle « in_out_mix ».

Je crée une entrée virtuelle que je choisis de nommer in_out_mix.

$ pactl load-module module-null-sink sink_name=in_out_mix sink_properties=device.description=Mixage-entrée-et-sortie

Puis j'y ajoute les deux entrée réelles qui m'intéressent (commande à adapter avec les bons noms de sortie) :

$ pactl load-module module-loopback source=bluez_sink.90_7A_XX_XX_XX_XX.headset_head_unit.monitor sink=in_out_mix
$ pactl load-module module-loopback source=bluez_source.90_7A_XX_XX_XX_XX.headset_head_unit sink=in_out_mix


D. Utilisation : enregistrons !

Si ton logiciel d'enregistrement propose de choisir une source, sélectionner « Mixage entrée et sortie » ou « Moniteur mixage entrée et sortie » et c'est parti ! C'est le cas par exemple de Easy Screencast.

Si ça n'est pas le cas (comme pour l'Enregistreur de sons gnome) :

  1. Ouvrir pavucontrol
  2. Dans l'onglet Entrées, cliquer sur la coche verte sur la ligne « Monitor of Mixage entrée et sortie » Liste d'entrées, la souris vient de cliquer sur la coche verte « Définir par défaut » sur la ligne « Monitor of Mixage entrée et sortie »
  3. Lancer l'enregistrement normalement depuis l'Enregistreur de sons gnome.

E. Aller plus loin

Volumes

pavucontrol permet de visualiser et régler les volumes de tes deux sources, quelques tests/ajustements sont probablement nécessaires pour obtenir un bon équilibre entre les deux sources.

Autres manières de faire ?

Il est probablement possible d'arriver au même résultat en utilisant le logiciel OBS qui est supposé pouvoir combiner plusieurs sources audio.

Péréniser

Pour éviter de refaire la manip à chaque fois, il t'es possible de mettre les 3 lignes suivantes, reprenant les trois commandes (sans le « pactl » dans le fichier ~/.pulse/default.pa :

load-module module-null-sink sink_name=in_out_mix sink_properties=device.description=Mixage-entrée-et-sortie
load-module module-loopback source=bluez_sink.90_7A_XX_XX_XX_XX.headset_head_unit.monitor sink=in_out_mix
load-module module-loopback source=bluez_source.90_7A_XX_XX_XX_XX.headset_head_unit sink=in_out_mix

Source et inspiration


  1. tant qu'elles utilisent le gestionnaire de son pulseaudio, ce qui est le choix par défaut des principales distributions.