ReSpeaker pour raspberry

Configuration PulseAudio

introduction PulseAudio

PulseAudio est un serveur de son qui vient se mettre par-dessus ALSA. En s’intercalant entre le logiciel qui cherche à accéder au périphérique son et la couche matérielle (géré par ALSA), il va nous être possible de faire un tas de chose comme cloner des pistes, ajouter des modules comme l’AEC, changer le format d’échantillonnage etc.

Et en plus, on peut même affecter un périphérique de sortie à chaque application ^^.

Bref, très pratique ce PulseAudio

Installation de PulseAudio

Hé bien on fait simple comme toujours 🙂

sudo apt-get install pulseaudio pavucontrol

C’est fait 😀

Pavucontrol est un petit outil graphique qui permet de gérer les entrées/sorties audio de pulseaudio. Alors quand je dis gérer, on va dire que c’est comme AlsaMixer mais en graphique et un tout petit peu plus de possibilité, mais il n y a pas de configuration de pulseaudio dedans.

Configuration de PulseAudio

La première chose à faire est de modifier notre fichier asound.conf. En fait, en faisant ça, on va rediriger discrètement toutes les applis qui souhaitent discuter avec ALSA vers PulseAudio. Car oui, désormais, pulseaudio gérera le son. Et ça tombe bien, puisque je le rappelle, on passe par la librairie asound, et cette librairie a un plugin PulseAudio 🙂

asound.conf

Donc on édite le fichier de config

sudo nano /etc/asound.conf

Et on replace tout avec ça

pcm.!default {
   type pulse
   fallback "sysdefault"
}
ctl.!default {
   type pulse
   fallback "sysdefault"
}

default.pa

Maintenant, on va pouvoir travailler le fichier de configuration de pulseaudio. Mais comme on va remplacer notre fichier default.pa, on va d’abord faire une petite sauvegarde au cas où

sudo cp /etc/pulse/default.pa /etc/pulse/default.pa.save

On peut donc désormais l’ouvrir en toute sécurité

sudo nano /etc/pulse/default.pa

Et là, on va ajouter ces 2 lignes à la fin

### Make some devices default
set-default-sink alsa_output.platform-soc_sound.seeed-out
set-default-source alsa_output.platform-soc_sound.seeed-in

Ces 2 lignes nous permettent de définir la sortie et l’entrée audio par défaut. L’entrée audio c’est une source et la sortie audio c’est une sink.

Alors le seeed-out et le seeed-in vont être définis dans le profil un peu plus bas. Ne lance pas pulseaudio parce qu’il va se vautrer lamentablement 🙂

on oublie pas CTRL+O pour sauvegarder et CTRL+X pour quitter.

Profil PulseAudio pour respeaker

Bon, on pourrait créer directement les sinks et les sources les modules module-alsa-sink et module-alsa-source mais il est conseillé de laisser faire udev. Et effectivement, j’ai eu pas mal de soucis à fiabiliser PulseAudio avec mon Respeaker 2 mic pi hat en faisant comme ça. Au reboot, j’avais besoin de relancer plusieurs fois pulseaudio avec la commande pulseaudio -k et de lancer pavucontrol pour que ça fonctionne. Bon, je n’ai pas cherché 107 ans non plus donc du coup, je me suis inspiré de ce que faisait seeed pour te proposer un profil qui fonctionne, même après reboot.

Règle udev

La première chose est de créer une règle udev qui va permettre à pulseaudio de savoir quel profil utiliser pour notre respeaker.

On crée une nouvelle règle

sudo nano /etc/udev/rules.d/91-seeedvoicecard.rules

Et on copie colle ça dedans

SUBSYSTEM!="sound", GOTO="seeedvoicecard_end"
ACTION!="change", GOTO="seeedvoicecard_end"
KERNEL!="card*", GOTO="seeedvoicecard_end"

ATTR{id}=="seeed2micvoicec",ENV{PULSE_PROFILE_SET}="seeed-voicecard.conf"
ATTR{id}=="seeed4micvoicec",ENV{PULSE_PROFILE_SET}="seeed-voicecard.conf"
ATTR{id}=="seeed8micvoicec",ENV{PULSE_PROFILE_SET}="seeed-voicecard.conf"

LABEL="seeedvoicecard_end"

Ce fichier-là est compatible quel que soit le respeaker. Et je sens que tu vas me dire qu’il n y a pas de respeaker avec 8 micros. Non, effectivement, mais c’est le nom que seeed a donné au respeaker 6 mic circular.

Donc, on dit à pulseaudio, via udev, que s’il voit un périphérique audio qui possède un de ces id comme valeurs, alors il va aller lire le profil qui est dans seeed-voicecard.conf

le profil seeed-voicecard.conf

Là, ce profil sera propre à chaque respeaker.

On crée le fichier

sudo nano /usr/share/pulseaudio/alsa-mixer/profile-sets/seeed-voicecard.conf

Pour le respeaker 2 mic pi hat :

# /usr/share/pulseaudio/alsa-mixer/profile-sets/seeed-voiced.conf

[General]
auto-profiles = no
[Mapping seeed-in]
device-strings = hw:%f
channel-map = front-left,front-right
exact-channels = false
fallback = yes
paths-input = seeed-in
priority = 3
direction = input
[Mapping seeed-out]
device-strings = hw:%f
channel-map = front-left,front-right
exact-channels = false
fallback = yes
paths-output = seeed-out
direction = output
priority = 2
[Profile output:seeed-out+input:seeed-in]
output-mappings = seeed-out
input-mappings = seeed-in
priority = 100
skip-probe = yes
[Profile output:seeed-out]
output-mappings = seeed-out
priority = 4
skip-probe = yes
[Profile input:seeed-in]
input-mappings = seeed-in
priority = 5
skip-probe = yes

Pour le respeaker 4 mic array (qui n’a pas de sortie audio)

# /usr/share/pulseaudio/alsa-mixer/profile-sets/seeed-voicecard.conf

[General]
auto-profiles = no
[Mapping seeed-in]
device-strings = hw:%f
channel-map = front-left,front-right,rear-left,rear-right
exact-channels = false
fallback = yes
paths-input = seeed-in
priority = 3
direction = input

[Profile input:seeed-in]
input-mappings = seeed-in
priority = 5
skip-probe = yes

Pour le respeaker 6 mic circular

# /usr/share/pulseaudio/alsa-mixer/profile-sets/seeed-voiced.conf

[General]
auto-profiles = no
[Mapping seeed-in]
device-strings = hw:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
exact-channels = false
fallback = yes
paths-input = seeed-in
priority = 3
direction = input
[Mapping seeed-out]
device-strings = hw:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
exact-channels = false
fallback = yes
paths-output = seeed-out
direction = output
priority = 2
[Profile output:seeed-out+input:seeed-in]
output-mappings = seeed-out
input-mappings = seeed-in
priority = 100
skip-probe = yes
[Profile output:seeed-out]
output-mappings = seeed-out
priority = 4
skip-probe = yes
[Profile input:seeed-in]
input-mappings = seeed-in
priority = 5
skip-probe = yes

J’avoue n’avoir essayé que celui pour le respeaker 2 mic pi hat parce que ça prend un temps de fou à écrire tout ça 😀 . Mais si tu rencontres un problème avec le 4 ou 6 mic array, je ferai le test pour voir 😉

Un petit CTRL+O et CTRL+X pour sauvegarder et quitter.

Pour le sport, on peut faire un reboot.

Bonus pour PulseAudio

Si tu veux savoir par exemple comment mettre l’AEC avec pulseaudio, je te conseille cet article qui fera certainement ton bonheur.

Tu trouveras aussi dans cet article (en dehors du mic array usb v2), la possibilité de cloner une sortie audio dans cet autre excellent article.

Démarrage de PulseAudio

Je rappelle à tout hasard que pulseaudio s’exécute en tant que l’utilisateur et PAS EN ROOT. Que tout service lancé avec un autre compte utilisateur n’aura pas accès à Pulse. Pour ça, il y a d’autres solutions. Je ne sais plus si j’ai écrit un truc là-dessus. Désolé, je me fais vieux…

Normalement, pulse est déjà configuré pour se lancer au démarrage. Mais au cas où, voici la procédure.

Donc pour démarrer pulseaudio, on execute ceci :

pulseaudio --start

Bon, et tu vas me demander comment être sûr que ça a marché. Hé bien première chose, on va utiliser l’outil pactl pour savoir si nos sinks (sorties) et sources (entrées) sont bien vues.

pactl list short sinks

La réponse

pi@raspberrypi:~ $ pactl list short sinks
0       alsa_output.platform-soc_audio.analog-mono      module-alsa-card.c      s16le 1ch 44100Hz       SUSPENDED
1       alsa_output.platform-soc_sound.seeed-out        module-alsa-card.c      s16le 2ch 48000Hz       SUSPENDED
pi@raspberrypi:~ $ 

C’est plutôt bon signe tout ça. On voit nos 2 sorties audio, la sortie HDMI et la sortie du respeaker. Voyons pour les sources

pactl list short sources

Le résultat

pi@raspberrypi:~ $ pactl list short sources
0       alsa_output.platform-soc_audio.analog-mono.monitor      module-alsa-card.c      s16le 1ch 44100Hz       SUSPENDED
1       alsa_output.platform-soc_sound.seeed-out.monitor        module-alsa-card.c      s16le 2ch 48000Hz       SUSPENDED
2       alsa_input.platform-soc_sound.seeed-in  module-alsa-card.c      s16le 2ch 44100Hz       SUSPENDED
pi@raspberrypi:~ $ 

Bon, ce qui nous intéresse c’est la ligne avec le N°2. On voit bien que la source a bien été créée. Les autres sont des monitors et n’ont donc pas d’intérêt.

Test de bon fonctionnement

Tu connais la musique (ah ah ! jeu de mot), on essaye déjà de lire un fichier wav.

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

Même chose que pour ALSA, si tu entends une petite voix qui te dit “Front Right”, alors c’est opérationnel

Et c’est parti pour le micro

arecord toto.wav

blablabla pendant 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:~ $

Et on écoute :

aplay toto.wav

Démarrage automatique de PulseAudio

Pour que pulseaudio redémarre tout seul à chaque redémarrage :

systemctl --user start pulseaudio.socket
systemctl --user start pulseaudio.service

On édite un fichier de config

sudo nano /etc/pulse/client.conf

Et on enlève le ; devant cette ligne

autospawn = yes

CTRL+O et CTRL+C pour sauvegarder et quitter

On redémarre le raspberry, et on teste

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

En cas de problème

Hé bien on lance la commande en ayant pris soin d’inverser ce qu’on a fait juste au dessus pour le démarrage automatique

pulseaudio -k
pulseaudio -vvvvv

Et on analyse les lignes rouges (qui commencent par un E)

2 points importants quand même. Il faut savoir que pulseaudio est quand même un peu casse bonbon quand un truc ne marche pas. Et le 2eme point c’est qu’il a quand même besoin de ressources, surtout avec l’utilisation de module donc, je n’ai jamais essayé mais en dessous d’un 3B, je ne suis pas sûr que la qualité sera au rendez-vous au quotidien. A essayer…

Bonne chance 🙂

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.