ESP32 Projects
Build more ESPHome devices.
With Home Assistant Assist you can control your smart home with your voice - 100% locally without cloud! No data leaves your home, and it works even when the internet is down.
| Component | Function | Local Options |
|---|---|---|
| Wake Word | Listens for activation word | openWakeWord, microWakeWord |
| STT | Speech to text | Whisper, Speech-to-Phrase |
| Intent | Understands commands | HA Conversation, LLM |
| TTS | Text to speech | Piper, Home Assistant Cloud |
| Satellite | Microphone/speaker | ESP32, Voice PE |
| Device | Price | Display | Microphone | Speaker | Wake Word |
|---|---|---|---|---|---|
| ATOM Echo | ~$13 | ❌ | ✅ | ✅ (small) | On-device |
| S3-BOX-3 | ~$50 | ✅ Touch | ✅✅ | ✅ | On-device |
| Voice PE | ~$59 | ✅ | ✅✅ | ✅✅ | On-device |
| CoreS3SE | ~$70 | ✅ Touch | ✅✅ | ✅ | On-device |
# Settings → Add-ons → Add-on Store# Search "Whisper" → Install
# Configuration (Settings tab):model: small # tiny, base, small, medium, largelanguage: en # Your language
# Start add-on# Wait for model download (can take time)# Settings → Add-ons → Add-on Store# Search "Piper" → Install
# Configuration:voice: en_US-lessac-medium # English voice
# Start add-on# Settings → Add-ons → Add-on Store# Search "openWakeWord" → Install → Start
# Supported wake words:# - "Ok Nabu"# - "Hey Jarvis"# - "Alexa"# - "Hey Mycroft"# Settings → Devices & Services → Add Integration
# 1. Search "Wyoming Protocol"# - Whisper should auto-discover# - Click "Configure" → "Submit"
# 2. Piper should also auto-discover# - Click "Configure" → "Submit"
# 3. openWakeWord likewise# - Click "Configure" → "Submit"# Settings → Voice Assistants → Add Assistant
# Name: "Local Assistant"# Language: English
# Conversation agent: Home Assistant# Speech-to-text: Whisper# Text-to-speech: Piper# Wake word: openWakeWord (choose wake word)
# Save# Click "Try pipeline" button# Say: "Turn on the living room light"
# Check:# - Was speech recognized correctly?# - Was command understood?# - Did you hear the response?Price: ~$13
The cheapest voice satellite:
# 1. Go to: https://www.home-assistant.io/voice_control/thirteen-usd-voice-remote/# 2. Click "Connect" in Chrome/Edge# 3. Select COM port# 4. Click "Install Voice Assistant"# 5. Enter WiFi credentials# 6. Device appears in HAsubstitutions: name: living-room-voice friendly_name: "Living Room Voice Assistant" micro_wake_word_model: hey_jarvis
packages: m5stack.atom-echo: url: https://github.com/esphome/firmware files: - voice-assistant/m5stack-atom-echo.yaml refresh: 0s
esphome: name: ${name} friendly_name: ${friendly_name}
wifi: ssid: !secret wifi_ssid password: !secret wifi_passwordBuy: M5Stack, AliExpress
Price: ~$50
Best all-round voice satellite:
# 1. ESPHome → New Device# 2. Name: "bedroom-voice"# 3. Device: ESP32-S3-BOX-3# 4. Add to YAML:
packages: esphome.voice-assistant: url: https://github.com/esphome/firmware files: - voice-assistant/esp32-s3-box-3.yaml refresh: 0s
substitutions: micro_wake_word_model: okay_nabu
esphome: name: bedroom-voice friendly_name: "Bedroom Voice"
wifi: ssid: !secret wifi_ssid password: !secret wifi_password
api: encryption: key: !secret api_keyBuy: Espressif, AliExpress, Amazon
Price: ~$59
Official Home Assistant hardware:
# 1. Connect USB-C power# 2. Follow on-screen instructions# 3. Scan QR code with HA app# 4. Select WiFi network# 5. Assign to room# 6. Done!Buy: Home Assistant Store
| Wake Word | Language | Model |
|---|---|---|
| ”Ok Nabu” | Multi | openWakeWord, microWakeWord |
| ”Hey Jarvis” | English | microWakeWord |
| ”Alexa” | Multi | microWakeWord |
| ”Hey Mycroft” | English | microWakeWord |
# 1. Go to: https://www.home-assistant.io/voice_control/create_wake_word/
# 2. Choose a unique word (3-4 syllables)# - Avoid common words# - Only English supported currently
# 3. Generate training data with Piper# 4. Train model (may take several attempts)# 5. Download and installautomation: # Broadcast to all speakers - alias: "Voice - Good Morning Broadcast" trigger: - platform: time at: "07:00:00" condition: - condition: state entity_id: binary_sensor.workday state: "on" action: - service: tts.speak target: entity_id: tts.piper data: media_player_entity_id: - media_player.living_room_speaker - media_player.kitchen_speaker message: > Good morning! It's 7 o'clock. The temperature outside is {{ states('sensor.outdoor_temperature') }} degrees. {% if states('sensor.rain_probability') | int > 50 %} Remember your umbrella - there's a chance of rain. {% endif %}
# Voice reminder - alias: "Voice - Washing Machine Done" trigger: - platform: state entity_id: binary_sensor.washing_machine_running to: "off" action: - service: tts.speak target: entity_id: tts.piper data: media_player_entity_id: media_player.kitchen_speaker message: "The washing machine is done. Don't forget to empty it."
# Welcome home - alias: "Voice - Welcome Home" trigger: - platform: state entity_id: person.brian to: "home" action: - delay: "00:00:30" - service: tts.speak target: entity_id: tts.piper data: media_player_entity_id: media_player.hallway_speaker message: > Welcome home! It's {{ states('sensor.indoor_temperature') }} degrees inside.# Lights"Turn on the living room light""Turn off all lights""Set the kitchen brightness to 50 percent""Change the bedroom color to blue"
# Climate"What's the temperature?""Set the thermostat to 72 degrees""Turn on the bathroom heater"
# Devices"Turn on the TV""Start the vacuum""Lock the front door"
# Information"What's the weather today?""When does the sun set?""Is anyone home?"
# Scenes"Activate movie night""Good night""I'm leaving home"# configuration.yaml or via UI
intent_script: CustomWelcome: speech: text: "Welcome! What can I help with?"
conversation: intents: CustomWelcome: - "hey [assistant]" - "hello" - "what can you do"type: vertical-stackcards: # Voice status - type: entities title: "🎤 Voice Control" entities: - entity: assist_satellite.living_room_voice name: "Living Room Satellite" - entity: assist_satellite.bedroom_voice name: "Bedroom Satellite" - entity: binary_sensor.whisper_running name: "Whisper Status" - entity: binary_sensor.piper_running name: "Piper Status"
# Test button - type: button name: "Test Voice" tap_action: action: call-service service: tts.speak target: entity_id: tts.piper data: media_player_entity_id: media_player.living_room_speaker message: "Voice control is working!"ESP32 Projects
Build more ESPHome devices.
Automations
Advanced automations.
Last updated: December 2025