Updated October 2026: I re-tested this on 8 October 2026 against the current
rhasspy/wyoming-piperimage and corrected three things I got wrong in 2023. Piper is text-to-speech, not speech recognition. Port 10200 isn’t a web interface. And voices are now named likeen_GB-alba-medium. The compose file also no longer needs aversionline. The Home Assistant steps are unchanged from the original and I haven’t re-run them on a current release.
Wyoming Piper is the text-to-speech half of a fully local Home Assistant voice assistant, and it runs as one Docker Compose service. Piper is a fast neural text-to-speech system that was first tuned for the Raspberry Pi 4. The Wyoming wrapper lets Home Assistant use it over the network. It supports many languages and voices, and you can hear them on the Piper samples page. The speech-to-text half is Wyoming Whisper.
Prerequisites
You need Docker with the Compose plugin. docker compose version should print a version. I tested on Compose 2.40.3. Installation instructions for your OS are on the Docker website.
Docker Compose file
Save this as compose.yaml in a new directory:
services:
wyoming-piper:
image: rhasspy/wyoming-piper
ports:
- "10200:10200"
volumes:
- ./piper-data:/data
command: ["--voice", "en_GB-alba-medium"]
restart: unless-stopped
What each part does:
imageis the officialrhasspy/wyoming-piperimage. Its entrypoint already sets--uri tcp://0.0.0.0:10200and--data-dir /data, so you only pass the voice.portspublishes Wyoming’s port 10200. Home Assistant connects here.volumeskeeps downloaded voices in./piper-data. A medium voice is about 63 MB.commandsets the default voice. My 2023 post useden-gb-southern_english_female-low. That still works, and I’ve switched toen_GB-alba-mediumbecause medium voices sound better.restart: unless-stoppedbrings the container back after a reboot.
Starting Wyoming Piper
docker compose up -d
docker compose logs -f wyoming-piper
The first start downloads the voice from Hugging Face, which took a few seconds here. Wait for Ready, then press Ctrl+C to leave the logs. docker compose ps should show the container as healthy.
There’s no web interface to open. Port 10200 speaks the Wyoming protocol over TCP, and curl http://localhost:10200 returns nothing. I checked, and it’s the opposite of what my original post said. Newer images do have an opt-in web UI for managing custom voices, switched on with --web-server --web-server-host 0.0.0.0. I haven’t used it.
Test it without Home Assistant
Save the test script from the Whisper post as wyoming_check.py, then run:
python3 wyoming_check.py describe localhost 10200
python3 wyoming_check.py say localhost 10200 en_GB-alba-medium "Wyoming Piper is working."
Mine printed:
tts: piper, 174 available, e.g. ['ar_JO-kareem-low', 'ar_JO-kareem-medium', 'bg_BG-dimitar-medium']
2.0s of audio at 22050 Hz in 0.9s
The script saves the audio as say.raw, which the Whisper container can transcribe. That round trip is the quickest way to prove both halves work before Home Assistant is involved.
Choosing a voice
Voice names follow the pattern language_REGION-name-quality, for example en_GB-alba-medium. The image still accepts the 2023 hyphenated names and maps them across, but the underscore form is the current naming.
Quality is low, medium or high. In my tests low voices produced 16,000 Hz audio and medium voices 22,050 Hz.
The image advertises 174 voices, and you don’t have to download them in advance. Ask for one that isn’t in ./piper-data and Piper fetches it on the first request. When I asked for en_US-lessac-medium, that first request took 3.6 seconds while it downloaded. Later requests took under a second.
Idle, the container used about 230 MiB of RAM. To change the default voice, edit --voice and run docker compose up -d again.
Adding it to Home Assistant
In Home Assistant go to Settings > Devices & Services > Add Integration, search for Wyoming Protocol and enter the IP address of the machine running Docker plus port 10200. Use the host’s IP, not localhost, because inside the Home Assistant container that means Home Assistant itself. Then pick piper as the text-to-speech engine in Settings > Voice assistants.
Piper and Whisper together are everything the local voice pipeline needs, and with the small Whisper model they used about 1 GiB of RAM between them on my test machine. The remainder of the setup is in Home Assistant’s own guide to a local voice assistant.
Troubleshooting
Home Assistant can’t connect
Run nc -zv <docker-host-ip> 10200 from the machine running Home Assistant. If that fails, the problem is the network or a firewall. If it succeeds, check you entered the host’s IP and not localhost.
The browser shows nothing at port 10200
That’s expected. It’s a TCP protocol service, not a web server.
The first reply is slow
If you picked a voice that hasn’t been downloaded yet, the first request waits for the download. Mine took 3.6 seconds. Later ones were fast.
The voice sounds thin
Low-quality voices are 16 kHz. Switch to the medium version of the same voice.
The data folder is owned by root
Docker created the files in piper-data as root on my machine, so deleting them needs sudo.
Can I use a GPU?
There’s a --use-cuda option that needs a GPU-enabled onnxruntime. I haven’t tried it, because the machine I tested on has no GPU, and Piper is fast enough on a CPU that I wouldn’t bother.
Both halves agree
en_GB-alba-medium says “Wyoming Piper is working.” in about two seconds, and small-int8 Whisper hears the same words back. If something breaks later, look at the Home Assistant wiring before you blame either container.
Relevant and supporting posts:
- Wyoming Whisper Docker Compose
- Home Assistant local voice with Whisper and Piper
- Home Assistant HTTPS with Tailscale
Or just hand this page to your agent
If you’d rather not type any of this, paste the following into your coding agent:
Read https://exitcode0.net/posts/wyoming-piper-docker-compose/ and set up Wyoming Piper in Docker Compose on this machine. Before changing anything, run docker compose version and docker ps, check whether port 10200 is already in use, and show me the compose file you plan to write. Ask me which language and voice I want, and don't pick a voice for me. Don't touch my Home Assistant config. Stop once docker compose ps shows the container healthy and tell me the host IP and port to enter in Home Assistant.
The page gives the agent the compose file, the voice naming rules and the test script. Only you know which language you want, which voice sounds right to you and whether port 10200 is free.
Choosing a voice is the fun part, so budget a few minutes at the samples page.
Enjoy. ✌️