Create a voice satellite using a Raspberry Pi Zero 2 W and a ReSpeaker 2Mic HAT.
This tutorial should work for almost any Raspberry Pi and USB microphone. Audio enhancements and local wake word detection may require a 64-bit operating system, however.
Follow instructions to install Raspberry Pi OS. Under "Choose OS", pick "Raspberry Pi OS (other)" and "Raspberry Pi OS (64-bit) Lite".
When asking if you'd like to apply customization settings, choose "Edit Settings" and:
- Set a username/password
- Configure the wireless LAN
- Under the Services tab, enable SSH and use password authentication
After flashing and booting the satellite, connect to it over SSH using the username/password you configured during flashing.
On the satellite, make sure system dependencies are installed:
sudo apt-get update
sudo apt-get install --no-install-recommends \
git \
python3-venvClone the wyoming-satellite repository:
git clone https://github.com/rhasspy/wyoming-satellite.gitIf you have the ReSpeaker 2Mic or 4Mic HAT, recompile and install the drivers (this will take really long time):
cd wyoming-satellite/
sudo bash etc/install-respeaker-drivers.shAfter install the drivers, you must reboot the satellite:
sudo rebootOnce the satellite has rebooted, reconnect over SSH and continue the installation:
cd wyoming-satellite/
python3 -m venv .venv
.venv/bin/pip3 install --upgrade pip
.venv/bin/pip3 install --upgrade wheel setuptools
.venv/bin/pip3 install \
-f 'https://synesthesiam.github.io/prebuilt-apps/' \
-e '.[all]'If the installation was successful, you should be able to run:
script/run --helpPicking the correct microphone/speaker devices is critical for the satellite to work. We'll do a test recording and playback in this section.
List your available microphones with:
arecord -LIf you have the ReSpeaker 2Mic HAT, you should see:
plughw:CARD=seeed2micvoicec,DEV=0
seeed-2mic-voicecard, bcm2835-i2s-wm8960-hifi wm8960-hifi-0
Hardware device with all software conversions
For other microphones, prefer ones that start with plughw: or just use default if you don't know what to use.
Record a 5 second sample from your chosen microphone:
arecord -D plughw:CARD=seeed2micvoicec,DEV=0 -r 16000 -c 1 -f S16_LE -t wav -d 5 test.wavSay something while arecord is running. If you get errors, try a different microphone device by changing -D <device>.
List your available speakers with:
aplay -LIf you have the ReSpeaker 2Mic HAT, you should see:
plughw:CARD=seeed2micvoicec,DEV=0
seeed-2mic-voicecard, bcm2835-i2s-wm8960-hifi wm8960-hifi-0
Hardware device with all software conversions
For other speakers, prefer ones that start with plughw: or just use default if you don't know what to use.
Play back your recorded sample WAV:
aplay -D plughw:CARD=seeed2micvoicec,DEV=0 test.wavYou should hear your recorded sample. If there are problems, try a different speaker device by changing -D <device>.
Make note of your microphone and speaker devices for the next step.
In the wyoming-satellite directory, run:
script/run \
--debug \
--name 'my satellite' \
--uri 'tcp://0.0.0.0:10700' \
--mic-command 'arecord -D plughw:CARD=seeed2micvoicec,DEV=0 -r 16000 -c 1 -f S16_LE -t raw' \
--snd-command 'aplay -D plughw:CARD=seeed2micvoicec,DEV=0 -r 22050 -c 1 -f S16_LE -t raw'Change the -D <device> for arecord and aplay to match the audio devices from the previous section.
You can set --name <NAME> to whatever you want, but it should stay the same every time you run the satellite.
In Home Assistant, check the "Devices & services" section in Settings. After some time, you should see your satellite show up as "Discovered" (Wyoming Protocol). Click the "Configure" button and "Submit". Choose the area that your satellite is located, and click "Finish".
Your satellite should say "Streaming audio", and you can use the wake word of your preferred pipeline.
You can run wyoming-satellite as a systemd service by first creating a service file:
sudo systemctl edit --force --full wyoming-satellite.servicePaste in the following template, and change both /home/pi and the script/run arguments to match your set up:
[Unit]
Description=Wyoming Satellite
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=/home/pi/wyoming-satellite/script/run --name 'my satellite' --uri 'tcp://0.0.0.0:10700' --mic-command 'arecord -D plughw:CARD=seeed2micvoicec,DEV=0 -r 16000 -c 1 -f S16_LE -t raw' --snd-command 'aplay -D plughw:CARD=seeed2micvoicec,DEV=0 -r 22050 -c 1 -f S16_LE -t raw'
WorkingDirectory=/home/pi/wyoming-satellite
Restart=always
RestartSec=1
[Install]
WantedBy=default.target
Save the file and exit your editor. Next, enable the service to start at boot and run it:
sudo systemctl enable --now wyoming-satellite.service(you may need to hit CTRL+C to get back to a shell prompt)
With the service running, you can view logs in real-time with:
journalctl -u wyoming-satellite.service -fIf needed, disable and stop the service with:
sudo systemctl disable --now wyoming-satellite.serviceYou can run the satellite with automatic gain control and noise suppression:
script/run \
... \
--mic-auto-gain 5 \
--mic-noise-suppression 2Automatic gain control is between 0-31 dbFS, which 31 being the loudest. Noise suppression is from 0-4, with 4 being maximum suppression (may cause audio distortion).
You can also use --mic-volume-multiplier X to multiply all audio samples by X. For example, using 2 for X will double the microphone volume (but may cause audio distortion). The corresponding --snd-volume-multiplier does the same for audio playback.
Install the necessary system dependencies:
sudo apt-get update
sudo apt-get install --no-install-recommends \
libopenblas-devFrom your home directory, install the openWakeWord Wyoming service:
git clone https://github.com/rhasspy/wyoming-openwakeword.git
cd wyoming-openwakeword
script/setupCreate a systemd service for it:
sudo systemctl edit --force --full wyoming-openwakeword.servicePaste in the following template, and change both /home/pi and the script/run arguments to match your set up:
[Unit]
Description=Wyoming openWakeWord
[Service]
Type=simple
ExecStart=/home/pi/wyoming-openwakeword/script/run --uri 'tcp://127.0.0.1:10400'
WorkingDirectory=/home/pi/wyoming-openwakeword
Restart=always
RestartSec=1
[Install]
WantedBy=default.target
Save the file and exit your editor.
You can now update your satellite service:
sudo systemctl edit --force --full wyoming-satellite.serviceUpdate just the parts below:
[Unit]
...
Requires=wyoming-openwakeword.service
[Service]
...
ExecStart=/home/pi/wyoming-satellite/script/run ... --wake-uri 'tcp://127.0.0.1:10400' --wake-word-name 'ok_nabu'
...
[Install]
...
Reload and restart the satellite service:
sudo systemctl daemon-reload
sudo systemctl restart wyoming-satellite.serviceYou should see the wake service get automatically loaded:
sudo systemctl status wyoming-satellite.service wyoming-openwakeword.serviceThey should all be "active (running)" and green.
Test out your satellite by saying "ok, nabu" and a voice command. Use journalctl to check the logs of services for errors:
journalctl -u wyoming-openwakeword.service -fMake sure to run sudo systemctl daemon-reload every time you make changes to the service.
Example event services for the ReSpeaker 2Mic and 4Mic HATs are included in wyoming-satellite/examples that will change the LED color depending on the satellite state. The example below is for the 2Mic HAT, using 2mic_service.py. If you're using the 4Mic HAT, use 4mic_service.py instead as the LEDs and GPIO pins are slightly different.
Install it from your home directory:
cd wyoming-satellite/examples
python3 -m venv --system-site-packages .venv
.venv/bin/pip3 install --upgrade pip
.venv/bin/pip3 install --upgrade wheel setuptools
.venv/bin/pip3 install 'wyoming==1.5.2'In case you use a ReSpeaker USB 4mic array v2.0, additionally install pixel-ring:
.venv/bin/pip3 install 'pixel-ring'The --system-site-packages argument is used to access the pre-installed gpiozero and spidev Python packages. If these are not already installed in your system, run:
sudo apt-get install python3-spidev python3-gpiozeroTest the service with:
.venv/bin/python3 2mic_service.py --helpCreate a systemd service for it:
sudo systemctl edit --force --full 2mic_leds.servicePaste in the following template, and change both /home/pi and the script/run arguments to match your set up:
[Unit]
Description=2Mic LEDs
[Service]
Type=simple
ExecStart=/home/pi/wyoming-satellite/examples/.venv/bin/python3 2mic_service.py --uri 'tcp://127.0.0.1:10500'
WorkingDirectory=/home/pi/wyoming-satellite/examples
Restart=always
RestartSec=1
[Install]
WantedBy=default.target
Save the file and exit your editor.
You can now update your satellite service:
sudo systemctl edit --force --full wyoming-satellite.serviceUpdate just the parts below:
[Unit]
...
Requires=2mic_leds.service
[Service]
...
ExecStart=/home/pi/wyoming-satellite/script/run ... --event-uri 'tcp://127.0.0.1:10500'
...
[Install]
...
Reload and restart the satellite service:
sudo systemctl daemon-reload
sudo systemctl restart wyoming-satellite.serviceYou should see the service get automatically loaded:
sudo systemctl status wyoming-satellite.service 2mic_leds.serviceThey should all be "active (running)" and green.
Try a voice command and see if the LEDs change. Use journalctl to check the logs of services for errors:
journalctl -u 2mic_leds.service -fIf you encounter any issues, you can add the --debug argument to the command line to increase the log level.
To control the brightness of the LEDS, use the --led-brightness argument, which accepts integer numbers from 1 to 31.
Make sure to run sudo systemctl daemon-reload every time you make changes to the service.