
Ha Voice
- 212 installs
- 14 repo stars
- Updated April 20, 2026
- nodnarbnitram/claude-code-extensions
Wire Claude Code voice commands into Home Assistant so spoken intents trigger automations, device control, and agent workflows from the smart home stack.
About
Claude Code extension skill for Home Assistant voice: map spoken commands to automations, entity actions, and agent tasks so developers can ship hands-free control and conversational smart-home workflows.
- Home Assistant hooks
- Voice intents
- Device control
- Agent triggers
- Smart-home bridge
Ha Voice by the numbers
- 212 all-time installs (skills.sh)
- +2 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #580 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/nodnarbnitram/claude-code-extensions --skill ha-voiceAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 212 |
|---|---|
| repo stars | ★ 14 |
| Last updated | April 20, 2026 |
| Repository | nodnarbnitram/claude-code-extensions ↗ |
What it does
Wire Claude Code voice commands into Home Assistant so spoken intents trigger automations, device control, and agent workflows from the smart home stack.
Files
Home Assistant Voice Control
Configure Assist pipelines, custom intents, wake words, speech processing, and voice satellites for local voice control.
Quick Start
Setting up Assist Pipeline
# configuration.yaml
assist_pipeline:
pipelines:
- language: en
name: Default Pipeline
stt_engine: faster_whisper # Local STT
tts_engine: tts.piper # Local TTS
conversation_engine: conversation.home_assistant
wake_word_entity: binary_sensor.wake_wordWhy this matters: The pipeline connects all components (STT, TTS, intent, conversation agent) into a single voice workflow.
Creating Custom Intents
# custom_sentences/en/turn_on.yaml
language: en
version: 1
intents:
TurnOn:
data:
- sentences:
- "turn on the [area] {name:list}"
- "turn on {name:list}"
- "[please] activate {name:list}"
lists:
name: light_names
lists:
light_names:
- "bedroom light"
- "kitchen overhead"
- "living room"Why this matters: Custom sentence patterns enable natural voice commands tailored to your home.
Configuring Text-to-Speech (TTS)
Local Option - Piper:
tts:
- platform: piper
language: en_GB
voice: jenny_diocoCloud Option - OpenAI:
tts:
- platform: tts
service: google_translate_say # or openai, google cloud
language: enWhy this matters: TTS gives voice feedback; local options require no cloud dependencies.
Configuring Speech-to-Text (STT)
Local Option - Faster Whisper:
stt:
- platform: faster_whisper
language: enCloud Option - Google Cloud Speech:
stt:
- platform: google_cloud
language_code: en-USWhy this matters: STT converts spoken commands to text; local options provide privacy.
Critical Rules
✅ Always Do
- ✅ Use
custom_sentences/directory for intent configuration (not deprecatedsentences/) - ✅ Test intents with Assist Developer Tools before deploying
- ✅ Use
{name:list}syntax for slot-based entity matching - ✅ Configure both STT and TTS engines in the same pipeline
- ✅ Verify wake word entity exists before enabling in pipeline
- ✅ Document intent lists so voice commands are discoverable
❌ Never Do
- ❌ Don't hardcode entity IDs in sentence patterns (use lists and slots)
- ❌ Don't forget
version: 1in custom_sentences YAML files - ❌ Don't mix old
sentences/directory with newcustom_sentences/(usecustom_sentences/only) - ❌ Don't enable Piper TTS without adequate disk space (models are 100+ MB)
- ❌ Don't use wildcard
{query}for every slot (makes intents ambiguous) - ❌ Don't skip testing with Assist Developer Tools
Common Mistakes
❌ Wrong - Hardcoded entity IDs:
intents:
TurnOn:
data:
- sentences:
- "turn on light.bedroom"
- "turn on light.kitchen"✅ Correct - Using slot lists:
intents:
TurnOn:
data:
- sentences:
- "turn on [the] {name:list}"
lists:
name: light_names
lists:
light_names:
- "bedroom"
- "kitchen"Why: Lists are dynamic and can be generated from Home Assistant entities programmatically.
Sentence Pattern Syntax
Slots
Named slots match list values:
sentences:
- "turn on {name:list}" # Matches list value, captures as 'name' slotLists
List matching provides slot values:
lists:
room:
- "bedroom"
- "kitchen"
- "living room"Optional Groups
Square brackets make words optional:
sentences:
- "[please] turn on the {name:list}"
- "activate [the] {device:list}"Wildcards
Wildcard slots capture any text:
sentences:
- "remind me {reminder:text}" # Captures any text as 'reminder'
- "set a timer for {duration:text}"Combined Pattern Example
intents:
TurnOn:
data:
- sentences:
- "[please] [turn on | switch on | activate] [the] {area} {name:list}"
- "[please] turn on {name:list}"
- "activate {name:list} [in the] {room:list}"
lists:
name: light_names
room: room_names
Reminder:
data:
- sentences:
- "remind me {reminder:text}"
- "[please] [create | set] a reminder [for me] [to] {reminder:text}"
lists:
light_names:
- "bedroom light"
- "kitchen overhead"
- "living room lamps"
room_names:
- "bedroom"
- "kitchen"
- "living room"Why this matters: Flexible patterns enable natural phrasing while maintaining intent recognition accuracy.
Built-In Intents Reference
Home Assistant provides default intents:
Navigation Intents
HassTurnOn/HassTurnOff- Control devicesHassToggle- Toggle switches/lightsHassOpenCover/HassCloseCover- Control coversHassSetClimate- Control climate (heat/cool)
Information Intents
HassGetState- Get entity stateHassGetHistory- Query automation history
Home Control Intents
HassArmAlarm/HassDisarmAlarm- Arm/disarm alarmsHassLockDoor/HassUnlockDoor- Control locks
Custom Intents
You create additional intents in custom_sentences/ by defining new intent blocks:
intents:
CustomIntentName:
data:
- sentences: [...]Wake Word Configuration
openWakeWord (Local)
conversation:
engine: openai
# Enable openWakeWord
binary_sensor:
- platform: openwakeword
models:
- alexa # "Alexa, help"
- hey_google # "Hey Google, ..."
- hey_siriPorcupine (Local, Paid)
binary_sensor:
- platform: porcupine
access_key: !secret porcupine_key
keywords:
- hey_home_assistantVoice Satellite Setup
Hardware Requirements
- Microphone: INMP441 (I2S digital) or similar
- Speaker: MAX98357A amplifier or similar
- Board: ESP32-S3, ESP32-S3-BOX-3 preferred
- Connectivity: WiFi required
ESPHome Voice Assistant Config
# ESPHome device
packages:
voice_assistant: !include packages/voice_assistant.yaml
# Or inline configuration:
i2s_audio:
i2s_lrclk_pin: GPIO33
i2s_bclk_pin: GPIO34
i2s_mclk_pin: GPIO32
microphone:
- platform: i2s_audio
id: mic
adc_type: external
i2s_din_pin: GPIO35
pdm: false
speaker:
- platform: i2s_audio
id: speaker
dac_type: external
i2s_dout_pin: GPIO36
mode: mono
voice_assistant:
microphone: mic
speaker: speaker
noise_suppression_level: 2
auto_gain: 80dB
volume_multiplier: 0.8Why this matters: Voice satellites extend Assist to multiple rooms with local processing.
Speech Processing Configuration
Language Support
Full Support (20+ languages): en, de, fr, it, es, nl, pl, pt, ru, sv, tr, uk, zh, ja, ko, and more
Partial Support (40+ languages): Regional variants and additional languages with varying STT/TTS availability
Community Support (80+ languages): Community-contributed sentence templates
Language Config:
assist_pipeline:
pipelines:
- language: de # German
name: Deutsche Pipeline
tts_engine: tts.piper # Set voice per languagePerformance Tuning
STT (Faster Whisper):
stt:
- platform: faster_whisper
language: en
model: base # tiny, base, small, medium, large
acceleration: gpu # CPU or GPUTTS (Piper):
tts:
- platform: piper
voice: en_GB-jenny
rate: 11025 # Audio sample rate
volume_normalize: trueConversation Agent Integration
Built-in Agent:
conversation:
engine: home_assistantOpenAI Agent:
conversation:
engine: openai
api_key: !secret openai_api_key
model: gpt-4Custom Conversation Agent:
conversation:
engine: custom
module: custom_components.my_agentCommon Intent Patterns
Device Control Pattern
intents:
TurnOn:
data:
- sentences:
- "turn on [the] {name:list}"
- "[please] activate {name:list}"
lists:
name: light_namesClimate Control Pattern
intents:
SetClimate:
data:
- sentences:
- "set [the] {room:list} [thermostat] to {temp:number} degrees"
- "make it {temp:number} in [the] {room:list}"
lists:
room: room_namesQuery Pattern
intents:
GetState:
data:
- sentences:
- "what is the temperature [in the] {room:list}"
- "is [the] {name:list} on"
lists:
room: room_names
name: device_namesTesting with Developer Tools
1. Go to Developer Tools → Assist 2. Enter test sentence: "turn on the bedroom light" 3. Check:
- ✅ Intent matched correctly
- ✅ Slots extracted properly
- ✅ Audio plays (if TTS configured)
4. Debug mismatches by:
- Reviewing sentence patterns
- Checking list values
- Verifying slot names
Troubleshooting
Intent Not Recognized
Symptoms: Voice command doesn't match any intent
Solution:
# Check custom_sentences directory structure
ls -R config/custom_sentences/
# Verify YAML syntax
cat config/custom_sentences/en/custom.yaml
# Test in Assist Developer Tools with exact phrase
# Adjust sentence patterns to match expected phrasingTTS/STT Engine Not Working
Symptoms: "Engine not available" error in Assist
Solution:
# Verify engine is configured
service: tts.piper # Must exist
# Check dependencies installed
pip install piper-tts # for Piper
pip install faster-whisper # for Whisper
# Restart Home Assistant to load enginesWake Word Not Triggering
Symptoms: Binary sensor stays off despite noise
Solution:
# Verify entity_id is correct
service: homeassistant.update_entity
target:
entity_id: binary_sensor.wake_word
# Check binary sensor configuration
# Review noise levels and model sensitivity
# Test microphone separatelyVoice Satellite Connection Issues
Symptoms: ESP32 disconnects from WiFi or Assist pipeline
Solution:
# Check WiFi signal strength in ESPHome logs
# Reduce WiFi distance or add access point
# Update ESPHome firmware
esphome run voice_assistant.yaml --upload-speed 115200Dependencies
Required
| Component | Version | Purpose |
|---|---|---|
| Home Assistant | 2024.1+ | Assist platform |
| Faster Whisper | 0.5+ | Local STT engine |
| Piper TTS | 1.0+ | Local TTS engine |
Optional
| Component | Version | Purpose |
|---|---|---|
| OpenWakeWord | 0.3+ | Wake word detection |
| Porcupine | Latest | Premium wake word |
| ESPHome | 2024.1+ | Voice satellite devices |
Official Documentation
- Home Assistant Voice Control
- Assist Pipeline Configuration
- Intent Recognition Guide
- Conversation Integration
Setup Checklist
Before using voice commands, verify:
- [ ] Assist pipeline configured with STT, TTS, and conversation engine
- [ ]
custom_sentences/en/directory created with intent definitions - [ ] Sentence patterns tested in Assist Developer Tools
- [ ] Wake word entity exists (if using wake word)
- [ ] Microphone and speaker working (test via Developer Tools)
- [ ] Intent lists contain correct entity aliases
- [ ] Language setting matches your configuration
- [ ] All YAML syntax is valid (no tabs, proper indentation)
Home Assistant Voice Control
Configure Assist pipelines, custom intents, wake words, and voice satellites for local voice control.
| Status | Production |
| Version | 1.0.0 |
| Last Updated | 2025-12-31 |
| Confidence | 5/5 |
| Key Docs | Voice Control Docs |
What This Skill Does
Provides expert guidance for Home Assistant Assist voice control capabilities, including:
- Assist pipeline configuration (connecting STT, TTS, intents, and conversation agents)
- Custom intent creation with sentence patterns, slots, and lists
- Wake word setup (openWakeWord, Porcupine)
- Speech processing configuration (local Piper TTS + Faster Whisper STT, or cloud alternatives)
- Voice satellite setup for ESPHome devices (ESP32-S3, I2S microphones, speakers)
- Multi-language support and performance tuning
- Integration with OpenAI, Anthropic, and custom conversation agents
Core Capabilities
- Configure Assist pipelines with custom STT/TTS engines
- Create natural voice commands using sentence patterns, slots, and lists
- Set up local wake words (Alexa, Hey Google, Hey Siri or custom)
- Build voice satellites with ESPHome hardware (INMP441 mic, MAX98357A speaker)
- Configure TTS engine selection (Piper local, Google Cloud, OpenAI)
- Configure STT engine selection (Faster Whisper local, Google Cloud, Whisper API)
- Debug intent matching with Assist Developer Tools
- Optimize performance for single-board computers
Auto-Trigger Keywords
Primary Keywords
Exact terms that strongly trigger this skill:
- Assist pipeline
- Voice control
- Wake word
- Custom intent
- Sentence pattern
- STT (speech-to-text)
- TTS (text-to-speech)
- Piper
- Whisper
- Voice satellite
Secondary Keywords
Related terms that may trigger in combination:
- Voice assistant
- Voice command
- Wake detection
- Speech processing
- Intent recognition
- Conversation agent
- Wyoming protocol
- ESPHome voice
- Audio pipeline
- Voice feedback
Error-Based Keywords
Common error messages that should trigger this skill:
- "No matching intent"
- "Engine not found"
- "TTS engine not available"
- "STT engine not available"
- "Wake word entity not found"
- "Pipeline configuration error"
- "Sentence pattern syntax error"
Known Issues Prevention
| Issue | Root Cause | Solution |
|---|---|---|
| Intent not matching | Sentence pattern too strict or list values incorrect | Use optional groups [] and verify list values in Developer Tools |
| "Engine not available" | TTS/STT component not installed or configured | Install component via integrations, verify platform field matches |
| Wake word not triggering | Model sensitivity too high or microphone not connected | Test microphone separately, adjust model selection, check WiFi signal |
| Voice satellite disconnects | WiFi instability or ESPHome OTA conflicts | Move router closer, update ESPHome firmware, disable OTA during testing |
| Slot extraction failing | Slot name mismatch between sentences and lists | Verify {slot:list} matches list definition, use Developer Tools to test |
When to Use
Use This Skill For
- Setting up or troubleshooting Assist pipelines
- Creating custom voice commands with sentence patterns
- Configuring TTS/STT engines (local or cloud)
- Building ESPHome voice satellites
- Debugging intent recognition issues
- Optimizing voice control performance
- Integrating custom conversation agents
Don't Use This Skill For
- General Home Assistant installation (use home-assistant-core skill)
- YAML validation for non-voice components
- Cloud service setup (use service-specific documentation)
Quick Usage
# Complete working Assist pipeline example
assist_pipeline:
pipelines:
- language: en
name: Default Pipeline
stt_engine: faster_whisper
tts_engine: tts.piper
conversation_engine: conversation.home_assistant
wake_word_entity: binary_sensor.wake_word
# Minimal custom intent
custom_sentences/en/custom.yaml:
---
language: en
version: 1
intents:
TurnOn:
data:
- sentences:
- "turn on {name:list}"
lists:
name:
- "bedroom light"
- "kitchen light"Token Efficiency
| Approach | Estimated Tokens | Time |
|---|---|---|
| Manual documentation reading | 8,000+ | 30+ minutes |
| With This Skill | 2,000-3,000 | 5-10 minutes |
| Savings | 60-75% | 75% faster |
File Structure
ha-voice/
├── SKILL.md # Detailed instructions, patterns, troubleshooting
├── README.md # This file - discovery and quick reference
└── references/ # Supporting documentation
└── intent-patterns.md # Common intent configuration patternsDependencies
No external Python packages required. Skill uses Home Assistant's native components:
| Component | Version | Purpose | Required |
|---|---|---|---|
| Home Assistant | 2024.1+ | Core voice control platform | Yes |
| Faster Whisper | 0.5+ | Local speech-to-text | Optional (recommended) |
| Piper TTS | 1.0+ | Local text-to-speech | Optional (recommended) |
| OpenWakeWord | 0.3+ | Local wake word detection | Optional |
Official Documentation
- Home Assistant Voice Control
- Assist Pipeline Integration
- Intent Recognition Guide
- Conversation Integration
- Piper TTS Documentation
- Faster Whisper Documentation
Related Skills
ha-dashboard- Configure Lovelace UI for voice control testingha-automations- Create automations triggered by voice intentsesphome-config-helper- Configure ESP32 voice satellites
---
License: MIT