If you’re struggling to get micro_wake_word working on an ESP32-S3 board—especially one with a built-in PDM microphone—and nothing is being detected despite everything looking correct, you’re not alone.
The mic might work fine for voice_assistant, but micro_wake_word never triggers. This is a known issue with some ESP32-S3 boards and how they handle internal audio buffering.
Thankfully, this has been solved thanks to @fabio-garavini in GitHub issue #6582, who shared the right config and ESPHome version that work.
The Fix (Overview)
You’ll use:
• ESPHome 2024.11.3
• esp32s3box board config (even on XIAO or similar)
• PSRAM + mic tuning
• Wake word + VAD models
• LED feedback (optional)
Step-by-Step Instructions
1. Install ESPHome 2024.11.3 in a Virtual Environment (Recommended)
Using a virtual environment avoids conflicts with global installs and makes version control easy.
macOS / Linux
python3 -m venv esphome-env
source esphome-env/bin/activate
pip install esphome==2024.11.3
Windows
python -m venv esphome-env
esphome-env\Scripts\activate
pip install esphome==2024.11.3
Then use:
python -m esphome run seed-studio-sense.yaml
This ensures you’re using the correct version inside the virtualenv. Confirm with:
python -m esphome version
2. Use esp32s3box Board and Enable PSRAM
esp32:
board: esp32s3box
variant: esp32s3
framework:
type: esp-idf
sdkconfig_options:
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: y
CONFIG_COMPILER_OPTIMIZATION: "Performance"
psram:
mode: octal
speed: 80MHz
3. Configure Your Microphone
i2s_audio:
- id: i2s_microphone
i2s_lrclk_pin: GPIO42
microphone:
- platform: i2s_audio
i2s_audio_id: i2s_microphone
id: echo_microphone
i2s_din_pin: GPIO41
adc_type: external
bits_per_sample: 16bit
pdm: true
channel: left
4. Wake Word + Voice Assistant
micro_wake_word:
models:
- model: github://esphome/micro-wake-word-models/models/v2/hey_jarvis.json@main
vad:
model: github://esphome/micro-wake-word-models/models/v2/vad.json@main
on_wake_word_detected:
then:
- logger.log: "🎤 Wake word triggered!"
- voice_assistant.start:
wake_word: !lambda return wake_word;
voice_assistant:
id: voiceassistant
microphone: echo_microphone
use_wake_word: false
noise_suppression_level: 1
auto_gain: 31dBFS
volume_multiplier: 10
on_start:
- light.turn_on: onboard_led
on_end:
- light.turn_off: onboard_led
- if:
condition:
switch.is_on: use_wake_word
then:
- micro_wake_word.start:
on_error:
- if:
condition:
switch.is_on: use_wake_word
then:
- micro_wake_word.stop:
- micro_wake_word.start:
5. Optional: Switch to Toggle Wake Word
switch:
- platform: template
name: Use wake word
id: use_wake_word
optimistic: true
restore_mode: RESTORE_DEFAULT_ON
on_turn_on:
- micro_wake_word.start:
on_turn_off:
- micro_wake_word.stop:
6. Optional: Onboard LED for Feedback (e.g. GPIO21)
output:
- platform: ledc
pin: GPIO21
id: led_output
light:
- platform: monochromatic
output: led_output
id: onboard_led
Result
• Wake word “Hey Jarvis” works reliably
• Mic works perfectly with ESPHome 2024.11.3
• LED feedback confirms trigger
• Fully local and stable voice assistant
Thanks
Huge thanks again to @fabio-garavini for sharing the fix and working config. This completely solved the issue for my Seed Studio ESP32-S3 Sense board after days of debugging.
Hope this helps someone else stuck in the same spot!