Waveshare-s3-audio-board ESPHome VoiceAssistant

This

Mdns doesn’t give IP maybe?

What IP is used for voice command responses?

Where is the IP for Mdns given?
IP adess is the local adess from HA.

It’s not sending an IP.
Is is sending that url in the error message.

Voice assistant send the Ip or url from HA >> settings >> system >> network >> local network

Announcements use the same. I am not sure how you sent the media but likely it may be using same. It should resolve on your network but maybe not.

Devices send mdns IP as broadcast on network.

Thank you for your work on this!

It seems like there are some breaking changes with more recent version of ESPHome that are causing issues (I’m on 2026.03.01)
For example, others reported the deprecated “seconds” in timers from an earlier 2026 release, but more recently API updates that cause compiling errors related to the API call to send_message seem to be preventing me from compiling.

I’d really love to get this device working as a voice satellite in ESP home.

Wondering if anyone has had success with getting this to work after the 2026.03.01 release?

Here’s the error I’m getting when attempting to compile:

Compiling .pioenvs/esp32-audio-s3/src/esphome/components/voice_assistant/voice_assistant.cpp.o
src/esphome/components/voice_assistant/voice_assistant.cpp: In member function 'virtual void esphome::voice_assistant::VoiceAssistant::loop()':
src/esphome/components/voice_assistant/voice_assistant.cpp:255:43: error: no matching function for call to 'esphome::api::APIConnection::send_message(esphome::api::VoiceAssistantRequest&, const uint8_t&)'
255 | !this->api_client_->send_message(msg, api::VoiceAssistantRequest::MESSAGE_TYPE)) {
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from src/esphome/components/voice_assistant/voice_assistant.h:12,
from src/esphome/components/voice_assistant/voice_assistant.cpp:1:
src/esphome/components/api/api_connection.h:295:29: note: candidate: 'template<class T> bool esphome::api::APIConnection::send_message(const T&)'
295 | template<typename T> bool send_message(const T &msg) {
| ^~~~~~~~~~~~
src/esphome/components/api/api_connection.h:295:29: note: candidate expects 1 argument, 2 provided
src/esphome/components/voice_assistant/voice_assistant.cpp:278:42: error: no matching function for call to 'esphome::api::APIConnection::send_message(esphome::api::VoiceAssistantAudio&, const uint8_t&)'
278 | this->api_client_->send_message(msg, api::VoiceAssistantAudio::MESSAGE_TYPE);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/esphome/components/api/api_connection.h:295:29: note: candidate: 'template<class T> bool esphome::api::APIConnection::send_message(const T&)'
295 | template<typename T> bool send_message(const T &msg) {
| ^~~~~~~~~~~~
src/esphome/components/api/api_connection.h:295:29: note: candidate expects 1 argument, 2 provided
src/esphome/components/voice_assistant/voice_assistant.cpp:357:42: error: no matching function for call to 'esphome::api::APIConnection::send_message(esphome::api::VoiceAssistantAnnounceFinished&, const uint8_t&)'
357 | this->api_client_->send_message(msg, api::VoiceAssistantAnnounceFinished::MESSAGE_TYPE);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/esphome/components/api/api_connection.h:295:29: note: candidate: 'template<class T> bool esphome::api::APIConnection::send_message(const T&)'
295 | template<typename T> bool send_message(const T &msg) {
| ^~~~~~~~~~~~
src/esphome/components/api/api_connection.h:295:29: note: candidate expects 1 argument, 2 provided
In file included from src/esphome/core/component.h:10,
from src/esphome/core/automation.h:3,
from src/esphome/components/voice_assistant/voice_assistant.h:7:
src/esphome/components/voice_assistant/voice_assistant.cpp: In member function 'void esphome::voice_assistant::VoiceAssistant::client_subscription(esphome::api::APIConnection*, bool)':
src/esphome/components/voice_assistant/voice_assistant.cpp:437:64: error: 'class esphome::api::APIConnection' has no member named 'get_peername'; did you mean 'get_peername_to'?
437 | this->api_client_->get_name(), this->api_client_->get_peername(), client->get_name(),
| ^~~~~~~~~~~~
src/esphome/core/log.h:137:100: note: in definition of macro 'esph_log_e'
137 | ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_ERROR, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
| ^~~~~~~~~~~
src/esphome/components/voice_assistant/voice_assistant.cpp:433:5: note: in expansion of macro 'ESP_LOGE'
433 | ESP_LOGE(TAG,
| ^~~~~~~~
src/esphome/components/voice_assistant/voice_assistant.cpp:438:22: error: 'class esphome::api::APIConnection' has no member named 'get_peername'; did you mean 'get_peername_to'?
438 | client->get_peername());
| ^~~~~~~~~~~~
src/esphome/core/log.h:137:100: note: in definition of macro 'esph_log_e'
137 | ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_ERROR, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
| ^~~~~~~~~~~
src/esphome/components/voice_assistant/voice_assistant.cpp:433:5: note: in expansion of macro 'ESP_LOGE'
433 | ESP_LOGE(TAG,
| ^~~~~~~~
src/esphome/components/voice_assistant/voice_assistant.cpp: In member function 'void esphome::voice_assistant::VoiceAssistant::signal_stop_()':
src/esphome/components/voice_assistant/voice_assistant.cpp:613:34: error: no matching function for call to 'esphome::api::APIConnection::send_message(esphome::api::VoiceAssistantRequest&, const uint8_t&)'
613 | this->api_client_->send_message(msg, api::VoiceAssistantRequest::MESSAGE_TYPE);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/esphome/components/api/api_connection.h:295:29: note: candidate: 'template<class T> bool esphome::api::APIConnection::send_message(const T&)'
295 | template<typename T> bool send_message(const T &msg) {
| ^~~~~~~~~~~~
src/esphome/components/api/api_connection.h:295:29: note: candidate expects 1 argument, 2 provided
src/esphome/components/voice_assistant/voice_assistant.cpp: In lambda function:
src/esphome/components/voice_assistant/voice_assistant.cpp:623:36: error: no matching function for call to 'esphome::api::APIConnection::send_message(esphome::api::VoiceAssistantAnnounceFinished&, const uint8_t&)'
623 | this->api_client_->send_message(msg, api::VoiceAssistantAnnounceFinished::MESSAGE_TYPE);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/esphome/components/api/api_connection.h:295:29: note: candidate: 'template<class T> bool esphome::api::APIConnection::send_message(const T&)'
295 | template<typename T> bool send_message(const T &msg) {
| ^~~~~~~~~~~~
src/esphome/components/api/api_connection.h:295:29: note: candidate expects 1 argument, 2 provided
*** [.pioenvs/esp32-audio-s3/src/esphome/components/voice_assistant/voice_assistant.cpp.o] Error 1


try clean build.
I use the external component but a different yaml. mine built without issue with 2026.3.1

1 Like

Text

it will compile but I for the life of me can not get the mic to work i tried asking AI and Claude admitted it had no idea either, the writing was a bear with new 6.3.3 syntax change tried to use the native drivers a. Any have any luck or tips and tricks? I know they feed from the same bus but the new symtax is not allowing in ESP home to write a double path, if you look at the above we tried the “repo” that in but lost working sound timing

substitutions:
  device_name: ai-voice
  friendly_name: AI Voice

esphome:
  name: ${device_name}
  friendly_name: ${friendly_name}
  on_boot:
    - priority: 600.0
      then:
        - switch.turn_on: main_power_rail
        - delay: 100ms
        - switch.turn_on: mic_power_enable
        - switch.turn_on: speaker_amp_enable

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

psram:
  mode: octal
  speed: 80MHz

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

api:
  encryption:
    key: !secret api_esp32-audio-s3

ota:
  - platform: esphome
    password: !secret ota_password

logger:
  level: DEBUG

i2c:
  - id: bus_a
    sda: GPIO11
    scl: GPIO10
    scan: true

tca9555:
  - id: ioexp
    address: 0x20

# --- AUDIO BUS ---
# Removed external_components as ES7210 is now built-in

i2s_audio:
  - id: i2s_bus
    i2s_lrclk_pin: 14
    i2s_bclk_pin: 13
    i2s_mclk_pin: 12
     
audio_adc:
  - platform: es7210
    id: es7210_adc
    i2c_id: bus_a
    address: 0x40
    # The toddler/lab tech asked for [mic_gain], and ES7210 uses 'DB'
    mic_gain: 30db

audio_dac:
  - platform: es8311
    id: dac_speaker
    i2c_id: bus_a
    address: 0x18
    use_mclk: true
     

# --- MICROPHONE ---
microphone:
  - platform: i2s_audio
    id: board_mic
    i2s_audio_id: i2s_bus
    i2s_din_pin: 15
    adc_type: external
    pdm: false
    sample_rate: 16000

# --- SPEAKER ---
speaker:
  - platform: i2s_audio
    id: board_speaker
    i2s_audio_id: i2s_bus
    i2s_dout_pin: 16
    dac_type: external
    sample_rate: 16000

# --- MEDIA PLAYER ---
media_player:
  - platform: speaker
    id: external_media_player
    name: "JARVIS Speaker"
    # The 'speaker' id goes INSIDE this block
    announcement_pipeline:
      speaker: board_speaker
    volume_min: 0.1
    volume_max: 1.0

# --- VOICE ASSISTANT ---
voice_assistant:
  id: va
  microphone: board_mic
  speaker: board_speaker
  use_wake_word: true
  noise_suppression_level: 2
  auto_gain: 31dBFS
  # This is the "Megaphone" for the AI - it replaces the filter we tried
  volume_multiplier: 12.0  
  
  on_listening:
    - light.turn_on:
        id: led_ring
        brightness: 100%
        red: 0%
        green: 0%
        blue: 100%
  on_stt_end: 
    - light.turn_on:
        id: led_ring
        brightness: 100%
        red: 100%
        green: 100%
        blue: 0%
  on_tts_start:
    - light.turn_on:
        id: led_ring
        brightness: 100%
        red: 0%
        green: 100%
        blue: 0%
  on_end:
    - light.turn_off: led_ring

# --- HARDWARE CONTROLS ---
switch:
  - platform: gpio
    name: "Speaker Amp Enable"
    pin: {tca9555: ioexp, number: 8, mode: OUTPUT}
    id: speaker_amp_enable
    restore_mode: ALWAYS_ON

  - platform: gpio
    name: "Mic Power Enable"
    pin: {tca9555: ioexp, number: 3, mode: OUTPUT}
    id: mic_power_enable
    restore_mode: ALWAYS_ON

  - platform: gpio
    name: "Main Audio Power Rail"
    pin: {tca9555: ioexp, number: 4, mode: OUTPUT} 
    id: main_power_rail
    restore_mode: ALWAYS_ON

binary_sensor:
  - platform: gpio
    pin: 
      number: GPIO0
      mode: INPUT_PULLUP
      inverted: true
    name: "JARVIS Button"
    id: jarvis_button
    on_press:
      - logger.log: "Button Pressed! Starting Voice Assistant..."
      - voice_assistant.start:
    on_release:
      - logger.log: "Button Released!"

light:
  - platform: esp32_rmt_led_strip
    name: "JARVIS LED Ring"
    id: led_ring
    pin: GPIO38
    num_leds: 7
    chipset: WS2812
    rgb_order: GRB

same problem here. been struggling to figure out how to fix it. I also get the same errors with GitHub - MarcoFre/ESP32-S3-AI-Smart-Speaker: Home Assistant - Voice Assistant for Waveshare ESP32-S3 AI Smart Speaker · GitHub

:man_shrugging:

[16:34:16.861][D][micro_wake_word:378]: State changed from STARTING to DETECTING_WAKE_WORD
[16:34:16.862][D][ring_buffer:034][mww]: Created ring buffer with size 3840
[16:34:16.881]Failed to resize buffer. Requested: 33488, available 20472, missing: 13016
[16:34:16.884][E][micro_wake_word:061][mww]: Failed to allocate tensors for the streaming model
[16:34:16.886]Failed to resize buffer. Requested: 17088, available 9380, missing: 7708
[16:34:16.888][E][micro_wake_word:252]: Encountered an error while performing an inference
[16:34:16.888][D][micro_wake_word:274]: Inference task is stopping, deallocating buffers
[16:34:16.890][E][micro_wake_word:061][mww]: Failed to allocate tensors for the streaming model
[16:34:16.902][D][micro_wake_word:279]: Inference task is finished, freeing task resources
[16:34:16.903][D][micro_wake_word:378]: State changed from DETECTING_WAKE_WORD to STOPPED

I had the same mic issue and found the solution here:

basically, just add this part to your yaml:

external_components:
  - source: github://pr#15628
    components: [micro_wake_word]
    refresh: 1h

this will pin esp-nn version to 1.2.1, since newer versions require a larger tensor arena on an ESP32-S3, causing micro_wake_word to fail to start.