Skip to main content

wyoming-whisper

Speech-to-text for Home Assistant's Assist pipeline. Runs on CPU.

Why this and not WhisperX

They do different jobs, and only one of them can talk to Home Assistant.

Home Assistant's Assist pipeline speaks the Wyoming protocol — a small, line-oriented TCP protocol — not HTTP. WhisperX is a FastAPI service, so HA cannot drive it without a bridge.

wyoming-whisperWhisperX
Jobshort voice commandslong recordings
Speaker labelsnoyes (diarization)
Runs onCPUGPU
Spoken to byHome AssistantDecree, via the transcription flow

Running it on CPU is deliberate. The GPU is already holding the chat model and the embedding model; a GPU speech model here would evict them every time you spoke.

Configuration

Both settings are global — set them once in .env.shared and they reach the container at start:

VariableDefaultNotes
EXIST_MODEL_STTbasetiny, base, small, medium, large-v3
EXIST_MODEL_STT_LANGUAGEenPinning beats auto-detect on short commands

On a few CPU cores, base is near-instant and good enough for commands; small is noticeably more accurate and roughly 2–3× the latency; medium is too slow for conversational voice on most homelab hardware.

Connecting it to Home Assistant

There is no web UI and no <slug>.<domain> hostname — Wyoming is raw TCP, so there is nothing for Caddy to front. You add it inside Home Assistant:

Settings → Devices & Services → Add Integration → Wyoming Protocol

FieldValue
Hostwyoming-whisper
Port10300

Then build a pipeline under Settings → Voice assistants, pairing it with wyoming-piper for the reply.

Verify

./existential.sh run wyoming-whisper test

The first start downloads the model before the socket opens — allow a couple of minutes, and watch docker logs wyoming-whisper if the test fails immediately.