Self-HostingLLMAI

Home Assistant Voice Control with Ollama: Local Assist, Whisper and Piper (Linux, Windows, Mac)

Before you start

  • 20 min read

Boxes marked Run in terminal are what you type; plain text explains why. Check what you need first

What you get in one minute#

Home Assistant's Assist can run entirely on your own hardware: Whisper turns your voice into text, an Ollama model on your network decides what to do and switches your devices, and Piper speaks the answer, with no cloud account in the voice path.

Home Assistant official logo

Logo: the official Home Assistant project (brands repository on GitHub)

It suits a home where voice commands should stay private. The catch is the model: Home Assistant only lets Ollama models with the tools badge control devices, and small models make mistakes. This guide picks a model, wires the services together and lists what still touches the internet.

WhatValue (official docs and releases, read October 2026)
Home Assistant2026.10.4, released October 2026 (Apache-2.0)
Ollamav0.40.13, released October 2026 (MIT)
Whisper and Piper imagesrhasspy/wyoming-whisper:3.8.1 and rhasspy/wyoming-piper:2.5.2 (both MIT)
Time neededAbout 45 minutes plus model downloads (our estimate, not measured)
PortsOllama 11434, Whisper 10300, Piper 10200 (all TCP, local network only); Home Assistant 8123
Official docsOllama integration and local voice assistant

At a glance:

  • What runs where: Home Assistant on one machine; Ollama, Whisper and Piper on the same or another machine.
  • Model rule: only models that support tools can control Home Assistant (the docs say so). Start small, expose few entities.
  • Speech: Whisper (speech-to-text) and Piper (text-to-speech) speak the Wyoming protocol to Home Assistant.
  • Platforms: Ollama runs on Linux, Windows and macOS. Home Assistant Container needs Linux; on Windows or Mac use Home Assistant OS in a virtual machine.
  • Privacy: after the downloads, the voice path stays on your network.
  • Related guides: Ollama in 2026, the older Home Assistant install guide and Speaches Whisper.

How it fits together#

You speak to a browser, phone or voice device. Home Assistant passes the audio to Whisper, the text to Ollama, runs the tool call the model asks for, and gives the reply to Piper.

Flow diagram in five steps: you speak, Home Assistant starts Assist, Whisper on port 10300 turns the audio into text, the Ollama model on port 11434 picks a tool, Home Assistant runs the tool call on exposed devices, and Piper on port 10200 turns the reply into audio you hear

Drawn for this guide from the official Home Assistant, Ollama and Wyoming docs. After the one-time downloads, nothing here leaves your network.

Before you start#

You need a working Home Assistant, a machine for Ollama, and one for Whisper and Piper. One computer can do all three jobs.

PartWhat it needs (official docs)
Home AssistantHome Assistant OS (recommended by the docs), or Container on Linux with Docker Engine 23.0.0 or later. The docs say Docker Desktop will not work for the Container install, and Container has no apps.
OllamaLinux; Windows 10 22H2 or newer; macOS 14 or newer (Apple M series use CPU and GPU, Intel Macs CPU only)
Whisper and PiperEither the Whisper and Piper apps (Home Assistant OS) or the Docker images below (Linux amd64 or arm64)
Speed (Home Assistant docs)Whisper takes about 8 seconds per command on a Raspberry Pi 4 and under 1 second on an Intel NUC

Our older install guide installs Home Assistant on Ubuntu. On Windows or Mac the official pages offer Home Assistant OS in a virtual machine only; we do not repeat that. Check your tools:

Linux#

Run in terminalbash
docker --version
docker compose version
curl --version

Windows (PowerShell)#

Run in terminalpowershell
docker --version
docker compose version
curl.exe --version

Mac (Terminal)#

Run in terminalbash
docker --version
docker compose version
curl --version

Checklist:

  • [ ] Home Assistant runs and you are an administrator
  • [ ] You know the address of the Ollama machine (<ollama-host> below)
  • [ ] Ports 11434, 10300 and 10200 are free
  • [ ] A backup of your Home Assistant configuration exists
  • [ ] For the HTTPS section only: a DNS name for Home Assistant, and ports 80 and 443 free

Tested by DIY Lab Hub: not yet. Every command and setting comes from the official docs, READMEs and release files read in October 2026. We did not run them.

Step 1: Install Ollama and pull a model that supports tools#

We start with llama3.2: its page shows the tools badge and the default download is 2.0 GB. More install details are in our Ollama guide.

Linux#

Run in terminalbash
curl -fsSL https://ollama.com/install.sh | sh
ollama pull llama3.2
ollama list

Windows (PowerShell)#

Run in terminalpowershell
irm https://ollama.com/install.ps1 | iex
ollama pull llama3.2
ollama list

Ollama installs without Administrator rights and needs at least 4 GB of disk for the program itself.

Mac (Terminal)#

The download page uses the same script as Linux (the .dmg from the same page also works):

Run in terminalbash
curl -fsSL https://ollama.com/install.sh | sh
ollama pull llama3.2
ollama list

Check it worked. ollama list shows llama3.2, and curl http://localhost:11434 answers Ollama is running (the answer our Ollama guide shows; use curl.exe in PowerShell).

Tip: Never type a model name ending in :cloud. Those run on Ollama's servers, so your voice text would leave your network.

Step 2: Let Home Assistant reach Ollama#

Ollama listens on 127.0.0.1:11434 only (official FAQ). If Home Assistant Container runs on the same Linux machine (host networking), http://localhost:11434 works and you can skip this step. Otherwise Home Assistant is on another machine or in a virtual machine, so Ollama must listen on the network.

Linux#

Run in terminalbash
sudo systemctl edit ollama.service

In the editor add these two lines, save, then reload and restart:

File contentini
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Run in terminalbash
sudo systemctl daemon-reload
sudo systemctl restart ollama

Ollama has no login. Allow only Home Assistant's address (ufw is one example; use your own firewall):

Run in terminalbash
sudo ufw allow from <home-assistant-ip> to any port 11434 proto tcp

Windows (PowerShell)#

The docs use the settings screen: quit Ollama from the tray, search "environment variables" in Settings, choose "Edit environment variables for your account", create OLLAMA_HOST with the value 0.0.0.0:11434, click OK, start Ollama again. A one-line equivalent (not from the docs):

File contentpowershell
[Environment]::SetEnvironmentVariable("OLLAMA_HOST", "0.0.0.0:11434", "User")

Restart Ollama afterwards. If Windows asks about the firewall, allow private networks only.

Mac (Terminal)#

Run in terminalbash
launchctl setenv OLLAMA_HOST "0.0.0.0:11434"

Then quit and start the Ollama app again.

Check it worked. From the machine that runs Home Assistant (or any other computer on the network), replace <ollama-host> with the Ollama machine's address:

Run in terminalbash
curl http://<ollama-host>:11434/api/tags

On Windows use curl.exe. The answer is JSON that lists llama3.2.

Tip: Our Ollama guide has a section on putting a login in front of Ollama. Home Assistant's Ollama setup has an optional API Key field for exactly that case.

Step 3: Run Whisper and Piper (speech in, speech out)#

Home Assistant calls both over the Wyoming protocol. Pick one route:

  • Home Assistant OS: install the Whisper and Piper apps from Settings > Apps > Install app. Home Assistant finds them by itself. You can skip the rest of this step.
  • Container, or Whisper and Piper on another machine: use Docker, below, with the versions pinned from the official repositories.

The Whisper model and Piper voice download on first start, so it takes longer.

Linux#

Run in terminalbash
mkdir -p ~/docker_volumes/wyoming-voice/whisper/data ~/docker_volumes/wyoming-voice/piper/data ~/docker_volumes/wyoming-voice/backups
cd ~/docker_volumes/wyoming-voice
cat > docker-compose.yml << 'EOF'
services:
  whisper:
    image: rhasspy/wyoming-whisper:3.8.1
    container_name: wyoming-whisper
    restart: unless-stopped
    command: --model base-int8 --language en
    environment:
      ORT_DISABLE_TELEMETRY: "1"
    ports:
      - "10300:10300"
    volumes:
      - ./whisper/data:/data
  piper:
    image: rhasspy/wyoming-piper:2.5.2
    container_name: wyoming-piper
    restart: unless-stopped
    command: --voice en_US-lessac-medium
    ports:
      - "10200:10200"
    volumes:
      - ./piper/data:/data
EOF
docker compose up -d
docker compose ps
docker compose logs --tail=50 whisper piper

base-int8 is the Home Assistant app's default model on non-ARM devices; use tiny-int8 on a Raspberry Pi. Piper voices are named <language>_<REGION>-<name>-<quality>, and medium is the compromise the docs mention.

Windows (PowerShell)#

The images are Linux images (amd64, arm64). The READMEs do not mention Docker Desktop, so treat this route as untested.

Codepowershell
New-Item -ItemType Directory -Force "$HOME\docker_volumes\wyoming-voice\whisper\data", "$HOME\docker_volumes\wyoming-voice\piper\data", "$HOME\docker_volumes\wyoming-voice\backups" | Out-Null
Set-Location "$HOME\docker_volumes\wyoming-voice"
@'
services:
  whisper:
    image: rhasspy/wyoming-whisper:3.8.1
    container_name: wyoming-whisper
    restart: unless-stopped
    command: --model base-int8 --language en
    environment:
      ORT_DISABLE_TELEMETRY: "1"
    ports:
      - "10300:10300"
    volumes:
      - ./whisper/data:/data
  piper:
    image: rhasspy/wyoming-piper:2.5.2
    container_name: wyoming-piper
    restart: unless-stopped
    command: --voice en_US-lessac-medium
    ports:
      - "10200:10200"
    volumes:
      - ./piper/data:/data
'@ | Set-Content -Encoding utf8 docker-compose.yml
docker compose up -d
docker compose ps
docker compose logs --tail=50 whisper piper

Mac (Terminal)#

Same commands and file as Linux (Docker Desktop, untested for the same reason).

Check it worked. docker compose ps lists both containers. The images carry a health check, so docker ps shows healthy once the model is loaded; the first start can take minutes. The READMEs publish no expected log text, so read the logs for errors. Then test the ports:

Run in terminalbash
timeout 3 bash -c '</dev/tcp/127.0.0.1/10300' && echo "whisper port open"
timeout 3 bash -c '</dev/tcp/127.0.0.1/10200' && echo "piper port open"

That is for Linux. On Windows use Test-NetConnection 127.0.0.1 -Port 10300 (then 10200). On Mac use nc -vz 127.0.0.1 10300 (then 10200).

Tip: If Home Assistant Container runs on the same Linux machine, publish the ports on loopback only: "127.0.0.1:10300:10300" and "127.0.0.1:10200:10200". Wyoming has no login, so nobody else on the network should reach it.

Tip: There is no GPU image on Docker Hub. The README says to build Dockerfile.gpu yourself (about 10.7 GB, NVIDIA only). Do not write rhasspy/wyoming-whisper:gpu.

Step 4: Connect everything in Home Assistant#

This step is in the Home Assistant web page, so it is the same on every system. First check from your own computer.

Linux#

Before you add anything, confirm Ollama answers from the Home Assistant machine:

Run in terminalbash
curl http://<ollama-host>:11434/api/tags

Windows (PowerShell)#

Run in terminalpowershell
curl.exe http://<ollama-host>:11434/api/tags
Test-NetConnection <voice-host> -Port 10300

<voice-host> is the machine that runs Whisper and Piper.

Mac (Terminal)#

Run in terminalbash
curl http://<ollama-host>:11434/api/tags
nc -vz <voice-host> 10300

Now in the browser:

  1. Settings > Devices & services > Add integration > Ollama. Enter the URL http://<ollama-host>:11434 (or http://localhost:11434 for the same-host setup) and the model llama3.2. The docs say a missing model is downloaded during setup.
  2. If you did not use the apps: Add integration > Wyoming Protocol, host <voice-host>, port 10300 (Whisper). Add it again with port 10200 (Piper).
  3. Open the Ollama agent's settings (the gear icon) and turn Control Home Assistant on. Leave Think before responding off and the context window at its 8k default.
  4. Settings > Voice assistants > Add assistant. Name it, pick your language, choose the Ollama agent as the conversation agent, your Whisper engine for speech-to-text and Piper for text-to-speech.
  5. In the three-dot menu of that assistant, turn on Prefer handling commands locally. Home Assistant's own sentence matching then answers simple commands without calling the model, and Ollama handles the rest.

Check it worked. The assistant shows up in Voice assistants with all three parts filled in. If the list of assistants is empty, add assist_pipeline: to configuration.yaml (the Assist troubleshooting page says so).

Tip: The docs suggest two Ollama entries on one model: one without control for chat, one with control for the house.

Step 5: Expose a few devices and test#

Nothing is exposed by default. The docs recommend fewer than 25 entities for local models.

Linux#

In Home Assistant: Settings > Voice assistants > Expose tab, pick a few lights and switches with clear names and areas, such as "Office light" in the area "Office". Do not expose locks or garage doors to a small model.

Windows (PowerShell)#

Same in the browser on your PC.

Mac (Terminal)#

Same in the browser on your Mac.

Test without a microphone first:

  1. Settings > Voice assistants, open your assistant, choose Debug.
  2. Top right icon > select your assistant > Run text pipeline.
  3. Type Turn off the office lights and select Run. The debug view shows which agent answered, the tool call and the result.

Check it worked. The light changes state, and the debug view shows a tool call. Then click the Assist icon at the top right of the dashboard and speak. A browser allows the microphone only on http://localhost and https:// pages (MDN: getUserMedia() needs a secure context), so plain http://<ip>:8123 cannot use it. The HTTPS section below fixes that; the Companion app and voice devices are alternatives.

Which models can control the house#

Home Assistant reads the tools capability that Ollama publishes. The docs: only models that support tools may control Home Assistant, and smaller ones make more mistakes. Each Ollama library page shows its badges. We read these on 2026-10-30:

ModelBadges on its pageSizesNotes
llama3.2tools1b, 3bDefault 2.0 GB. Our start
llama3.1tools8b, 70b, 405bDefault 4.9 GB. A step up
mistraltools7b4.4 GB. The docs' own example
qwen3tools, thinking0.6b to 235bDefault 5.2 GB, qwen3:4b 2.5 GB. See issue #167154
qwen3.5vision, tools, thinking0.8b to 122bCheck the size you pull
gemma3vision270m to 27bNo tools badge: cannot control devices

The tools filter (ollama.com/search?c=tools) changes often, so check it on the day. We give no ranking: the docs do not rank models and issue reports are mixed.

To try another model, pull it and change the Model field in the Ollama entry:

Run in terminalbash
ollama pull llama3.1

What stays local and what needs the internet#

The voice path is on your network. These parts still call out, mostly once:

PartNeeds the internet whenAfterwards
Docker images, Home AssistantYou pull images or updateNothing for voice
OllamaInstall and ollama pull. Cloud models (:cloud) and web search use Ollama's serversLocal models work offline. OLLAMA_NO_CLOUD=1 disables cloud features
WhisperFirst start downloads the model from Hugging FaceSince release 3.8.0 a downloaded model loads from disk. --local-files-only forbids downloads
PiperVoices download from huggingface.co/rhasspy/piper-voices on first use. 2.4.3 sent ONNX Runtime telemetry; 2.5.1 turned it offVoices load from disk
Home Assistant analyticsOnly if you opt inOff by default

For local-only mode on Linux, add this line under [Service] with systemctl edit ollama.service, then restart:

File contentini
Environment="OLLAMA_NO_CLOUD=1"

Ollama's log then shows Ollama cloud disabled: true. On Windows and Mac set the same variable the way Step 2 sets OLLAMA_HOST.

The proof: after the first start, disconnect the server from the internet and repeat the Step 5 test. We did not run it. Other integrations, such as weather, have their own internet needs.

Put it behind HTTPS (with or without Traefik)#

This is for Home Assistant Container on a Linux server with a domain; it makes the browser microphone work. Skip it if you use only the Companion app or localhost. Home Assistant OS has its own options (not covered). Windows and Mac: Linux only.

Either way, tell Home Assistant to trust the proxy. Since 2026.8 this is in the UI: Settings > System > Network > HTTP server, turn on Trust X-Forwarded-For and add the proxy under Trusted proxies. Saving restarts Home Assistant and an administrator must confirm within 5 minutes. Without it, proxied requests are blocked.

With Traefik#

Home Assistant Container runs with network_mode: host, and the Traefik docs we read do not say how Docker labels work for such containers. So we use a file-provider route instead. On a server with Traefik v3 and an https entrypoint, add ha.yml to the folder set in providers.file.directory:

File contentyaml
http:
  routers:
    homeassistant:
      rule: "Host(`ha.<your-domain>`)"
      entryPoints:
        - https
      tls: {}
      service: homeassistant
  services:
    homeassistant:
      loadBalancer:
        servers:
          - url: "http://<ha-host-ip>:8123"

<ha-host-ip> is the server's LAN address. Add Traefik's address, as Home Assistant sees it, to Trusted proxies (we did not test which address that is).

Check it worked. curl -I https://ha.<your-domain>/ returns an HTTP status line over HTTPS.

Without Traefik: Caddy#

Caddy gets Let's Encrypt certificates for a public domain by itself, or makes a local one with tls internal. Save this as ~/docker_volumes/caddy/docker-compose.yml (caddy:2.11.7 is the latest release read in October 2026). Host networking lets Caddy reach Home Assistant on 127.0.0.1:

File contentyaml
services:
  caddy:
    image: caddy:2.11.7
    container_name: caddy
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./data:/data
      - ./config:/config

The Caddyfile next to it, for a public domain:

File contenttext
ha.example.com {
    reverse_proxy 127.0.0.1:8123
}

For a name used at home only, use tls internal:

File contenttext
ha.home.arpa {
    tls internal
    reverse_proxy 127.0.0.1:8123
}

Start it, and add 127.0.0.1 as the trusted proxy in Home Assistant:

Run in terminalbash
mkdir -p ~/docker_volumes/caddy/data ~/docker_volumes/caddy/config
cd ~/docker_volumes/caddy
docker compose up -d
curl -I https://ha.example.com/

For a local certificate, each device must trust Caddy's root. Copy it out:

Run in terminalbash
docker exec caddy find /data -name root.crt
docker cp caddy:<path-from-find> ./caddy-root.crt

Install caddy-root.crt as a trusted root on each device (Windows: Trusted Root Certification Authorities; macOS: Keychain Access, Always Trust; Linux: your CA store). These device steps are not from the Caddy docs.

Tip: A certificate error usually means the Caddyfile name differs from the DNS record. Let's Encrypt needs ports 80 and 443.

Security and testing#

A model now makes decisions for you, so limit what it can do.

ControlHow
Expose the minimumEntities are opt-in. Fewer than 25, no locks or garage doors for a small model
Ollama and Wyoming have no loginKeep ports 11434, 10300 and 10200 on your LAN; firewall them to Home Assistant's address; never forward them on the router
Whose permissionsIn the assistant's settings, Acts as user picks the Home Assistant user; the docs say it can only do what that user may do
Piper web UIOff by default and has no authentication. Do not enable it unless you set --web-server-allow
SecretsNo tokens in Compose files. For Whisper's --hass-token, use WYO_WHISPER_HASS_TOKEN_FILE

Quick tests on Linux after each change:

Run in terminalbash
cd ~/docker_volumes/wyoming-voice
docker compose ps
docker compose logs --tail=100 whisper piper
curl http://<ollama-host>:11434/api/tags

On Windows run the same docker commands in PowerShell and curl.exe. On Mac use Terminal.

Common mistakes#

These come from the docs' warnings, the issue trackers and common AI assistant answers.

MistakeWhy it happensDo this instead
Using a model without the tools badgeIssue #154192 (closed) shows gemma3:12b does not support tools; #140441 shows "Unexpected error during intent recognition"Pick a model with the badge, or turn Control off
Turning on Think before responding with qwen3Issue #167154 (open): tool calls planned in the thinking text never runLeave it off (the default); test with llama3.2 first
Exposing every entityThe docs warn of slower matching and a bigger promptExpose fewer than 25 entities
Leaving Ollama on 127.0.0.1It binds to loopback by default (FAQ)Set OLLAMA_HOST (Step 2) and firewall the port
Running Ollama on a laptop that sleepsIssue #187424 (open): about 2 minutes of hanging when the server is unreachableUse an always-on machine; test with curl first
Retrying a failed Ollama setupIssue #163232 (open): one user fixed it by deleting all Ollama entries and restartingRemove the failed entry, restart, add it once
Docker Desktop for Home Assistant ContainerThe docs say it will not workUse Home Assistant OS in a VM, or Linux with Docker Engine
Old or unpinned Whisper and Piper imagesWhisper before 3.8.0 boot-looped offline (#92, #93); Piper 2.4.3 sent telemetry (#64)Pin 3.8.1 and 2.5.2
AI assistants: inventing rhasspy/wyoming-whisper:gpuThe GPU image is not on Docker Hub (#115, #70)Build Dockerfile.gpu, as the README says
AI assistants: adding ollama: to configuration.yamlCopied YAML habits; the integration is UI-onlyUse Add integration > Ollama

Tip: When a command fails, open the assistant's Debug view first. It shows whether speech-to-text, the model or the tool call failed.

Tip: If Whisper mishears device names, add entity aliases (Home Assistant docs). Whisper can also read the names itself with --hass-token, which needs a long-lived token.

Tip: Home Assistant's own sentences handle "turn on the kitchen light" without the model when Prefer handling commands locally is on. That is faster and uses no GPU.

Troubleshooting#

ProblemSolution
does not support toolsThe model lacks the tools badge. Pull another one (llama3.2, llama3.1)
"Unexpected error during intent recognition"Generic message. Open Debug, then check Ollama with curl http://<ollama-host>:11434/api/tags and ollama ps
Adding the Ollama entry failsCheck the URL (http://, port 11434) with curl; remove old failed entries and restart (#163232)
The reply is very slowollama ps: 100% CPU means no GPU. Choose a smaller model
No voice reply, text worksSettings > System > Network: Local Network URL to Automatic
Whisper restarts in a loop with no internetUse 3.8.1; with models in /data, add WYO_WHISPER_LOCAL_FILES_ONLY: "true"
The browser microphone does nothingPlain HTTP on an IP address. Use HTTPS or localhost
A new Piper voice does not appearReload the Piper integration (Piper README)
No assistants listedAdd assist_pipeline: to configuration.yaml and restart

Logs: docker compose logs --tail=100 whisper piper; Ollama on Linux journalctl -u ollama --no-pager --follow --pager-end; on Mac cat ~/.ollama/logs/server.log; on Windows explorer %LOCALAPPDATA%\Ollama.

Known bugs (open, October 2026)#

  • Issue #187424: no request timeout when the Ollama server is unreachable; the pipeline hangs about 2 minutes.
  • Issue #167154: qwen3 with thinking on may plan tool calls that never execute. One report on 2026.4.0.
  • Issue #163232: the first Ollama setup can fail with an "invalid" address; deleting entries and restarting helped one user.
  • Wyoming #115 and #70: GPU image tags are not published to Docker Hub.

Updates and backups#

Update. Read the release notes, change the tags in docker-compose.yml, then:

Run in terminalbash
cd ~/docker_volumes/wyoming-voice
docker compose pull
docker compose up -d
docker compose logs --tail=100 whisper piper

Home Assistant Container updates the same way from its own Compose folder (the docs advise stop_grace_period: 60s). On Linux, update Ollama by running the installer from Step 1 again; our Ollama guide has the details.

Back up. The models and voices are in whisper/data and piper/data. Keep them: with --local-files-only you never download again.

Run in terminalbash
cd ~/docker_volumes/wyoming-voice
tar -czf "backups/wyoming-voice-$(date +%F).tar.gz" whisper piper docker-compose.yml

Run it at 03:00 with crontab -e (Linux and Mac): 0 3 * * * cd ~/docker_volumes/wyoming-voice && tar -czf "backups/wyoming-voice-$(date +\%F).tar.gz" whisper piper docker-compose.yml. Back up Home Assistant's configuration folder separately.

On Windows:

Codepowershell
Compress-Archive -Path "$HOME\docker_volumes\wyoming-voice\whisper","$HOME\docker_volumes\wyoming-voice\piper","$HOME\docker_volumes\wyoming-voice\docker-compose.yml" -DestinationPath "$HOME\docker_volumes\wyoming-voice\backups\wyoming-voice-$(Get-Date -Format yyyy-MM-dd).zip"

Schedule it with Task Scheduler (Create Basic Task, daily, 03:00, program powershell.exe).

Restore test. Unpack one archive into a new empty folder, never over the live one, and check that the models are there:

Run in terminalbash
mkdir -p /tmp/restore-test && tar -xzf backups/wyoming-voice-<date>.tar.gz -C /tmp/restore-test
ls /tmp/restore-test/whisper/data

Performance and resources#

  • Speech speed (Home Assistant docs): Whisper needs about 8 seconds per command on a Raspberry Pi 4 and under 1 second on an Intel NUC. Piper makes about 1.6 seconds of speech per second on a Pi with medium voices.
  • Model memory: the download sizes above are a floor. A larger context window (default 8k) suits bigger homes; a smaller one lowers Ollama's RAM use.
  • Keep alive: the default -1 keeps the model loaded. Set seconds to free the memory after use.
  • Whisper: bigger models are more accurate but slower. Start with base-int8 (tiny-int8 on a Pi).
  • Monitor: docker stats for Whisper and Piper; ollama ps for the model and whether it sits on the GPU or CPU.
  • Faster commands: turn on Prefer handling commands locally and expose few entities.

We measured nothing ourselves; the numbers are the projects' own.

FAQ#

Can the voice path really run without the internet? After the downloads, yes. The table in "What stays local" lists what downloads once.

Do I need a GPU? The docs do not require one. A GPU speeds up answers.

Which model should I use? Start with llama3.2 or llama3.1. Only models with the tools badge can control devices.

Can Whisper and Piper run on another machine? Yes. The Wyoming docs say so; add the Wyoming Protocol integration with that machine's address and port.

Can I use the Speaches guide's server instead? No. Speaches offers an OpenAI-style API; Home Assistant talks Wyoming, so this guide uses the Wyoming Whisper image.

Can I use my phone as the microphone? Yes, with the Companion app on Android or Apple devices, or a voice device such as the Voice Preview Edition.

Sources#

Checked against the official docs on 2026-10-30.