Skip to content

Add Waveshare ESP32-S3 Audio Board#195

Open
jensenbox wants to merge 4 commits intoesphome:mainfrom
jensenbox:add-waveshare-esp32-s3-audio
Open

Add Waveshare ESP32-S3 Audio Board#195
jensenbox wants to merge 4 commits intoesphome:mainfrom
jensenbox:add-waveshare-esp32-s3-audio

Conversation

@jensenbox
Copy link
Copy Markdown

Summary

Add support for the Waveshare ESP32-S3 Audio Board as a wake word voice assistant.

Board hardware

  • MCU: ESP32-S3 with 16MB flash and 8MB octal PSRAM
  • Audio DAC: ES8311 (speaker output via I2S)
  • Audio ADC: ES7210 (microphone input via I2S)
  • I/O Expander: TCA9555 (buttons, speaker amplifier enable)
  • LEDs: 7x WS2812 RGB LED ring on GPIO38
  • Buttons: 3 buttons (volume up, volume down, action) via TCA9555
  • Speaker amplifier: Controlled via TCA9555 GPIO

Features

  • On-device wake word detection (micro_wake_word) with okay_nabu, hey_mycroft, hey_jarvis
  • Option to use Home Assistant wake word engine instead
  • Voice assistant with full LED choreography on the 7-LED ring
  • Media player with volume control via hardware buttons
  • Timer support with alarm sound and LED feedback
  • Factory reset via long press (10s) on action button
  • Listen light toggle
  • OTA updates

Pin mapping reference

Pinout and hardware details: https://github.com/jensenbox/waveshare-esp32-s3-audio

Test plan

  • Flash to Waveshare ESP32-S3 Audio Board
  • Verify WiFi provisioning via captive portal
  • Verify wake word detection triggers voice assistant
  • Verify speaker output and microphone input
  • Verify volume buttons work
  • Verify LED feedback for all voice assistant phases
  • Verify timer functionality
  • Verify factory reset via long press

Add configuration for the Waveshare ESP32-S3 Audio Board as a wake word
voice assistant. The board features an ES8311 DAC, ES7210 ADC, TCA9555
I/O expander, 7-LED WS2812 RGB ring, 3 buttons, and a speaker amplifier.
Update on_end to wait 2s + speaker idle before restarting wake word,
add wake word restart to on_error after speaker finishes, replace
on_idle with on_announcement handler that stops wake word, waits for
announcement to complete, then restarts it.
Restarting the microphone (via wake word) in on_end causes an I2S bus
conflict because on_end fires before the speaker finishes playing TTS
audio. Moving the restart to on_tts_stream_end ensures we wait for the
speaker to finish before reclaiming the I2S bus for the microphone.

- on_end: now only resets LEDs (no mic restart)
- on_tts_stream_end: waits for speaker, then restarts wake word
When a voice command produces no TTS response, on_tts_stream_end never
fires and the wake word engine stays stopped. The new fallback script is
called from on_end: it waits 5s (giving on_tts_stream_end time to act
first), checks if wake word is already running, and only restarts if not.
@github-actions github-actions Bot added the stale label May 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant