Esp32-s3 local voice asistant

Hello,

I want to create a voice assistant using an ESP32-S3 via ESPHome.
Unfortunately, I’m encountering some issues, no wake word seems to be detected.

I’ve used a Max98357 and an INMP441 connected to an ESP32-S3 (the pins are different from the diagram).

Here’s my ESPHome configuration.

esphome:
  name: assistant-chambre
  friendly_name: Assistant Chambre

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf

# Enable logging
logger:
  level: DEBUG

i2s_audio:
  id: i2s_in
  i2s_lrclk_pin: 17 #WS/LRC
  i2s_bclk_pin: 16 #SCK/BCLK

microphone:
  - platform: i2s_audio
    id: mic
    i2s_din_pin: 13 #SD
    adc_type: external
    bits_per_sample: 32bit
    i2s_audio_id: i2s_in
    pdm: false

speaker:
  - platform: i2s_audio
    id: speaker_voice
    dac_type: external
    i2s_dout_pin: 15 #DIN
    mode: mono

micro_wake_word:
  model: hey_jarvis
  on_wake_word_detected:
    then:
      - voice_assistant.start:

voice_assistant:
  id: va
  microphone: mic
  use_wake_word: false
  noise_suppression_level: 2
  auto_gain: 31dBFS
  volume_multiplier: 2.0
  on_client_connected:
    - if:
        condition:
          switch.is_on: use_wake_word
        then:
          - voice_assistant.start_continuous:
  on_client_disconnected:
    - if:
        condition:
          switch.is_on: use_wake_word
        then:
          - voice_assistant.stop:

switch:
  - platform: template
    name: Use wake word
    id: use_wake_word
    optimistic: true
    restore_mode: RESTORE_DEFAULT_ON
    entity_category: config
    on_turn_on:
      - lambda: id(va).set_use_wake_word(true);
      - if:
          condition:
            not:
              - voice_assistant.is_running
          then:
            - voice_assistant.start_continuous
    on_turn_off:
      - voice_assistant.stop
      - lambda: id(va).set_use_wake_word(false);

However, when I turn on the switch, no keywords are recognized.
Do you have any ideas on how to solve my problem, please?

[19:52:15][D][switch:012]: 'Use wake word' Turning ON.
[19:52:15][D][switch:055]: 'Use wake word': Sending state ON
[19:52:15][D][voice_assistant:414]: State changed from IDLE to START_PIPELINE
[19:52:15][D][voice_assistant:420]: Desired state set to START_MICROPHONE
[19:52:15][D][voice_assistant:118]: microphone not running
[19:52:15][D][voice_assistant:202]: Requesting start...
[19:52:15][D][voice_assistant:414]: State changed from START_PIPELINE to STARTING_PIPELINE
[19:52:15][D][voice_assistant:118]: microphone not running
[19:52:15][D][voice_assistant:435]: Client started, streaming microphone
[19:52:15][D][voice_assistant:414]: State changed from STARTING_PIPELINE to START_MICROPHONE
[19:52:15][D][voice_assistant:420]: Desired state set to STREAMING_MICROPHONE
[19:52:15][D][voice_assistant:155]: Starting Microphone
[19:52:15][D][voice_assistant:414]: State changed from START_MICROPHONE to STARTING_MICROPHONE
[19:52:15][D][esp-idf:000]: I (93006) I2S: DMA Malloc info, datalen=blocksize=1024, dma_buf_count=4

[19:52:15][D][voice_assistant:521]: Event Type: 1
[19:52:15][D][voice_assistant:524]: Assist Pipeline running
[19:52:15][D][voice_assistant:414]: State changed from STARTING_MICROPHONE to STREAMING_MICROPHONE
[19:52:15][D][voice_assistant:521]: Event Type: 9
[19:52:15][D][esp-idf:000]: I (93045) wifi:
[19:52:15][D][esp-idf:000]: <ba-add>idx:1 (ifx:0, 3a:07:16:98:56:84), tid:6, ssn:2, winSize:64
[19:52:15][D][esp-idf:000]: 

[19:52:23][D][esp32.preferences:114]: Saving 1 preferences to flash...
[19:52:23][D][esp32.preferences:143]: Saving 1 preferences to flash: 0 cached, 1 written, 0 failed
[19:55:42][I][ota:117]: Boot seems successful, resetting boot loop counter.
[19:55:42][D][esp32.preferences:114]: Saving 1 preferences to flash...
[19:55:42][D][esp32.preferences:143]: Saving 1 preferences to flash: 0 cached, 1 written, 0 failed
[20:00:57][D][switch:016]: 'Use wake word' Turning OFF.
[20:00:57][D][switch:055]: 'Use wake word': Sending state OFF
[20:00:57][D][voice_assistant:514]: Signaling stop...
[20:00:57][D][voice_assistant:414]: State changed from STREAMING_MICROPHONE to STOP_MICROPHONE
[20:00:57][D][voice_assistant:420]: Desired state set to IDLE
[20:00:57][D][voice_assistant:414]: State changed from STOP_MICROPHONE to STOPPING_MICROPHONE
[20:00:57][D][esp-idf:000]: I (615356) I2S: DMA queue destroyed

[20:00:57][D][voice_assistant:521]: Event Type: 0
[20:00:57][E][voice_assistant:651]: Error: no_wake_word - No wake word detected
[20:00:57][D][voice_assistant:514]: Signaling stop...
[20:00:57][D][voice_assistant:414]: State changed from STOPPING_MICROPHONE to STOP_MICROPHONE
[20:00:57][D][voice_assistant:420]: Desired state set to IDLE
[20:00:57][D][voice_assistant:414]: State changed from STOP_MICROPHONE to IDLE
[20:00:57][D][voice_assistant:521]: Event Type: 2
[20:00:57][D][voice_assistant:611]: Assist Pipeline ended
[20:01:09][D][switch:012]: 'Use wake word' Turning ON.
[20:01:09][D][switch:055]: 'Use wake word': Sending state ON
[20:01:09][D][voice_assistant:414]: State changed from IDLE to START_PIPELINE
[20:01:09][D][voice_assistant:420]: Desired state set to START_MICROPHONE
[20:01:09][D][voice_assistant:118]: microphone not running
[20:01:09][D][voice_assistant:202]: Requesting start...
[20:01:09][D][voice_assistant:414]: State changed from START_PIPELINE to STARTING_PIPELINE
[20:01:09][D][voice_assistant:435]: Client started, streaming microphone
[20:01:09][D][voice_assistant:414]: State changed from STARTING_PIPELINE to START_MICROPHONE
[20:01:09][D][voice_assistant:420]: Desired state set to STREAMING_MICROPHONE
[20:01:09][D][voice_assistant:155]: Starting Microphone
[20:01:09][D][voice_assistant:414]: State changed from START_MICROPHONE to STARTING_MICROPHONE
[20:01:09][D][esp-idf:000]: I (627014) I2S: DMA Malloc info, datalen=blocksize=1024, dma_buf_count=4

[20:01:09][D][voice_assistant:521]: Event Type: 1
[20:01:09][D][voice_assistant:524]: Assist Pipeline running
[20:01:09][D][voice_assistant:414]: State changed from STARTING_MICROPHONE to STREAMING_MICROPHONE
[20:01:09][D][voice_assistant:521]: Event Type: 9
[20:01:23][D][esp32.preferences:114]: Saving 1 preferences to flash...
[20:01:23][D][esp32.preferences:143]: Saving 1 preferences to flash: 1 cached, 0 written, 0 failed

let me tell you, i have exactly the same issue -.-
INMP441 mic with a Lolin D32 board.

esphome:
  name: presence
  friendly_name: presence
  on_boot:
     - priority: -100
       then:
         - wait_until: api.connected
         - delay: 1s
         - if:
             condition:
               switch.is_on: use_wake_word
             then:
               - voice_assistant.start_continuous:

esp32:
  board: esp32dev
  framework:
    type: ESP-IDF
    version: recommended

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 192.168.1.175
    gateway: 192.168.1.1
    subnet: 255.255.255.0
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Presence Fallback Hotspot"
    password: "12345678"

web_server:
  port: 80
  
captive_portal:

i2s_audio:
  i2s_lrclk_pin: GPIO26
  i2s_bclk_pin: GPIO25

microphone:
  - platform: i2s_audio
    id: mic
    adc_type: external
    i2s_din_pin: GPIO12
    pdm: false

voice_assistant:
  microphone: mic
  use_wake_word: false
  noise_suppression_level: 2
  auto_gain: 31dBFS
  volume_multiplier: 2.0
  id: assist
  on_tts_end:
    - homeassistant.service:
        service: media_player.play_media
        data:
          media_content_id: !lambda 'return x;'
          media_content_type: audio/mpeg
          entity_id: media_player.windows

switch:
  - platform: template
    name: Use wake word
    id: use_wake_word
    optimistic: true
    restore_mode: RESTORE_DEFAULT_ON
    entity_category: config
    on_turn_on:
      - lambda: id(assist).set_use_wake_word(true);
      - if:
          condition:
            not:
              - voice_assistant.is_running
          then:
            - voice_assistant.start_continuous
    on_turn_off:
      - voice_assistant.stop
      - lambda: id(assist).set_use_wake_word(false);

Log:

[00:05:34][I][app:102]: ESPHome version 2024.2.1 compiled on Feb 28 2024, 23:35:27
[00:05:34][C][wifi:577]: WiFi:
[00:05:34][C][wifi:409]:   Local MAC: 
[00:05:34][C][wifi:414]:   SSID: [redacted]
[00:05:34][C][wifi:415]:   IP Address: 192.168.1.175
[00:05:34][C][wifi:417]:   BSSID: [redacted]
[00:05:34][C][wifi:418]:   Hostname: 'presence'
[00:05:34][C][wifi:420]:   Signal strength: -53 dB ▂▄▆█
[00:05:34][C][wifi:424]:   Channel: 12
[00:05:34][C][wifi:425]:   Subnet: 255.255.255.0
[00:05:34][C][wifi:426]:   Gateway: 192.168.1.1
[00:05:34][C][wifi:427]:   DNS1: 0.0.0.0
[00:05:34][C][wifi:428]:   DNS2: 0.0.0.0
[00:05:34][C][logger:447]: Logger:
[00:05:34][C][logger:448]:   Level: DEBUG
[00:05:34][C][logger:449]:   Log Baud Rate: 115200
[00:05:34][C][logger:451]:   Hardware UART: UART0
[00:05:34][C][template.switch:068]: Template Switch 'Use wake word'
[00:05:34][C][template.switch:091]:   Restore Mode: restore defaults to ON
[00:05:34][C][template.switch:057]:   Optimistic: YES
[00:05:34][C][captive_portal:088]: Captive Portal:
[00:05:34][C][web_server:168]: Web Server:
[00:05:34][C][web_server:169]:   Address: 192.168.1.175:80
[00:05:34][C][mdns:115]: mDNS:
[00:05:34][C][mdns:116]:   Hostname: presence
[00:05:34][C][ota:096]: Over-The-Air Updates:
[00:05:34][C][ota:097]:   Address: 192.168.1.175:3232
[00:05:34][C][ota:100]:   Using Password.
[00:05:34][C][ota:103]:   OTA version: 2.
[00:05:34][C][api:139]: API Server:
[00:05:34][C][api:140]:   Address: 192.168.1.175:6053
[00:05:34][C][api:142]:   Using noise encryption: YES
[00:05:43][D][switch:016]: 'Use wake word' Turning OFF.
[00:05:43][D][switch:055]: 'Use wake word': Sending state OFF
[00:05:43][D][voice_assistant:514]: Signaling stop...
[00:05:43][D][voice_assistant:414]: State changed from STREAMING_MICROPHONE to STOP_MICROPHONE
[00:05:43][D][voice_assistant:420]: Desired state set to IDLE
[00:05:43][D][voice_assistant:521]: Event Type: 0
[00:05:43][E][voice_assistant:651]: Error: no_wake_word - No wake word detected
[00:05:43][D][voice_assistant:514]: Signaling stop...
[00:05:43][D][voice_assistant:414]: State changed from STOP_MICROPHONE to STOP_MICROPHONE
[00:05:43][D][voice_assistant:420]: Desired state set to IDLE
[00:05:43][D][voice_assistant:414]: State changed from STOP_MICROPHONE to STOPPING_MICROPHONE
[00:05:43][D][esp-idf:000]: I (826200) I2S: DMA queue destroyed

[00:05:43][D][voice_assistant:521]: Event Type: 2
[00:05:43][D][voice_assistant:611]: Assist Pipeline ended
[00:05:43][D][voice_assistant:414]: State changed from STOPPING_MICROPHONE to IDLE
[00:05:47][D][switch:012]: 'Use wake word' Turning ON.
[00:05:47][D][switch:055]: 'Use wake word': Sending state ON
[00:05:47][D][voice_assistant:414]: State changed from IDLE to START_PIPELINE
[00:05:47][D][voice_assistant:420]: Desired state set to START_MICROPHONE
[00:05:47][D][voice_assistant:118]: microphone not running
[00:05:47][D][voice_assistant:202]: Requesting start...
[00:05:47][D][voice_assistant:414]: State changed from START_PIPELINE to STARTING_PIPELINE
[00:05:47][D][voice_assistant:435]: Client started, streaming microphone
[00:05:47][D][voice_assistant:414]: State changed from STARTING_PIPELINE to START_MICROPHONE
[00:05:47][D][voice_assistant:420]: Desired state set to STREAMING_MICROPHONE
[00:05:47][D][voice_assistant:155]: Starting Microphone
[00:05:47][D][voice_assistant:414]: State changed from START_MICROPHONE to STARTING_MICROPHONE
[00:05:47][D][esp-idf:000]: I (829879) I2S: DMA Malloc info, datalen=blocksize=1024, dma_buf_count=4

[00:05:47][D][voice_assistant:521]: Event Type: 1
[00:05:47][D][voice_assistant:524]: Assist Pipeline running
[00:05:47][D][voice_assistant:414]: State changed from STARTING_MICROPHONE to STREAMING_MICROPHONE
[00:05:47][D][voice_assistant:521]: Event Type: 9

checking the Voice Assistant i do see the open Pipeline…

Engine:

entity_id: wake_word.openwakeword
metadata:
  format: wav
  codec: pcm
  bit_rate: 16
  sample_rate: 16000
  channel: 1
timeout: 5

Raw:

stage: wake_word
run:
  pipeline: 01hgy9rhxqkzekrwbh00emyr2f
  language: de
events:
  - type: run-start
    data:
      pipeline: 01hgy9rhxqkzekrwbh00emyr2f
      language: de
    timestamp: "2024-02-28T23:05:47.366435+00:00"
  - type: wake_word-start
    data:
      entity_id: wake_word.openwakeword
      metadata:
        format: wav
        codec: pcm
        bit_rate: 16
        sample_rate: 16000
        channel: 1
      timeout: 5
    timestamp: "2024-02-28T23:05:47.366563+00:00"
wake_word:
  entity_id: wake_word.openwakeword
  metadata:
    format: wav
    codec: pcm
    bit_rate: 16
    sample_rate: 16000
    channel: 1
  timeout: 5
  done: false

If i do a debug test on my smartphone the Hotword detection does work!

So i presume the microphone might be broken, or not? we will never know!

ohhhh i remember i had issues before!

configuration.yaml needs this line:

assist_pipeline:
  debug_recording_dir: /config/stt/assist_pipeline

sadly my file (20 seconds) is 0kb in size and seems broken.
If i do a pipeline test on my smartphone i get a 44kbit file and can hear myself talking.

You need to set the microphone to Left for starters.

microphone:
  platform: i2s_audio 
  id: external_microphone 
  adc_type: external 
  i2s_audio_id: i2s_in
  i2s_din_pin: GPIO4
  channel: left
  pdm: false

doesn’t make any difference.
Tried left, right. with L/R grounded or not.

I have 2 of these with the S3 boards running real well right now. Here is my config. You have alot missing to make these boards work for this.:
You can visit this thread fro more help

substitutions:
  voice_assist_idle_phase_id: '1'
  voice_assist_listening_phase_id: '2'
  voice_assist_thinking_phase_id: '3'
  voice_assist_replying_phase_id: '4'
  voice_assist_not_ready_phase_id: '10'
  voice_assist_error_phase_id: '11'
  voice_assist_muted_phase_id: '12'
esphome:
  name: master-bedroom-voice-assistant
  friendly_name: Master Bedroom Voice assistant
  platformio_options:
    board_build.flash_mode: dio


  on_boot:
      priority: 600
      then:
        - script.execute: control_led
        - delay: 30s
        - if:
            condition:
              lambda: return id(init_in_progress);
            then:
              - lambda: id(init_in_progress) = false;
              - script.execute: control_led

psram:
  mode:  octal
  speed: 80MHz
  

esp32:
  board:   esp32-s3-devkitc-1
  variant: esp32s3
  framework:
    type: esp-idf
    version: recommended
    components:
      - name:    esphome_board
        source:  github://jesserockz/esphome-esp-adf-board@main
        refresh: 0s
    sdkconfig_options:
      CONFIG_ESP32_S3_BOX_BOARD: "y"
      CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"
      CONFIG_ESP32S3_DATA_CACHE_64KB:      "y"
      CONFIG_ESP32S3_DATA_CACHE_LINE_64B:  "y"
      CONFIG_AUDIO_BOARD_CUSTOM:           "y"

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "snip"

  on_client_connected:
    - script.execute: control_led
  on_client_disconnected:
    - script.execute: control_led

ota:
  password: "snip"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: *
    gateway: *
    subnet: *

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Master-Bedroom-Voice-Assistant"
    password: "snip"


esp_adf:
external_components:
  - source: github://pr#5230
    components:
    - esp_adf 
    refresh: 0s

captive_portal:

light:
  - platform: esp32_rmt_led_strip
    rgb_order: GRB
    pin: GPIO18
    num_leds: 3
    rmt_channel: 0
    chipset: WS2812
    name: "Status LED"
    id: led
    default_transition_length: 0s
    effects:
      - pulse:
          name: "extra_slow_pulse"
          transition_length: 800ms
          update_interval: 800ms
          min_brightness: 0%
          max_brightness: 30%
      - pulse:
          name: "slow_pulse"
          transition_length: 250ms
          update_interval: 250ms
          min_brightness: 50%
          max_brightness: 100%
      - pulse:
          name: "fast_pulse"
          transition_length: 100ms
          update_interval: 100ms
          min_brightness: 50%
          max_brightness: 100%

i2s_audio:
  - id: i2s_in
    i2s_lrclk_pin: GPIO3  ##INMP441-WS
    i2s_bclk_pin: GPIO2  ##INMP441-SCK
  - id: i2s_out
    i2s_lrclk_pin: GPIO6  ##Max98357 - LRC
    i2s_bclk_pin: GPIO20   ###Max98357 - BCLK
    ## l/R pin on ##INMP441 is connected to ground

microphone:
  platform: i2s_audio 
  id: external_microphone 
  adc_type: external 
  i2s_audio_id: i2s_in
  i2s_din_pin: GPIO4
  channel: left
  pdm: false

speaker:
  platform: i2s_audio 
  id: external_speaker 
  dac_type: external
  i2s_audio_id: i2s_out
  i2s_dout_pin: GPIO8  ###Max98357 - DIN
  mode: mono 

voice_assistant:
  id: va
  microphone: external_microphone 
  speaker: external_speaker
  use_wake_word: true
  noise_suppression_level: 2
  auto_gain: 31dBFS
  volume_multiplier: 2.5



  on_listening:
    - lambda: id(voice_assistant_phase) = ${voice_assist_listening_phase_id};
    - script.execute: control_led

  on_stt_vad_end:
    - lambda: id(voice_assistant_phase) = ${voice_assist_thinking_phase_id};
    - script.execute: control_led

  on_tts_stream_start:
    - lambda: id(voice_assistant_phase) = ${voice_assist_replying_phase_id};
    - script.execute: control_led

  on_tts_stream_end:
    - lambda: id(voice_assistant_phase) = ${voice_assist_idle_phase_id};
    - script.execute: control_led

  on_error: 
    - if:
        condition:
          lambda: return !id(init_in_progress);
        then:
          - lambda: id(voice_assistant_phase) = ${voice_assist_error_phase_id};
          - script.execute: control_led
          - delay: 1s
          - if:
              condition:
                switch.is_on: use_wake_word
              then:
                - lambda: id(voice_assistant_phase) = ${voice_assist_idle_phase_id};
              else:
                - lambda: id(voice_assistant_phase) = ${voice_assist_muted_phase_id};
          - script.execute: control_led

  on_client_connected: 
    - if:
        condition:
          switch.is_on: use_wake_word
        then:
          - voice_assistant.start_continuous
          - lambda: id(voice_assistant_phase) = ${voice_assist_idle_phase_id};
        else:
          - lambda: id(voice_assistant_phase) = ${voice_assist_muted_phase_id};
    - script.execute: control_led          

  on_client_disconnected: 
    - lambda: id(voice_assistant_phase) = ${voice_assist_not_ready_phase_id};
    - script.execute: control_led

switch:
  - platform: template
    name: Use Wake Word
    id: use_wake_word
    optimistic: true
    restore_mode: RESTORE_DEFAULT_ON
    on_turn_on:
      - if:
          condition:
            lambda: return !id(init_in_progress);
          then:
            - lambda: id(voice_assistant_phase) = ${voice_assist_idle_phase_id};
            - if:
                condition:
                    not:
                      - voice_assistant.is_running
                then:
                  - voice_assistant.start_continuous
            - script.execute: control_led          
 
    on_turn_off:
      - if:
          condition:
            lambda: return !id(init_in_progress);
          then:
            - voice_assistant.stop
            - lambda: id(voice_assistant_phase) = ${voice_assist_muted_phase_id};
            - script.execute: control_led          

globals:
  - id: init_in_progress
    type: bool
    restore_value: no
    initial_value: 'true'
  - id: voice_assistant_phase
    type: int
    restore_value: no
    initial_value: ${voice_assist_not_ready_phase_id}
  
script:
  - id: control_led
    then:
      - if:
          condition:
            lambda: return !id(init_in_progress);
          then:
            - if:
                condition:
                    wifi.connected:
                then:
                  - if:
                      condition:
                          api.connected:
                      then:
                        - lambda: |
                            switch(id(voice_assistant_phase)) {
                              case ${voice_assist_listening_phase_id}:
                                id(led).turn_on().set_rgb(0, 0, 1).set_brightness(1.0).set_effect("none").perform();
                                break;
                              case ${voice_assist_thinking_phase_id}:
                                id(led).turn_on().set_rgb(0, 1, 0).set_effect("slow_pulse").perform();
                                break;
                              case ${voice_assist_replying_phase_id}:
                                id(led).turn_on().set_rgb(0, 0, 1).set_brightness(1.0).set_effect("fast_pulse").perform();
                                break;
                              case ${voice_assist_error_phase_id}:
                                id(led).turn_on().set_rgb(1, 1, 1).set_brightness(.5).set_effect("none").perform();
                                break;
                              case ${voice_assist_muted_phase_id}:
                                id(led).turn_off().perform();
                                break;
                              case ${voice_assist_not_ready_phase_id}:
                                id(led).turn_on().perform();
                                break;
                              default:
                                id(led).turn_on().set_rgb(1, 0, 0).set_brightness(0.2).set_effect("none").perform();
                                break;
                            }
                      else:
                        - light.turn_off:
                            id: led
                else:
                  - light.turn_off:
                      id: led
          else:
            - light.turn_on:
                id: led
                blue: 50%
                red: 50%
                green: 50%
                effect: "fast_pulse"
2 Likes

Unfortunately, it still doesn’t work. I’ve tested the microphone on the left and completed my configuration.
Just like @Haldi, I’d like to be able to test if my mic is working or not.

Same here. I think the S3 support isn’t that far in esphome. Hopefully, it will get better.

@egreh4trj896436sfz
IF you have Arduino IDE installed i found a working script for 2.0!

So i did everything right with soldering and the mic is working!


Normal value is around -30 - 30 and when you yell it goes up to 5000 !

Now i just need to strip down Rich’s yaml from everything we don’t need for a working microphone -.-

@Haldi
Have you found a working configuration to make your microphone function?
Despite copying @Rich37804 configuration, I am unable to achieve something functional.

Have you tried this wiring and code? Since those are from two different places you may need to adjust the GPIO pin assignments slightly (I didn’t check if they line up) but that’s the correct wiring and I have had success with that code. (I also changed the GPIO to suit the particular ESP board I have.

Thank you very much, the wake word microphone works very well, but the voice recognition doesn’t seem to work. However, Whisper works with my phone.
Would you have any ideas?

The component requires an ESP32-S3 with PSRAM to function.micro_wake_word

# for example ESP32-S3-WROOM-1-N16R8
psram:
  mode: octal
  speed: 80MHz
1 Like

Wait what?
The Atom Echo has PSRAM?

Or do they use some other method get it working as a satellite?