Build a Home Assistant Voice Satellite with Raspberry Pi and the Wyoming Protocol
This site already covers running Home Assistant itself on a Raspberry Pi, and separately covers Home Assistant's Matter/Thread border router role. This project fills the piece in between: a dedicated, always-listening voice satellite that sits in a room, hears a wake word, and streams your speech to Home Assistant's local voice pipeline for transcription and response — the same category of device as a commercial smart speaker, but fully local, with no cloud account, no subscription, and no recordings leaving your network by default. Home Assistant's Wyoming protocol is what makes this practical: it's a lightweight, purpose-built network protocol for streaming audio between satellites and voice processing services, and it's what the official Home Assistant Voice Preview Edition hardware uses internally — this project builds the same architecture on a Pi you already have.
How the Pieces Fit Together
A voice satellite doesn't do speech recognition itself. It listens locally for a wake word, then streams raw audio over the network to whichever service does the heavy lifting — typically Whisper (speech-to-text) and Piper (text-to-speech) running as Home Assistant add-ons or standalone containers on a more capable machine, like the same Pi or server already running your Home Assistant instance. The satellite's only jobs are wake word detection, audio capture, and audio playback, which is exactly why a Pi 4 with a cheap USB or HAT-based microphone array is enough hardware — none of the actual AI inference happens on the satellite itself.
Flashing and Initial Setup
- Flash Raspberry Pi OS Lite (64-bit) to the microSD card using Raspberry Pi Imager, pre-configuring hostname, Wi-Fi, and SSH in the imager's advanced options so you can go headless from first boot.
- Boot the Pi, SSH in, and update the system: sudo apt update && sudo apt full-upgrade -y.
- If using a ReSpeaker HAT, install its drivers per the manufacturer's install script, then reboot and confirm the microphone array shows up with arecord -l.
Assembling the Hardware
- Mount the ReSpeaker 2-Mic HAT onto the Pi's 40-pin GPIO header, seating it fully.
- Connect the small speaker to the HAT's onboard 3.5mm jack, or to a USB audio output if using a USB speaker instead.
- Wire the push button between a spare GPIO pin and ground for a manual mute/wake trigger — useful as a physical override when you don't want the satellite listening, and as a fallback if wake-word detection is unreliable in a noisy room.
- Wire the status LED (through its resistor) to another spare GPIO pin, used later to give visual feedback for listening/processing/done states.
- Fit everything into a case with an opening for the microphone array and speaker, or a 3D printed enclosure using this site's guide to designing electronics enclosures if you want something custom to a shelf or wall mount.
Installing the Wyoming Satellite Software
The wyoming-satellite project (from the Home Assistant / Rhasspy ecosystem) handles wake word detection and audio streaming. Install it in a Python virtual environment to keep it isolated from system packages:
sudo apt install -y python3-venv python3-pip portaudio19-dev git clone https://github.com/rhasspy/wyoming-satellite.git cd wyoming-satellite python3 -m venv .venv .venv/bin/pip3 install -e '.[all]'Wake word detection runs through wyoming-openwakeword, a lightweight local wake-word engine that ships with several pre-trained wake words ("Hey Jarvis," "OK Nabu," and others) and supports training custom ones. Run it alongside the satellite service:
script/run --uri 'tcp://0.0.0.0:10400' --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' --wake-uri 'tcp://127.0.0.1:10400' --wake-word-name 'ok_nabu' --led-brightness 100Adjust the ALSA device names to match what arecord -l and aplay -l report for your specific HAT or USB audio hardware — this is the step most people get stuck on, since ALSA device naming isn't fully consistent across HAT models.
Adding the Satellite to Home Assistant
- In Home Assistant, install the Whisper and Piper add-ons (or point to standalone Wyoming-protocol containers running elsewhere on your network) from Settings > Add-ons > Add-on Store, under the Voice section.
- Go to Settings > Devices & Services > Add Integration > Wyoming Protocol, and enter the satellite Pi's IP address and the port from the command above (10400).
- Home Assistant auto-discovers the satellite's capabilities and creates a voice assistant entity tied to it. Assign it to Assist's default pipeline, or create a dedicated pipeline if you want different wake words or voices per room.
- Say the wake word from within earshot of the satellite and confirm the LED/mic activity responds and a spoken command reaches Home Assistant's Assist pipeline.
Making It a Real Appliance
Set the wyoming-satellite and wyoming-openwakeword processes up as systemd services so they start on boot and restart automatically if they crash — a voice satellite that needs a manual SSH restart after every power blip isn't one anyone in the house will actually use. Wire the GPIO LED into the satellite's event hooks (most Wyoming satellite setups expose a simple script hook for listening/processing/done states) so there's clear visual feedback, which matters more than it sounds like it would for something people are expected to trust and use daily.
Multiple Satellites, One Pipeline
Because Whisper and Piper run centrally and satellites just stream audio, this scales cleanly to multiple rooms — a Pi Zero 2 W with a USB microphone in the kitchen, this Pi 4 build in the living room, and the official Voice Preview Edition hardware in a bedroom can all point at the same Home Assistant voice pipeline. Each is a lightweight, disposable client; all the real processing lives in one place, which also means the more capable your central speech-to-text hardware, the better every satellite in the house performs, without touching the satellites themselves.
Related Guides
- Running Home Assistant on a Raspberry Pi 4
- Raspberry Pi Security Camera/NVR with Frigate
- Home Assistant on Raspberry Pi: Complete Server Setup
- Zigbee and Z-Wave on Raspberry Pi: Adding Zigbee2MQTT and Z-Wave JS to Home Assistant
- Setting Up a Raspberry Pi as a Matter and Thread Border Router for Your Smart Home
- Designing Home Assistant Dashboards: Lovelace Layouts, Custom Cards, and Views That Don't Fight You
- Build a Wall-Mounted Maker Dashboard: Aggregating Your Print Farm, Security, and Home Server on One CYD Panel
- DIY Home Security System: Combining Raspberry Pi, ESP32 Sensors, and Flipper Zero