ReSpeaker pour raspberry

Configuration ALSA

introduction ALSA

Alsa est le logiciel qui discute directement, enfin, presque directement avec la carte son. Néanmoins, nativement, il a une contrainte assez forte est que tout logiciel qui prend la main sur la sortie ou l’entrée audio le fait de façon exclusive. Ça veut dire que si j’ai une 2e application qui souhaite accéder à l’entrée ou à la sortie son, hé bien c’est cuit. Bon, heureusement, il y a une solution pour pallier à ce problème, et cela passe par le fichier de configuration.

A titre personnel, je reste moyennement fan d’ALSA qui nécessite un fichier de configuration parfois complexe comparé à PulseAudio. Mais celui-ci a aussi ses contraintes qu’on verra dans le prochain chapitre. En résumé, je dirai que si le raspberry est réservé pour une seule application (comme Rhasspy), ALSA fera très bien l’affaire. S’il doit y avoir plusieurs applications qui doivent accéder en simultanée, alors PulseAudio pourra être envisagé… si le hardware suit 🙂

configurer le respeaker avec ALSA

Aller, passons aux choses sérieuses. La première chose à faire c’est de savoir ce qu’ALSA voit comme périphériques d’entrée et de sortie.

Périphériques de sortie

Pour ça, on va utiliser l’outil aplay. Celui-ci permet de lire des fichiers wav mais aussi de lister les sorties sons disponibles.

La commande qui va nous intéresser est aplay -l (Lettre L en minuscule)

pi@raspberrypi:~ $ aplay -l
**** Liste des Périphériques Matériels PLAYBACK ****
carte 0: ALSA [bcm2835 ALSA], périphérique 0: bcm2835 ALSA [bcm2835 ALSA]
  Sous-périphériques: 7/7
  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
  Sous-périphérique #4: subdevice #4
  Sous-périphérique #5: subdevice #5
  Sous-périphérique #6: subdevice #6
carte 0: ALSA [bcm2835 ALSA], périphérique 1: bcm2835 IEC958/HDMI [bcm2835 IEC958/HDMI]
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0
carte 0: ALSA [bcm2835 ALSA], périphérique 2: bcm2835 IEC958/HDMI1 [bcm2835 IEC958/HDMI1]
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0
carte 1: Device [USB2.0 Device], périphérique 0: USB Audio [USB Audio]
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0
carte 2: seeed2micvoicec [seeed-2mic-voicecard], périphérique 0: bcm2835-i2s-wm8960-hifi wm8960-hifi-0 []
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0
pi@raspberrypi:~ $

Alors qu’est-ce qu’on voit ? Déjà il voit 3 cartes (de 0 à 2).

  • La première a 2 périphériques. Le premier, c’est l’infâme sortie jack du raspberry. Le 2eme et 3eme, c’est la sortie son HDMI.
  • La 2eme carte est la sortie d’un petit haut parleur USB que j’ai connecté.
  • La 3eme carte est mon respeaker.

Pour accéder à ces différentes sorties, ALSA utilise cette syntaxe : plughw:X,Y ou X est le numéro de la carte et Y le numéro de périphérique. C’est pour ça qu’il est très important que tu notes ces informations. On utilisera plughw plutôt que hw afin d’éviter certaines incompatibilités avec un accès direct sans pré-traitement.

Périphériques d’entrée.

De la même façon, il existe un petit outil pour lister les périphériques d’entrées et enregistrer un son en .wav. C’est arecord.

Pour lister on fait :

arecord -l

Ce qui nous donne

pi@raspberrypi:~ $ arecord -l
**** Liste des Périphériques Matériels CAPTURE ****
carte 2: seeed2micvoicec [seeed-2mic-voicecard], périphérique 0: bcm2835-i2s-wm8960-hifi wm8960-hifi-0 []
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0
pi@raspberrypi:~ $ 

Nous avons donc bien notre respeaker en entrée.

Un peu plus d’info

Il est en possible d’avoir un peu plus d’info en tapant aplay -L ou arecord -L

Le fichier /etc/asound.conf

Par défaut, les applications qui souhaitent utiliser ALSA pour l’audio vont utiliser le fichier /etc/asound.conf. En fait, on va passer par la librairie libasound qui va permettre d’optimiser un peu ALSA. Je ne rentrerai pas dans le détail, mais l’idée est là.

Par contre, il y a une petite astuce à connaitre quand on utilise le respeaker. Lors de l’installation, celui-ci remplace le fichier /etc/asound.conf par un lien symbolique vers le fichier /etc/voicecard/asound_Xmic.conf . Et il le fait à chaque redémarrage du raspberry.

Si tu es amené à la modifier, il vaut donc mieux en faire une copie de sauvegarde.

De façon générale, il n’est pas bon de supprimer définitivement un fichier à moins de savoir pourquoi et d’être sûr et certain qu’on ne l’utilisera plus jamais. Du coup, dans le doute, on en fait une copie de sauvegarde.

Donc ça donne :

sudo cp /etc/voicecard/asound_2mic.conf /etc/voicecard/asound_2mic.conf.save

Tu remplaceras évidemment asound_2mic.conf par le bon nom en fonction du respeaker que tu as installé. Si tu as un doute

ls -lsa /etc/asound.conf

voilà maintenant, on sait qu’en éditant /etc/asound.conf, en fait on modifie /etc/voicecard/asound_2mic.conf. Mais on a aussi notre copie de sauvegarde.

Alors le fichier de config fourni par seeed crée un périphérique de type dmix pour la sortie audio. Cela permet à plusieurs applications d’accéder en même temps à celle-ci car je le rappelle, par défaut, ALSA prend le contrôle exclusif des entrées/sorties audio. Et ensuite, défini ce périphérique virtuel comme périphérique standard.

Même chose pour l’entrée audio. Un périphérique de type dsnoop est créé pour l’entrée audio afin que celle-ci soit accessible par plusieurs applications.

Si jamais il n y a qu’une seule application qui doit accéder au raspberry, alors je te conseille plutôt ce fichier de configuration plus simple :

pcm.!default {
   type asym
   playback.pcm {
      type plug
      slave.pcm "hw:2,0"
   }
   capture.pcm {
      type plug
      slave.pcm "hw:2,0"
   }
}

Bien évidemment, tu remplaceras le numéro de carte et de périphérique par les bonnes valeurs que tu auras pris soin de noter précédemment.

le fichier .asoundrc

Il y a aussi une autre façon pour les applications d’accéder à ALSA, c’est en utilisant le fichier .asoundrc (attention le point est important) . Ce fichier, s’il existe, se situe dans le home de l’utilisateur. En fait, il fonctionne exactement de la même façon que le fichier asound.conf, sauf qu’il sera prioritaire. toutes les applications lancées par l’utilisateur utilisera en priorité ce fichier de config avant le fichier asound.conf.

Donc si un jour tu fais des modifs dans le fichier asound.conf et que tu ne constates pas de changement, avant de te taper la tête contre les murs, vérifie qu’il n’y a pas un fichier .asoundrc dans ton home qui te fait un pied de nez.

A savoir aussi que si tu utilises le raspberry avec l’interface graphique, à chaque fois que tu vas toucher l’icône son, il va te générer un fichier .asoundrc.

icône son

Voilà, tu es prévenu 🙂

Gestion du volume en lecture et enregistrement

Alors la gestion du volume en lecture ne concerne pas le 4 mic array qui n’a pas de sortie son.

Pour gérer les volumes, il y a un petit outil en mode texte qui va nous permettre de régler le volume des haut parleurs en sortie et du micro en entrée, c’est “alsamixer”

$ alsamixer

Comme on arrive sur la carte son du raspberry, on va faire “F6”

Puis sélectionner la carte son dont on souhaite utiliser la sortie et taper sur la touche “Entrée”. Nous allons prendre en sortie son le ReSpeaker. Ce sera donc la carte N°2.

Réglage volume de sortie

Vérifie en haut à gauche que tu n’as pas eu les doigts palmés et que c’est bien notre respeaker qui a été sélectionné.

Si on élargit la fenêtre, on va voir qu’on a pas mal de chose à régler si on le souhaite. Je te laisse jouer avec, pour cet article, la seule chose à vérifier c’est que le volume de “Headphon” (le premier) est monté. Si ce n’est pas le cas, tu te déplaces avec les flèches gauche et droite pour arriver sur le bon canal, puis avec les flèches haut et bas, tu règles le niveau.

Réglage volume d’entrée

Par défaut, tu n’as que les canaux liés aux sorties audio. Mais si tu regardes la petite ligne en haut à gauche avec écrit “Vue”, tu verras que tu auras la possibilité de voir aussi que les canaux d’enregistrement ou bien, tous les canaux.

Attention, il y a une petite ruse. Quand tu es en SSH avec putty et que tu fais F4 pour voir les canaux d’enregistrement, boom ! Ça te ferme alsamixer. Donc, l’alternative c’est de faire F5 et d’aller sur le ou les canaux d’enregistrement dont tu souhaites modifier le réglage.

Perso, j’ai activé le VNC donc voici un screen pour la partie capture

Alors oui, c’est un peu étrange et je ne me suis jamais trop penché sur le problème. Les seuls canaux qui vont nous intéresser sont Capture, Left Inp (Micro gauche) et Right Inp (micro droit). Pour le reste, là encore je te laisserai faire des tests.

Voilà ce que ça donne lorsqu’on fait F5 pour avoir à la fois l’enregistrement et la lecture.

Modifier le niveau d’enregistrement

Une fois qu’on est content des réglages, il faut sauvegarder tout ça

sudo alsactl store

Mais si jamais cela ne sauvegarde pas après reboot, Olivier nous propose un petit workaround.

sudo alsactl -f /var/lib/alsa/asound2.state store

Et on modifie le fichier rc.local pour restaurer la config au démarrage.

sudo nano /etc/rc.local

et on ajoute juste avant le exit 0

alsactl -f /var/lib/alsa/asound2.state restore

Ce qui nous donne :

if [ "$_IP" ]; then
   printf "My IP address is %s\n" "$_IP"
fi
alsactl -f /var/lib/alsa/asound2.state restore
exit 0

Test de bon fonctionnement

Maintenant que tu as fait ça, on va vérifier que tu as bien du son en sortie.

aplay /usr/share/sounds/alsa/Front_Right.wav

Si tu entends une petite voix qui te dit “Front Right”, alors c’est un premier pas vers la victoire, cela veut dire que tu as du son en sortie 🙂

Maintenant on va tester le micro

arecord toto.wav

Baragouine la phrase que tu veux (tant que ça dure au moins 5 secondes) puis fais un CTRL+C. Tu devrais avoir ceci :

pi@raspberrypi:~ $ arecord toto.wav
Capture WAVE 'toto.wav' : Unsigned 8 bit, Fréquence 8000 Hz, Mono
^CInterrompu par le signal Interrompre...
pi@raspberrypi:~ $

Il ne reste plus qu’à rejouer le son que tu viens d’enregistrer pour s’assurer que ça fonctionne :

aplay toto.wav

Ta douce voix devrait sortir de façon nasillarde du haut parleur connecté au respeaker 🙂

25 Comments

  1. bonjour,
    J’ai Jeedom sur Raspberry, j’ai voulu installer les drivers. Depuis mon plugin Zwave est hs.

    Est ce que cette ligne : sudo apt-get install python3 python3-dev python3-setuptools python3-pip python3-venv build-essential
    peut être la source de mon conflit ?

    • Bonjour Adrien,

      Désolé du retard de la réponse (qui n’en sera pas une).
      Malheureusement, je n’utilise pas jeedom donc, je ne vais pas pouvoir t’aider. Mais de façon générale, je préfère toujours séparer les fonctionnalités. je te conseille d’avoir un Rhasspy sur un autre raspberry.
      Si tu ne peux pas alors essaye de regarder du côté des images dockers pour Rhasspy, ça évitera justement ce genre d’interactions désagréables 🙁

      Cédric

  2. Bonjour,

    Je viens de voir que tu as pris ma remarque en compte je suis bluffé, j’ai contribué à ton tuto merci à nouveau pour ton travaille.

    J’en profite également pour te dire
    Qu’il manque un “sudo”, cela doit être ici
    nano /etc/pulse/client.conf
    Cela peut bloquer certains utilisateurs

    De mon côté je constate un bruit de fond constant, et le volume d’enregistrement au dela de 60 empêche la détection des fins de phrases. Je bloque sur ce problème que je semble être seul à constater.

    • Hello,

      Pour le bruit de fond, cela vient généralement d’un cable d’alimentation USB de mauvaise qualité qui provoque des interférences. Très dur de trouver un câble 5V 3A de bonne qualité et non un truc chinois tout pourri :/

      Ced

    • je viens de voir que sur Alsamixer, il y a indiqué en haut a gauche la valeur en Db, et le 0Db (donc sans gain) correspond à 18. Je viens de faire des tests et le bruit de fond est fortement atténué et la voix est beaucoup plus claire.

  3. Bonjour,

    Alsamixer perd la config à chaque redémarrage

    J’ai bien lancé
    Sudo Alsamixer
    Esc
    sudo Alsactl store

    au reboot, pas de restauration

    Une idée ?
    merci d’avance de ton support

    • ok touvé un workaround

      j’ai sauvé la config alsamixer
      sudo alsactl -f /var/lib/alsa/asound2.state store

      ajouté dans rc.local pour charger la config au démarrage
      sudo nano /etc/rc.local
      et ajouté (avant 0)
      alsactl -f /var/lib/alsa/asound2.state restore

      Merci de ton tuto

    • Salut Olivier,

      C’était la solution que j’allais te proposer car j’avais aussi remarqué que ça ne sauvegarder pas à tous les coups après le reboot.
      je vais donc en profiter pour mettre à jour l’article 😉

      Ced

  4. Bonjour
    tout d’abord merci pour le tuto
    lorsque je lance pulse audio j’ai le message suivant
    E: [pulseaudio] main.c: Échec lors du démarrage du démon.
    je ne sais pas ou chercher

    • Hello Michael,

      Essaye ceci pour avoir plus d’info :

      journalctl -n (number of lines)

      Cela devrait te retourner les n dernières lignes de log.

      Cédric

    • oct. 19 22:21:38 raspberrypi systemd[1096]: pulseaudio.service: Scheduled restart job, restart counter is at 5.
      oct. 19 22:21:38 raspberrypi systemd[1096]: Stopped Sound Service.
      oct. 19 22:21:38 raspberrypi systemd[1096]: pulseaudio.service: Start request repeated too quickly.
      oct. 19 22:21:38 raspberrypi systemd[1096]: pulseaudio.service: Failed with result ‘exit-code’.
      oct. 19 22:21:38 raspberrypi systemd[1096]: Failed to start Sound Service.
      oct. 19 22:21:38 raspberrypi systemd[1096]: pulseaudio.socket: Failed with result ‘service-start-limit-hit’.
      oct. 19 22:21:48 raspberrypi dhcpcd[743]: eth0: Router Advertisement from fe80::26f5:a2ff:fe90
      oct. 19 22:21:48 raspberrypi dhcpcd[743]: wlan0: Router Advertisement from fe80::26f5:a2ff:fe90
      oct. 19 22:23:11 raspberrypi dhcpcd[743]: eth0: Router Advertisement from fe80::26f5:a2ff:fe90
      oct. 19 22:23:11 raspberrypi dhcpcd[743]: wlan0: Router Advertisement from fe80::26f5:a2ff:fe90:

    • SAlut,

      pour info le problème est résolu, je n’avais pas utiliser le bon OS (lite au lieu de full) il devait donc me manquer certain paquet

  5. Bonjour,
    Installation ReSpeaker
    J’ai bien du son en sortie mais impossible d’enregistrer
    arecord toto.wav
    ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM input
    arecord: main:828: erreur à l’ouverture audio: Aucun fichier ou dossier de ce type
    J’ai installer alsa-base et alsa-utils, mais rien n’y fait.

    Merci d’avance pour l’aide apportée
    Hervé

    • Bonjour Arthur,

      Lorsque tu fais arecord toto.wav, arecord va regarder dans le fichier asound.conf (ou asound.rc du profil) quel est le périphérique d’enregistrement par défaut.
      Lorsque tu mets -Dhw:1, tu lui donnes spécifiquement le périhpérique à utiliser. Dans ce cas là, le device 1 en HW direct.
      Je dirai donc que tu as certainement une mauvaise configuration au niveau du fichier asound.conf.

      Ced

  6. Bonjour ced,
    J’ai un ResPeaker 2 Mics Pi HAT est je n’arrive pas à utiliser les leds. J’ai pourtant bien suivi ton tuto pour l’installer mais quand j’execute le python j’ai toujours la même erreur :

    pi@raspberrypi:~/mic_hat $ python pixels.py
    Traceback (most recent call last):
    File « pixels.py », line 5, in
    import apa102
    File « /home/pi/mic_hat/apa102.py », line 8, in
    import spidev
    ImportError: No module named spidev

    Je ne sais vraiment pas quoi faire. Avant j’étais sur Snips est les leds fonctionnait et maintenant je suis sur kalliope (que je conseille à tout le monde, c’est open source) et impossible de les faires fonctionner.

    Help me ! Please ! ^^

    • Bonjour Arthur, je n’ai pas approuvé ton premier message car il était trop grand et je comptais le raccourcir, premier point, et 2eme point j’étais en train de regarder de mon côté 🙂
      Je viens de refaire la manip et chez moi ça fonctionne. J’ai bien vu dans ton précédent message (non approuvé) que tu avais lancé l’installation de spidev. C’est donc un peu étrange.
      Laisse moi regarder encore un peu de mon côté, et je vais revenir vers toi 🙂

      Cédric

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.