How to Set Up a Local Voice Assistant With Home Assistant

Home Assistant can run a voice assistant with nothing leaving the house: Whisper or Speech-to-Phrase for speech, Piper for replies, a local LLM for the brain.

A voice assistant is a microphone with someone else’s servers attached. Home Assistant’s Assist pipeline does the same job without the servers: a local speech-to-text engine turns your voice into text, Home Assistant works out what you want, and a local text-to-speech engine speaks the answer back. The project’s documentation is plain about the result. “Assist can run entirely on your own hardware”, and “Your spoken commands never leave your home” (Home Assistant).

TL;DR

  • The local pipeline has four parts. The docs describe it as “a microphone hears you, a local speech-to-text engine turns your voice into text, Home Assistant figures out what you want, and a local text-to-speech engine speaks the answer back” (Home Assistant).
  • Nothing goes to an external server. For the local speech options the documentation states: “No data is sent to external servers for processing” (Home Assistant).
  • Two speech-to-text engines, different jobs. Speech-to-Phrase is “a close-ended speech model. It transcribes what it knows”, with “Extremely fast transcription even on a Home Assistant Green or Raspberry Pi 4 (under one second)”, but it handles only the commands it knows. Whisper “will try to transcribe everything” and takes “around 8 seconds” on a Raspberry Pi 4 against “under a second” on an Intel NUC (Home Assistant).
  • Piper does the talking. It is “a fast, local neural text-to-speech system that sounds great and is optimized for the Raspberry Pi 4”, and on a Pi with medium quality models “it can generate 1.6s of voice in a second” (Home Assistant).
  • Open-ended answers need a brain. Home Assistant’s Ollama integration points at a local server such as http://localhost:11434 and can hand control of exposed entities to the model (Home Assistant, Ollama API docs).
  • The paid alternative sends your audio. The cloud pipeline says so itself: “Only the audio is sent to the cloud for processing” (Home Assistant). It costs €7.50 a month or €75.00 a year (Nabu Casa).

What local actually changes

It is worth being precise about the difference, because it is narrower than the marketing around either side suggests. With the cloud pipeline, “Everything Assist actually does in your home, opening lights, locking doors, running automations, still happens on your own Home Assistant” (Home Assistant). The commands run locally either way. What the cloud option changes is where the audio goes to be turned into text and speech, and what you pay for the privilege.

The local pipeline replaces those two stages with software on your own hardware. The speech engines ship as Home Assistant apps, which means the install needs the Home Assistant Operating System, since “For running all together, it needs to have the Home Assistant Operating System running” (Home Assistant).

The plumbing between those apps is the Wyoming protocol. The integration “connects external voice services to Home Assistant using a small protocol”, which lets Assist use local “speech-to-text”, “text-to-speech”, and “wake-word-detection” systems (Home Assistant). In practice you install the Whisper and Piper apps, start them, and Home Assistant discovers both through Wyoming, which means “The Wyoming, Piper, and Whisper apps for Home Assistant (formerly known as add-ons) are used to create a fully local voice pipeline” (Home Assistant).

Step one: choose the speech-to-text engine

Speech-to-Phrase is the fast, narrow option. It is a close-ended model that only understands the voice commands Home Assistant supports, so shopping lists, naming a timer and broadcasts are not usable out of the box. That is a fair trade if your assistant is a light switch and a thermostat controller, because the transcription is effectively instant on cheap hardware.

Whisper is the general option. It transcribes open-ended speech, which is what makes it usable with an LLM behind it. The cost is latency on weak hardware. The documentation’s own guidance is that Whisper suits you when “You have powerful hardware at home” and “You plan to extend your voice set-up beyond simple home control. For example, by pairing your assistant with an LLM-based agent” (Home Assistant).

The Whisper app is not just OpenAI Whisper. Its backends are faster-whisper, Hugging Face transformers, sherpa-onnx (parakeet only) and onnx-asr (GigaAM only), plus funasr for Chinese-family languages (Whisper app docs). The app’s recommendations route English to the parakeet model through the sherpa backend, Chinese, Cantonese, Japanese and Korean to SenseVoice through funasr, Russian to GigaAM through onnx-asr, and everything else to faster-whisper.

Two settings matter more than the rest. The default model setting “auto” selects the tiny compressed model on ARM devices such as the Raspberry Pi 4 and the base compressed model everywhere else (Whisper app docs). And the language should be set to an explicit code rather than left on auto, because auto-detecting the language on every request costs a lot of speed (Whisper app docs).

Models are fetched from the internet the first time you use them. After that, the app’s offline option turns off the update check so the add-on stays local and starts faster (Whisper app docs, Whisper app config).

Step two: pick the voice

Piper is the local text-to-speech engine, and its voices come in four quality tiers: x_low at 16Khz, low at 16Khz, medium at 22.05Khz and high at 22.05Khz, running from smallest and fastest to slowest and best sounding. The app’s own hardware note is worth repeating: on a Raspberry Pi 4, up to the medium tier runs at a usable speed, and the low and x-low voices are noticeably faster when audio quality does not matter (Piper app docs).

The default voice is en_US-lessac-medium, and the naming scheme is language, region, name and quality, for example en_US-lessac-medium (Piper app config). Voices download automatically from the Piper voice collection on the Hugging Face Hub, and custom voices can be dropped into the shared Piper directory or uploaded through the app’s web interface (Piper app docs).

There is a second backend, OmniVoice, and the documentation is careful about it. It is experimental, considerably higher quality, supports many more languages and can clone a voice from a short recording, but it is much slower and “really needs a desktop or server CPU”. It is not part of the app image, so selecting it downloads a model of several GB, which can take a while before the app becomes available (Piper app docs).

Step three: give it something to think with

The default conversation agent in Home Assistant handles commands, which is all a voice assistant needs for turning lights on (Home Assistant). For anything open-ended, the Ollama integration is the local route. It takes the URL of a running Ollama server, such as http://localhost:11434, and a model name, and the models pull down automatically during setup (Home Assistant).

The integration can also let the model drive the house. That switch is called “Control Home Assistant”, and it works only with models that support Tools, and only against entities you have exposed to Assist. The documentation’s advice on both limits is blunt: “we recommend exposing fewer than 25 entities”, and “smaller models are more likely to make mistakes than larger models” (Home Assistant).

Two other options decide how much work the machine does. Context window size is the number of tokens the model can take as input, and “Home Assistant defaults to 8k, which is larger than the default value in Ollama Server (2k)” (Home Assistant). Max history messages sets how many messages are kept per conversation, and a value of 0 means no limit, with older messages dropped once the limit is hit (Home Assistant).

Step four: the hardware and the microphone

Home Assistant Green is an official box sized for the job: a quad-core ARM processor running at 1.8 GHz, 4 GB of RAM, 32 GB of eMMC storage, two USB 2.0 ports and a Gigabit Ethernet port, at $199 or 179€ (Home Assistant Green). The Green pricing note says the dollar figure excludes tax while the euro figure includes it, and both are recommended MSRP.

For listening, the local guide asks for “your phone with the Home Assistant app, or a voice activated device” (Home Assistant). For a wake word, the Wyoming integration supports openWakeWord alongside the speech engines (Home Assistant).

You are not locked to one machine. “Wyoming services can run on another device on your local network”, and the docs give the reason: “This can be useful for resource-intensive services such as Whisper, allowing speech-to-text processing to run on a more powerful computer while Home Assistant runs on another device” (Home Assistant). A Raspberry Pi 4 running the house and a desktop running Whisper is a reasonable split.

When the cloud is the better answer

There is no argument against the cloud option on speed. “The fastest way to get a great-sounding voice assistant up and running is to use the speech-to-text and text-to-speech voices included with a Home Assistant Cloud subscription” (Home Assistant). The servers do the heavy lifting, so you can use Assist without needing extra hardware, which is the practical answer for anyone whose local hardware is a Raspberry Pi 4 and whose local Whisper command takes about eight seconds.

The price is €7.50 a month or €75.00 a year, tax not included, with a 31-day free trial and no card details required. The subscription includes remote access, offsite backups, voice control for Alexa and Google Home, and “Voice Processing (STT/TTS)” (Nabu Casa).

So the honest framing is a straight trade. Cloud buys latency and voice quality, and charges you for it in money and in audio leaving the house. Local buys silence from outside servers, and charges you in hardware and in model choices.

What this means

The local voice assistant is not a research project. Every piece of it is software you install yourself, with configuration knobs, and the documentation publishes real numbers for the hardware you are likely to own: under a second for Speech-to-Phrase on a Green or Pi 4, around eight seconds for Whisper on a Pi 4, 1.6 seconds of synthesised speech per second from Piper on a Pi.

What the local route gives up is convenience. Cloud transcription is faster, cloud voices sound better, and you do not have to think about which backend handles which language. What it keeps is the audio. In a house, that is the part that matters, because a voice assistant is a device that listens to rooms when people think nobody is recording.

The practical split that falls out of the documentation is simple. Use Speech-to-Phrase and Piper for commands on a small box. Add Whisper and a local model when you want conversation, and run the heavy piece on another machine if the box you own cannot keep up.

The bottom line

Home Assistant can run a voice assistant where the audio never leaves the house, and the pieces are all free. The floor is a Raspberry Pi 4 or a Home Assistant Green with Home Assistant Operating System, the Whisper or Speech-to-Phrase app, the Piper app, and the Wyoming integration to join them up. The ceiling is whatever you point an Ollama model at.

Choose local if the audio staying home is the point and you can live with a few seconds of latency on a Raspberry Pi. Choose the €7.50 cloud subscription if you want it fast and good-sounding, and you are comfortable with your voice leaving the house to get there.