Local Voice Control in Home Assistant with Whisper & Piper
Part 4 of 6 in the series Home Assistant without the cloud

Contents
Cloud-dependent voice assistants such as Amazon Alexa, Google Assistant, and Apple Siri rely on remote servers for voice activity detection, automatic speech recognition (ASR), and natural language processing (NLP). This dependency introduces latency, creates vulnerability to internet outages, and raises severe privacy concerns regarding continuous acoustic monitoring. Implementing a fully local voice control architecture in Home Assistant using the Wyoming protocol—combining OpenAI Whisper for Speech-to-Text (STT) and Piper for neural Text-to-Speech (TTS)—enables sub-second voice command execution entirely within the local area network.
1. Architectural Framework: The Wyoming Voice Pipeline
Local voice processing in Home Assistant operates as a modular, decoupled pipeline where audio streams are processed sequentially without external API calls:
- Wake Word Detection (openWakeWord / microWakeWord): Lightweight models constantly analyze microphone input – openWakeWord on the Home Assistant server, to which the satellite continuously streams audio, and microWakeWord directly on local satellite hardware (such as ESP32-S3 devices) – to trigger pipeline activation upon detecting a keyword.
- Speech-to-Text (Whisper): Audio packets are streamed via the Wyoming protocol to a local Whisper container, converting spoken language into structured text strings.
- Intent Recognition (Home Assistant Assist): Natural language parser engines match the transcribed text against defined device entities, areas, and automation aliases.
- Text-to-Speech (Piper): The response string is synthesized into natural-sounding speech audio by Piper and streamed back to the voice satellite speaker.
2. Step-by-Step Installation of Whisper & Piper Add-ons
Deploying local voice services requires provisioning dedicated container add-ons within Home Assistant OS or supervised Docker environments:
- Install the Whisper Add-on: Navigate to Settings > Add-ons > Add-on Store and search for Whisper. During configuration, select the appropriate model size:
tiny-int8orbasefor CPU-only servers (Raspberry Pi 4/5), ormediumfor servers equipped with GPU acceleration or Google Coral TPUs. - Install the Piper Add-on: Search for and install the Piper add-on. In the configuration tab, select the preferred neural voice model (e.g.,
en_US-lessac-mediumfor English) and initialize the service. - Configure the Wyoming Integration: Navigate to Settings > Devices & Services > Add Integration, search for Wyoming Protocol, and add both Whisper (default port
10300) and Piper (default port10200).
3. Step-by-Step Assist Pipeline Configuration
Once the processing engines are integrated, a cohesive voice assistant pipeline must be established:
- Create a Voice Pipeline: Navigate to Settings > Voice Assistants > Add Pipeline. Assign an explicit name such as
Local Assist - English. - Assign Local Engines: Set the Speech-to-Text engine to Whisper, set the Conversation Agent to Home Assistant, and set the Text-to-Speech engine to Piper.
- Enable Local Wake Word: If using wake word detection on the Home Assistant server, select openWakeWord as the wake word engine and choose an activation keyword (such as
Okay NabuorHey Jarvis).
Production-Ready ESPHome Satellite YAML
To capture audio and stream responses without cloud hardware, an ESP32-S3 voice satellite (such as the ESP32-S3-BOX-3) can be provisioned using the following ESPHome configuration:
esphome:
name: "voice-satellite-livingroom"
friendly_name: "Living Room Voice Satellite"
esp32:
board: esp32-s3-devkitc-1
framework:
type: esp-idf
api:
encryption:
key: "GENERATE_YOUR_KEY_HERE"
i2s_audio:
- id: i2s_in
i2s_lrclk_pin: GPIO4
i2s_bclk_pin: GPIO5
- id: i2s_out
i2s_lrclk_pin: GPIO15
i2s_bclk_pin: GPIO16
microphone:
- platform: i2s_audio
id: sat_mic
i2s_audio_id: i2s_in
i2s_din_pin: GPIO6
adc_type: external
pdm: false
speaker:
- platform: i2s_audio
id: sat_speaker
i2s_audio_id: i2s_out
i2s_dout_pin: GPIO17
voice_assistant:
id: va_pipeline
microphone: sat_mic
speaker: sat_speaker
use_wake_word: true
noise_suppression_level: 2
auto_gain: 31dBFS
volume_multiplier: 2.0
4. Summary & Architectural Value
What this tutorial achieves: The successful deployment of a fully autonomous, local voice control architecture in Home Assistant using the Wyoming protocol, Whisper STT, Piper TTS, and ESPHome-based hardware satellites.
Resulting value: Smart home voice interaction becomes completely independent of third-party cloud servers. Private conversations and acoustic telemetry remain isolated within the local network, eliminating profiling and data harvesting risks. Furthermore, removing cloud round-trip routing reduces voice command execution latency to sub-second speeds while ensuring 100% voice control availability during internet outages.
Questions and answers
Does voice control keep working completely during an internet outage?
The chain itself does, from wake word through Whisper and Assist to Piper, because none of its links leaves the local network. A command can only be carried out, however, on devices that Home Assistant controls locally itself; an integration that switches through the manufacturer’s cloud goes down with the internet connection, no matter how well the sentence was recognized. Changing the Whisper model or the Piper voice also needs a connection, because the add-ons download models and voices the first time they are used.
Why does Assist not act on a sentence that Whisper transcribed correctly?
Because Home Assistant’s built-in conversation agent does not interpret free text. It matches the recognized sentence against fixed sentence patterns and against the names of entities, areas and aliases. A sentence that names a lamp and is meant to switch it on fits a pattern; a remark such as “It is too dark in here” fits none, even if Whisper transcribed every word correctly.
Three steps help, in this order:
- Looking at the run. In the voice assistant settings, every run of a pipeline can be traced, including the text Whisper delivered and what Assist made of it. That shows at once whether the fault lies in the recognition or in the matching.
- Adding aliases. An entity may carry several names, and the words actually used in everyday speech (“ceiling lamp”, “big light”) belong exactly there.
- Defining custom sentences. An automation with a sentence trigger reacts to freely chosen wording and can then run any actions, several at once if needed.
Sources
Home Assistant without the cloud
- Zigbee2MQTT vs. ZHA: Building a Highly Reliable Mesh Network in Home Assistant
- ESPHome and ESP32 in Practice: Building Cloud-Free Environmental Sensors
- Presence Detection 2.0: mmWave Radars (LD2410/LD2450) in Lighting Automation
- Local Voice Control in Home Assistant with Whisper & Piper
- WireGuard & Tailscale DMZ: Secure External Access to Home Assistant and Self-Hosted Servers
- Local Energy Management: Integrating PV Inverters and Battery Storage via Modbus TCP