[SOLVED] Micro Wake Word Not Working on ESP32-S3 (e.g. Seed Studio XIAO Sense) ESP32-S3 Sense)

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.


:white_check_mark: 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)


:jigsaw: Step-by-Step Instructions

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

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

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

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

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

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

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


:speech_balloon: 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!

1 Like