For my Rhasspy voice assistant I use the Seeed ReSpeaker 2-Mics Pi HAT on a Raspberry Pi: it's cheap and has two on-board microphones, so you only need to a add a speaker to use it for voice projects.
The drivers are open source and they can be installed easily from the respeaker/seeed-voicecard repository together with supporting systemd services. However, every time you reboot your Raspberry Pi, the playback volume is set to its maximal value, so the feedback sounds and replies from your voice assistant echo through the whole house.
I never bothered to change this behaviour, but when someone on the Rhasspy forum asked about it yesterday (Rhasspy with respeaker 2 hat starts with highest playback volume) I decided to dive into the details.
It turns out that the
seeed-voicecard.service systemd script removes your system's
asound.state at each boot, replacing them by its default files.
If you know this and read the
/usr/bin/seeed-voicecard shell script, the solution for the state file (containing your volume settings) is simple: let the ALSA service store to and restore from this file installed by the Seeed driver,
/etc/voicecard/wm8960_asound.state. Have a look at the
$ systemctl cat alsa-restore.service # /lib/systemd/system/alsa-restore.service # # Note that two different ALSA card state management schemes exist and they # can be switched using a file exist check - /etc/alsa/state-daemon.conf . # [Unit] Description=Save/Restore Sound Card State Documentation=man:alsactl(1) ConditionPathExists=!/etc/alsa/state-daemon.conf ConditionPathExistsGlob=/dev/snd/control* After=alsa-state.service [Service] Type=oneshot RemainAfterExit=true ExecStart=-/usr/sbin/alsactl -E HOME=/run/alsa restore ExecStop=-/usr/sbin/alsactl -E HOME=/run/alsa store
You need to change the latter two lines. So edit the service file to override these lines:
Then add the following lines containing the filename of the Seeed driver's asound state file:
[Service] ExecStart= ExecStart=-/usr/sbin/alsactl -E HOME=/run/alsa -f /etc/voicecard/wm8960_asound.state restore ExecStop= ExecStop=-/usr/sbin/alsactl -E HOME=/run/alsa -f /etc/voicecard/wm8960_asound.state store
ExecStop commands are needed because you want to replace the original commands instead of adding extra commands.
Reload the systemd configuration after your changes:
Then reboot. After this, every change you make to the ALSA mixer (for instance with the
alsamixer command) will be saved when your Raspberry Pi shuts down and reloaded when it boots, so it always uses the volume you have set.
If you don't need your changes to the ALSA mixer to be stored automatically, you can ignore the previous steps and just store the state manually every time after you change it:
sudo alsactl -f /etc/voicecard/wm8960_asound.state store.