🎯

ha-voice

🎯Skill

from nodnarbnitram/claude-code-extensions

VibeIndex|
What it does

ha-voice skill from nodnarbnitram/claude-code-extensions

πŸ“¦

Part of

nodnarbnitram/claude-code-extensions(19 items)

ha-voice

Installation

Add MarketplaceAdd marketplace to Claude Code
/plugin marketplace add github:nodnarbnitram/claude-code-extensions
Install PluginInstall plugin from marketplace
/plugin install cce-core@cce-marketplace
Install PluginInstall plugin from marketplace
/plugin install cce-kubernetes@cce-marketplace # For Kubernetes development
Install PluginInstall plugin from marketplace
/plugin install cce-cloudflare@cce-marketplace # For Cloudflare Workers/AI
Install PluginInstall plugin from marketplace
/plugin install cce-esphome@cce-marketplace # For ESPHome IoT

+ 6 more commands

πŸ“– Extracted from docs: nodnarbnitram/claude-code-extensions
10Installs
3
-
Last UpdatedJan 15, 2026

Skill Details

SKILL.md

"Configure Home Assistant Assist voice control with pipelines, intents, wake words, and speech processing. Use when setting up voice control, creating custom intents, configuring TTS/STT, or building voice satellites. Activates on keywords: Assist, voice control, wake word, intent, sentence, TTS, STT, Piper, Whisper, Wyoming."

Overview

# 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

```yaml

# 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_word

```

Why this matters: The pipeline connects all components (STT, TTS, intent, conversation agent) into a single voice workflow.

Creating Custom Intents

```yaml

# 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:

```yaml

tts:

- platform: piper

language: en_GB

voice: jenny_dioco

```

Cloud Option - OpenAI:

```yaml

tts:

- platform: tts

service: google_translate_say # or openai, google cloud

language: en

```

Why this matters: TTS gives voice feedback; local options require no cloud dependencies.

Configuring Speech-to-Text (STT)

Local Option - Faster Whisper:

```yaml

stt:

- platform: faster_whisper

language: en

```

Cloud Option - Google Cloud Speech:

```yaml

stt:

- platform: google_cloud

language_code: en-US

```

Why this matters: STT converts spoken commands to text; local options provide privacy.

Critical Rules

βœ… Always Do

  • βœ… Use custom_sentences/ directory for intent configuration (not deprecated sentences/)
  • βœ… 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: 1 in custom_sentences YAML files
  • ❌ Don't mix old sentences/ directory with new custom_sentences/ (use custom_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:

```yaml

intents:

TurnOn:

data:

- sentences:

- "turn on light.bedroom"

- "turn on light.kitchen"

```

βœ… Correct - Using slot lists:

```yaml

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:

```yaml

sentences:

- "turn on {name:list}" # Matches list value, captures as 'name' slot

```

Lists

List matching provides slot values:

```yaml

lists:

room:

- "bedroom"

- "kitchen"

- "living room"

```

Optional Groups

Square brackets make words optional:

```yaml

sentences:

- "[please] turn on the {name:list}"

- "activate [the] {device:list}"

```

Wildcards

Wildcard slots capture any text:

```yaml

sentences:

- "remind me {reminder:text}" # Captures any text as 'reminder'

- "set a timer for {duration:text}"

```

Combined Pattern Example

```yaml

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 devices
  • HassToggle - Toggle switches/lights
  • HassOpenCover / HassCloseCover - Control covers
  • HassSetClimate - Control climate (heat/cool)

Information Intents

  • HassGetState - Get entity state
  • HassGetHistory - Query automation history

Home Control Intents

  • HassArmAlarm / HassDisarmAlarm - Arm/disarm alarms
  • HassLockDoor / HassUnlockDoor - Control locks

Custom Intents

You create additional intents in custom_sentences/ by defining new intent blocks:

```yaml

intents:

CustomIntentName:

data:

- sentences: [...]

```

Wake Word Configuration

openWakeWord (Local)

```yaml

conversation:

engine: openai

# Enable openWakeWord

binary_sensor:

- platform: openwakeword

models:

- alexa # "Alexa, help"

- hey_google # "Hey Google, ..."

- hey_siri

```

Porcupine (Local, Paid)

```yaml

binary_sensor:

- platform: porcupine

access_key: !secret porcupine_key

keywords:

- hey_home_assistant

```

Voice 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

```yaml

# 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.8

```

Why 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:

```yaml

assist_pipeline:

pipelines:

- language: de # German

name: Deutsche Pipeline

tts_engine: tts.piper # Set voice per language

```

Performance Tuning

STT (Faster Whisper):

```yaml

stt:

- platform: faster_whisper

language: en

model: base # tiny, base, small, medium, large

acceleration: gpu # CPU or GPU

```

TTS (Piper):

```yaml

tts:

- platform: piper

voice: en_GB-jenny

rate: 11025 # Audio sample rate

volume_normalize: true

```

Conversation Agent Integration

Built-in Agent:

```yaml

conversation:

engine: home_assistant

```

OpenAI Agent:

```yaml

conversation:

engine: openai

api_key: !secret openai_api_key

model: gpt-4

```

Custom Conversation Agent:

```yaml

conversation:

engine: custom

module: custom_components.my_agent

```

Common Intent Patterns

Device Control Pattern

```yaml

intents:

TurnOn:

data:

- sentences:

- "turn on [the] {name:list}"

- "[please] activate {name:list}"

lists:

name: light_names

```

Climate Control Pattern

```yaml

intents:

SetClimate:

data:

- sentences:

- "set [the] {room:list} [thermostat] to {temp:number} degrees"

- "make it {temp:number} in [the] {room:list}"

lists:

room: room_names

```

Query Pattern

```yaml

intents:

GetState:

data:

- sentences:

- "what is the temperature [in the] {room:list}"

- "is [the] {name:list} on"

lists:

room: room_names

name: device_names

```

Testing 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)

  1. 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:

```yaml

# 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 phrasing

```

TTS/STT Engine Not Working

Symptoms: "Engine not available" error in Assist

Solution:

```yaml

# 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 engines

```

Wake Word Not Triggering

Symptoms: Binary sensor stays off despite noise

Solution:

```yaml

# 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 separately

```

Voice Satellite Connection Issues

Symptoms: ESP32 disconnects from WiFi or Assist pipeline

Solution:

```bash

# Check WiFi signal strength in ESPHome logs

# Reduce WiFi distance or add access point

# Update ESPHome firmware

esphome run voice_assistant.yaml --upload-speed 115200

```

Dependencies

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](https://www.home-assistant.io/voice_control/)
  • [Assist Pipeline Configuration](https://www.home-assistant.io/integrations/assist_pipeline/)
  • [Intent Recognition Guide](https://developers.home-assistant.io/docs/voice/intent-recognition)
  • [Conversation Integration](https://www.home-assistant.io/integrations/conversation/)

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)