AEC et réduction de bruit avec le ReSpeaker Mic Array v2.0

TP avec ALSA

Ca tombe bien parce qu’Alsa, c’est ce qui est par défaut avec raspberry. On va juste devoir un peu le configurer mais on pourra rapidement passer aux tests.

Par contre, durant tout le TP, ne touche pas aux icônes de son en haut à droite.

Parce que si tu touches à ça, ça va te créer un fichier .asoundrc dans ton home et ce sera prioritaire au fichier de config général qu’on va créer juste derrière.

Donc, n’hésite pas à le supprimer si il existe.

cd && rm .asoundrc

Repérer qui est qui

La première chose à faire est de savoir qui est notre sortie son HDMI et qui est notre sortie son Respeaker.

Pour ça, on va faire :

aplay -l

Et voilà le résultat pour moi :

pi@raspberrypi:~ $ aplay -l
**** Liste des Périphériques Matériels PLAYBACK ****
carte 0: b1 [bcm2835 HDMI 1], périphérique 0: bcm2835 HDMI 1 [bcm2835 HDMI 1]
  Sous-périphériques: 4/4
  Sous-périphérique #0: subdevice #0
  Sous-périphérique #1: subdevice #1
  Sous-périphérique #2: subdevice #2
  Sous-périphérique #3: subdevice #3
carte 1: Headphones [bcm2835 Headphones], périphérique 0: bcm2835 Headphones [bcm2835 Headphones]
  Sous-périphériques: 4/4
  Sous-périphérique #0: subdevice #0
  Sous-périphérique #1: subdevice #1
  Sous-périphérique #2: subdevice #2
  Sous-périphérique #3: subdevice #3
carte 2: ArrayUAC10 [ReSpeaker 4 Mic Array (UAC1.0)], périphérique 0: USB Audio [USB Audio]
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0
pi@raspberrypi:~ $

J’ai donc 3 cartes. La première c’est la sortie son HDMI. C’est la carte 0. Je note l’information très précieusement.

La seconde carte c’est la prise Jack du raspberry. Je fais bien attention à ne surtout pas retenir cette information 😀

Et la troisième carte est la sortie son du respeaker. C’est la carte 2. Je note là aussi l’information.

Si tu as un raspberry 4, il y a fort à parier que tu vois une carte de plus car tu as 2 ports HDMI. Désolé, je n’ai pas de raspberry 4 sous la main, je ne peux donc vérifier. J’ai lu à droite à gauche que seule 1 des 2 sorties HDMI avait une sortie son fonctionnelle. Il te faudra vérifier 🙂

On fait ensuite la même chose mais pour connaître les entrées sons :

arecord -l

Ce qui me donne :

pi@raspberrypi:~ $ arecord -l
**** Liste des Périphériques Matériels CAPTURE ****
carte 2: ArrayUAC10 [ReSpeaker 4 Mic Array (UAC1.0)], périphérique 0: USB Audio [USB Audio]
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0
pi@raspberrypi:~ $

Je n’ai qu’une carte pour l’entrée son, et sans surprise c’est la carte respeaker donc la carte 2.

asound.conf

Alors pour configurer Alsa, on va créer un fichier /etc/asound.conf. Et dans ce fichier de config, on va lui dire ceci :

  • sortie son HDMI
  • sortie son Respeaker
  • entrée son Respeaker

Donc, on crée ce fichier avec sudo :

sudo nano /etc/asound.conf

Et on va aller lui coller ceci. n’hésite pas à faire un copier coller avec VNC, ça marche très bien !

pcm.!default {
   type asym
   playback.pcm "respeaker"
   #playback.pcm "monhdmi"
   capture.pcm "monmicro"
}

ctl.!default {
   type hw
   card 0
}

pcm.monmicro{
   type plug
   slave {
      rate 16000
      format S16_LE
      pcm "hw:2,0"
   }
}

pcm.monhdmi {
   type plug
   slave.pcm "hw:0,0"
}

pcm.respeaker {
   type plug
   rate 16000
   format S16_LE
   slave.pcm "hw:2,0"
}

Aller, je vais expliquer rapidement même si tu dois déjà le savoir si tu as lu mes autres articles 🙂

Le plus important c’est cette partie :

pcm.monhdmi {
   type plug
   slave.pcm "hw:0,0"
}

pcm.respeaker {
   type plug
   rate 16000
   format S16_LE
   slave.pcm "hw:2,0"
}

Dans les lignes “slave.pcm hw:X,0“, il faut que tu remplaces le X par le numéro de carte que tu as noté très précautionneusement tout à l’heure.

Pour moi, carte respeaker, c’est la numéro 2 et la sortie hdmi, c’est la numéro 0.

Je définis aussi mon entrée du respeaker.

pcm.monmicro{
   type plug
   slave {
      rate 16000
      format S16_LE
      pcm "hw:2,0"
   }
}

Et je définis ma sortie par défaut ainsi que mon contrôle par défaut :

pcm.!default {
   type asym
   playback.pcm "respeaker"
   #playback.pcm "monhdmi"
   capture.pcm "monmicro"
}

ctl.!default {
   type hw
   #set Your default card
   card 0
}

Tu constateras que j’ai préparé la ligne pour que la sortie par défaut soit le HDMI, mais je l’ai mise en commentaire. Ce sera pour tout à l’heure.

Avec nano, on oublie pas que pour sauvegarder c’est CTRL+O et CTRL+X pour quitter.

Test de bon fonctionnement de la sortie respeaker

On lance donc VLC depuis la petite framboise en haut à droite, puis “Son et vidéo”

On a donc VLC de lancé

Histoire d’éviter les surprises, on va aller dans “Outils” puis “préférences” puis dans l’onglet “Audio”

Dans “Module de sortie”, on va sélectionner “Sortie audio ALSA” puis cliquer sur “Enregistrer”.

Pour être sûr de la prise en compte, on ferme VLC et on le ré-ouvre.

Maintenant, on va aller ouvrir notre morceau de musique. Pour ça, on clique sur “Media” en haut à gauche

Puis sur “Ouvrir un fichier”. Il ne reste plus qu’à sélectionner le morceau de musique.

Tu cliques sur “Open” et si tu as bien tout fait, normalement, le morceau de musique est joué au travers du haut parleur connecté sur le respeaker.

Si ça ne marche pas, fais les vérifications classiques (volume SUR le haut parleur, volume dans VLC, haut parleur allumé avec des piles ou n’importe quelle source d’alimentation etc…

Test de l’AEC avec sortie son du respeaker

Ok, puisque ça fonctionne, c’est le moment de faire un test. On lance audacity.

et ça nous donne ça :

On coche la case pour ne plus avoir cette fenêtre et on clique sur “OK”

Comme on souhaite enregistrer les 6 canaux (1 canal “voix optimisé”, 4 canaux des 4 micros, et 1 canal du son qui sort des HP), on va aller mettre 6 au niveau des canaux pour l’enregistrement

On lance la musique sur VLC et on revient sur audacity pour cliquer sur le bouton “Record” (rond rouge).

On baraguine quelques mots et on arrête la musique et l’enregistrement.

Voilà ce que ça donne :

On va donc écouter chacun des canaux pour comprendre à quoi ça correspond. En fait, il y’en a surtout 3 qui vont nous intéresser. Le premier, le deuxième et le dernier. Les canaux de 1 à 4 sont les canaux des 4 micros, donc plus ou moins identiques. On va donc mettre en silencieux (mute) ces canaux systématiquement.

Le canal 0 : Voix après traitement

On va donc écouter le premier canal. Pour cela, on va mettre tous les autres canaux en silencieux. On clique sur la petite flèche qui pointe vers le bas (à droite)

et on clique sur “mute”.

Le canal 0, c’est le canal qui est censé avoir le résultat de la voix après avoir enlevé le son qui est sur la dernière piste (qui est le son qui sort par le HP du respeaker) ainsi que quelques algorithmes de réduction de bruit et de gain.

Effectivement, la voix ressort bien et la musique est très peu présente. Néanmoins, elle ne disparait pas !

Le canal 1 : capture du micro

Dans notre TP, le canal 1 est plus ou moins identiques aux canaux 2,3 et 4. C’est le son sans traitement qui est enregistré par le micro.

Le canal 5 : La musique

le canal 5 correspond en fait à la musique qui sort du haut parleur. C’est ce son qui va être utilisé pour faire l’AEC sur les canaux 1,2,3 et 4.

Résultat

Le son de la voix est relativement bien filtré, pas de soucis de ce côté-là.

Bascule de la sortie son sur la sortie HDMI

On va donc dans notre fichier /etc/asound.conf et on fait les modifs suivantes :

sudo nano /etc/asound.conf
pcm.!default {
   type asym
   #playback.pcm "respeaker"
   playback.pcm "monhdmi"
   capture.pcm "monmicro"
}

On met un # devant notre périphérique de sortie “respeaker” et on enlève le # denat notre périphérique “monhdmi”.

Test de bon fonctionnement de la sortie HDMI

On ferme VLC et audacity et on ré-ouvre VLC. On lance la musique. On constate bien que le son sort des haut parleurs de notre écran HDMI.

Si jamais, le son ne sort pas, il te faudra résoudre le souci avant. Là, je ne vais pas pouvoir t’aider car il y a X raisons possibles. Néanmoins, après avoir fait les vérifications d’usage, volume au niveau de l’écran par exemple, tu peux essayer cette astuce.

Tu édites le fichier /boot/config.txt

sudo nano /boot/config.txt

et tu cherches la ligne :

#hdmi_drive=2

et retire le #, c’est à dire, décommente la ligne

hdmi_drive=2

ensuite, CTRL+O pour sauvegarder et CTRL+X pour quitter et redémarre le raspberry.

Si tu as du son, tu peux passer à la suite.

Test de l’AEC avec sortie son HDMI

Donc, on va faire comme pour le respeaker, on lance VLC, on lance la musique et sur audacity on lance l’enregistrement. On baragouine quelques mots et on stoppe l’enregistrement.

voici ce que ça donne :

Le canal 0 : “Voix optimisée” après traitement

Qu’est-ce qu’on constate déjà en écoutant la piste 0 (voix optimisée) ? Déjà qu’on entend quand même plus la musique. Certe la voix est amplifiée par rapport à la musique, on entend qu’un travail a été fait mais on constate clairement qu’il n y a pas d’AEC. Mais le respeaker (à l’aide d’algorithme interne) a fait son maximum pour faire ressortir la voix. Il suffit de comparer la piste 0 (voix optimisée) et la piste 1 (capture directe du micro) pour le comprendre.

On disait donc que l’AEC n’avait pas pu faire son boulot et effectivement, si on regarde le canal 5, il n y a pas la musique. Pourquoi ? Parce que le son sort part le port HDMI et non par notre respeaker !!!

Résultat

tout son que ne connait pas notre respeaker (sirène de pompier dans la rue etc.) ne peut être enlevé par l’AEC.

Si la musique ne passe pas par notre respeaker, l’AEC du respeaker ne peut pas rentrer en action !!!

Et tu vas me dire que c’est nul parce toi par exemple, le son sort par un haut parleur USB ou par le port HDMI. Et je te répondrai qu’il y a une solution à ça.

Clonage du son sur 2 périphériques de sortie

La solution à notre problème est relativement simple, il suffit de faire sortir le son à la fois sur la sortie HDMI pour écouter le son sur l’écran ET sur le respeaker pour profiter de l’AEC.

Pour ça, on va aller un peu modifier notre fichier asound.conf.

sudo nano /etc/asound.conf
pcm.!default {
   type asym
   #playback.pcm "respeaker"
   #playback.pcm "monhdmi"
   playback.pcm "masortiedouble"
   capture.pcm "monmicro"
}

ctl.!default {
   type hw
   card 0
}

pcm.monmicro {
   type plug
   slave {
      rate 16000
      format S16_LE
      pcm "hw:2,0"
   }
}

pcm.monhdmi {
   type plug
   rate 16000
   format S16_LE
   slave.pcm "hw:0,0"
}

pcm.respeaker {
   type plug
   slave.pcm "hw:2,0"
}

pcm.monhdmirespeaker {
   type multi;
   slaves.a.pcm "monhdmi";
   slaves.a.channels 2;
   slaves.b.pcm "respeaker";
   slaves.b.channels 2;
   bindings.0.slave a;
   bindings.0.channel 0;
   bindings.1.slave a;
   bindings.1.channel 1;
   bindings.2.slave b;
   bindings.2.channel 0;
   bindings.3.slave b;
   bindings.3.channel 1;
}

pcm.masortiedouble {
   type route;
   slave.pcm "monhdmirespeaker"
   slave.channels 4;
   ttable.0.0 1;
   ttable.1.1 1;
   ttable.0.2 1;
   ttable.1.3 1;
}

ctl.masortiedouble {
   type hw
   card 0
}

Ce qui est important à regarder ce sont ces 2 parties :

pcm.monhdmirespeaker {
   type multi;
   slaves.a.pcm "monhdmi";
   slaves.a.channels 2;
   slaves.b.pcm "respeaker";
   slaves.b.channels 2;
   bindings.0.slave a;
   bindings.0.channel 0;
   bindings.1.slave a;
   bindings.1.channel 1;
   bindings.2.slave b;
   bindings.2.channel 0;
   bindings.3.slave b;
   bindings.3.channel 1;
}

pcm.masortiedouble {
   type route;
   slave.pcm "monhdmirespeaker"
   slave.channels 4;
   ttable.0.0 1;
   ttable.1.1 1;
   ttable.0.2 1;
   ttable.1.3 1;
}

Alors, je ne vais pas rentrer dans le détail car c’est de la pure config ALSA, mais en résumé, je crée une combinaison de la sortie HDMI et de la sortie du respeaker dans pcm.monhdmirespeaker. Cette combinaison aura 4 canaux :

  • Son droit HDMI
  • Son gauche HDMI
  • son droit respeaker
  • son gauche respeaker

Et je crée une sortie virtuelle qui s’appelle pcm.masortiedouble. Je redirige le son droit sur le canal 0 (droit HDMI) et 2 (droit respeaker). de monhdmirespeaker. Et je redirige le son gauche sur le canal 1 (gauche HDMI) et sur le canal 3 de monhdmirespeaker.

on oublie pas de mettre cette sortie virtuelle comme sortie par défaut

pcm.!default {
   type asym
   #playback.pcm "respeaker"
   #playback.pcm "monhdmi"
   playback.pcm "masortiedouble"
   capture.pcm "monmicro"
}

Test de bon fonctionnement de la sortie combinée

on ferme audacity et VLC. Et on recommence, on ouvre VLC, on lance la musique sur VLC, Et normalement, tu devrais entendre du son sur le haut parleur connecté au respeaker ET sur les haut-parleurs de l’écran HDMI.

Test de l’AEC avec la sortie combinée

on enregistre avec audacity et on balance quelques mots.

Voici le résultat :

Si on écoute le canal 0 (on met en mute tous les autres canaux), on constate que l’AEC a repris du service . En effet, on peut voir sur le canal 5 que la musique est bien présente

Résultat

On peut désormais activer l’AEC du respeaker en utilisant une autre sortie audio que la sienne. Il suffit de la cloner.

Résumé ALSA, respeaker et AEC

=> Tu as pu constater que tout son étranger au respeaker ne peut être utilisé par l’AEC pour “nettoyer” la voix.

=> Si le son sort par une autre sortie son que celle du respeaker il suffit de la cloner.

=> Au sein du respeaker, il y a d’autres algorithmes que l’AEC qui permettent de mettre en avant et d’optimiser la voix.

2 Comments

  1. Bonjour cedcox,
    Merci beaucoup pour tes guides très détaillés et qui plus est : écrits de manière sympa et ludique !
    Tu parles de temps en temps du respeaker core v2. J’en ai un en ma possession et je ne demandais si je pouvais avoir un avis dessus ?
    Il semble déjà plus musclé que le respeaker mic array, mais aussi équipe de plus de places dédiées au traitement de la voix (aec, doa, ns, wakeword, etc…)
    Que penses-tu de la bestiole ?
    J’aimerai tirer meilleur parti de ses capacités mais je ne sais pas trop par où commencer.
    Installer rhasspy dessus ou bien se baser sur respeakerd et dialoguer avec l’api rhasspy ?
    Comme tu le vois c’est un peu flou pour moi ^^

    En ce moment je l’utilise comme satellite rhasspy mais j’ai l’impression qu’on peut mieux faire

    Une idée ?
    Merci d’avance et merci pour tes guides !

    Jérôme

    • Bonjour Jerôme,

      Le respeaker core v2 est plus complet parce qu’il contient déjà de quoi faire tourner le système d’exploitation. C’est un “tout-en-un” qui regroupe un raspberry et un mic array v2 qui n’est qu’une carte son en quelque sorte.
      Après, je ne connais pas les caractéristiques techniques exactes du core v2, mais je pense que ça doit se rapprocher des mêmes composants que le mic array.
      Donc pour tes questions, je n’ai pas d’idées ou de piste pour un cas qui marchera mieux qu’un autre. Certainement les essayer 🙂

      Ced

Poster un Commentaire

Votre adresse de messagerie ne sera pas publiée.


*


Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.