🎙️ Home Assistant Voice PE
Your Voice PE, answered by your Companion. Companion Voice connects the Home Assistant Voice Preview Edition to a Companion that runs on your own hardware, answers with your local model, and remembers what matters to you through Companion Memory.
The guided setup is built in your browser. The keys it generates are never sent to Companion Intelligence.
Status: available. Run it with Docker on any computer on your network, or install Home Assistant Voice from the Companion Hub store, where it is listed as version 1.1.0 and needs Companion Hub 0.2.41 or newer. The guided setup at ha.ci.computer covers both paths and checks your install at the end.
What it adds to Home Assistant
Companion Voice runs a small Wyoming server on TCP port 10700. Home Assistant’s built-in Wyoming Protocol integration turns it into three services, which you can use together or on their own:
| Service | Shows up in Home Assistant as | What it does |
|---|---|---|
companion-conversation | Conversation agent | Answers with your local model, grounded in Companion Memory |
companion-stt | Speech-to-text | Transcribes through the speech server you choose |
companion-tts | Text-to-speech | Speaks the reply through the speech server you choose |
The simplest setup uses only companion-conversation and keeps Home Assistant’s own faster-whisper and Piper add-ons for speech. No custom components are needed.
How a question travels
The Voice PE hears its wake word on the device. Home Assistant’s Assist pipeline turns speech into text and hands it to the voice bridge, which asks the Companion API for an answer, drawing on your memory first.
flowchart LR
PE["Voice PE<br/>wake word · mics · speaker"] --> HA["Home Assistant Assist"]
HA -->|"Wyoming, TCP 10700"| VB["Voice bridge"]
VB -->|"HTTP 8080"| API["Companion voice API"]
API --> LLM["Local model<br/>Ollama or Hub inference"]
API --> SP["Speech server<br/>optional"]
API <-->|"context · recall · save"| CM["Companion Memory"]Set it up
Companion Hub
Install from the store
In Companion Hub, open the store, search for Home Assistant Voice and install it. It needs Companion Hub 0.2.41 or newer. Hub connects it to the models it already runs, so there is nothing to configure.
Approve Companion Memory
Hub asks you to approve a key for the app. The key reaches only your memory, to recall and to save conversations. It cannot delete anything. See API keys for how scopes work.
Continue in Home Assistant
Follow Connect Home Assistant below, using your Hub’s address as the host.
Connect Home Assistant
Add the Wyoming Protocol integration
Open Home Assistant: add Wyoming . Enter the host from the step above and port 10700. Home Assistant lists companion-stt, companion-tts and companion-conversation.
Create the assistant
In Voice assistants , add an assistant called Companion:
| Setting | Simplest setup | Fully local or cloud speech |
|---|---|---|
| Conversation agent | companion-conversation | companion-conversation |
| Speech-to-text | faster-whisper (add-on) | companion-stt |
| Text-to-speech | Piper (add-on) | companion-tts |
| Wake word | On the device | On the device |
Give it to the Voice PE
On the Voice PE’s device page , set Assistant to Companion. Say the wake word and ask something only your Companion would know.
Choose how it speaks
| Setup | Speech-to-text and text-to-speech | Leaves your home |
|---|---|---|
| Simplest (recommended) | Home Assistant’s faster-whisper and Piper add-ons | Nothing |
| Fully local voice | Whisper and Kokoro in a bundled speaches container, or Hub’s speech engines | Nothing |
| Cloud speech | OpenAI Whisper and TTS | Audio for transcription and speech only; answers stay local |
Companion Memory
With memory connected, every answer starts by fetching your profile context and the memories most relevant to what you asked, within a 1.5 second budget. They reach the model as reference data, never as instructions. After the answer, the exchange is saved as a conversation from ha-voice-pe, grouped by Home Assistant’s conversation, so it shows up in your memory like any other chat.
- Scope: the key needs only the
memoryscope. Under Hub, the connect flow creates exactly that. For Docker, create one in Companion Memory under Settings, API keys, as described in Connect Companion Memory. - Saving is optional: set
CI_MEMORY_SAVE_TURNS=falseto recall without saving. - Resilient: if memory is slow or offline, the assistant still answers, without it.
Configuration
The Docker .env from ha.ci.computer sets everything. The variables you are most likely to change:
| Variable | Default | What it controls |
|---|---|---|
CI_MODEL | ollama:llama3.2 | The model that answers. Small models reply fastest. |
LANGUAGES | en | Languages offered to Home Assistant |
SYSTEM_INSTRUCTIONS | Concise assistant | How your Companion speaks |
CI_MEMORY_URL, CI_MEMORY_API_KEY | empty | Companion Memory address (ending in /api behind its gateway) and key |
STT_BASE_URL, TTS_BASE_URL | empty | An OpenAI-compatible speech server, for Companion speech |
CI_TTS_VOICE | alloy | Voice for Companion speech, for example af_heart with Kokoro |
WYOMING_ZEROCONF | false | Let Home Assistant discover the bridge by itself (needs host networking) |
Check your setup
The last step at ha.ci.computer asks your server what it is connected to and shows each part: the API, your key, the model, speech and memory. From any computer on your network you can ask the same thing:
curl http://<host>:8080/health
curl -H "Authorization: Bearer $MASTER_API_KEY" http://<host>:8080/v1/statusUnder Companion Hub, use the Voice API key from the app’s page in Hub as MASTER_API_KEY, and the address where your Hub exposes the app’s API in place of <host>:8080.
Troubleshooting
Home Assistant cannot connect
Wyoming is plain TCP, not a web address. Enter only the IP and port 10700, and make sure no firewall blocks it. From the Home Assistant host, nc -vz <ip> 10700 should succeed.
The Voice PE lights up but never answers Run the check. A failing language model usually means the model is still downloading or was never pulled.
Speech-to-text returns nothing With fully local voice, download the speech models once (the setup page lists the two commands). With the simplest setup, choose faster-whisper and Piper in the assistant instead of the companion services.
Answers do not use my memory
The key needs the memory scope, and the address must end in /api when you reach Companion Memory through its gateway. The check shows the exact error.
The web check fails but curl works Browsers block an https page from calling a plain http address on your network. Serve the API over https with Tailscale Serve or a Cloudflare Tunnel, or trust the curl result.