Claude
Skills
Sign in
Back

ha-voice

Included with Lifetime
$97 forever

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.

Image & Video

What this skill does


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

Related in Image & Video