esp32.diy

ESPHome Voice Satellite on Waveshare ESP32-S3-AUDIO-Board

Oct 13, 2026 · 5 min read

Intermediate 51 stars 14 forks Python MIT Updated 2026-10-08

The Waveshare ESP32-S3-AUDIO-Board running the ESPHome voice satellite, showing the compact devkit with its LED ring and microphone array.

TL;DR Flash the Waveshare ESP32-S3-AUDIO-Board with a single ESPHome config file and get a fully featured Home Assistant voice satellite — on-device wake word, simultaneous music mixing, voice timers, and an animated RGB status ring. Every day-to-day setting is a Home Assistant entity; no reflashing needed to tune it.
What you need
  • Waveshare ESP32-S3-AUDIO-Board
  • ES8311 audio codec (DAC)
  • ES7210 ADC
  • Dual-microphone array
  • 7-LED RGB ring
BoardWaveshare ESP32-S3-AUDIO-Board
FrameworkESPHome 2026.8.0+
LanguageYAML / Python
LicenseMIT
Versionv1.2.0 (stable)
Wake wordsAlexa, Okay Nabu, Hey Jarvis, Hey Mycroft

What You Will Build

The Waveshare ESP32-S3-AUDIO-Board is a compact AI smart-speaker devkit built around an ESP32-S3, a dual-microphone array, an ES8311 audio codec, three hardware buttons, and a 7-LED RGB ring. This project turns it into a fully featured Home Assistant voice satellite using only stock ESPHome components — no custom C firmware, no patched libraries.

Once flashed, the board listens continuously for a wake word. Say "Alexa" (or one of three other built-ins), and the ring lights up while Home Assistant's Assist pipeline handles speech-to-text, intent matching, and text-to-speech. Music from Music Assistant ducks while the assistant speaks, then fades back in. Timers count down with a visible ring effect and ring aloud when they expire. A boot chime plays when the device connects to Home Assistant, and a night mode dims the ring and silences sounds on a schedule.

Every day-to-day setting — wake word, microphone gain, ring brightness, animations, night mode — is a Home Assistant entity you can adjust without reflashing.

Live demo of the LED ring state animations and the matching Home Assistant controls for brightness, animation style, and wake-word selection.\2
Live demo of the LED ring state animations and the matching Home Assistant controls for brightness, animation style, and wake-word selection.
Home Assistant device page showing the media player, wake-word selector, LED animation picker, night mode switch, and timer sensor exposed by the firmware.\2
Home Assistant device page showing the media player, wake-word selector, LED animation picker, night mode switch, and timer sensor exposed by the firmware.

What You Need

Hardware

Software and services

The core firmware is pulled from GitHub at compile time, so you only ever keep two local files: your secrets.yaml and one thin waveshare-va.yaml.

Typical use cases

Hands-Free Home Control

Wake the board by voice and ask Home Assistant to control lights, locks, thermostats, or any other device in your Assist pipeline — no phone, no app.

Whole-Home Audio with Announcements

The mixer speaker blends a music stream with announcement audio, so a doorbell chime or TTS reply ducks the music rather than cutting it off abruptly.

Voice Timers and Alarms

Set kitchen or workshop timers by voice. The LED ring shows a countdown effect and rings aloud when the timer expires; say the wake word or press Play/Pause to silence it.

Multi-Room Voice Satellite Network

Deploy several boards, each with a different wake word, to cover multiple rooms independently. Each device appears as its own entity set in Home Assistant.

How It Works — The Shared I2S Bus

The Waveshare board wires both its ES8311 DAC and ES7210 ADC to the same BCLK and LRCLK pins. ESPHome cannot run one I2S port full-duplex — if a microphone and a speaker both try to initialise the same port, the second one fails with "Parent bus is busy."

The project solves this with two I2S ports mapped over those shared pins:

Both the ES8311 and ES7210 are configured as slaves to the mic's clock. The microphone is pinned to 16-bit, because as master it sets the frame slot width — a 32-bit frame against the 16-bit DAC would produce noise.

The result is simultaneous capture and playback with no custom component and no patches to ESPHome.

Build and Flash Steps

  1. Clone or download the repository.
  2. Copy secrets.example.yaml to secrets.yaml and fill in your Wi-Fi credentials.
  3. Copy waveshare-va.yaml next to it. Open it and edit the substitutions: block — at minimum set a unique name, your posix_timezone, and your preferred volume_min / volume_max. The rest of the core is pulled from GitHub at compile time.
  4. Flash the first time over USB:
esphome run waveshare-va.yaml

Alternatively, copy both files into your ESPHome dashboard's /config/esphome/ folder and click Install.

  1. In Home Assistant, the new device appears automatically via the ESPHome integration. Open Configure and assign an Assist pipeline.
  2. Say "Alexa". The ring should light up. If it does not, consult the Troubleshooting wiki page.

To update later, clear the package cache so the latest core is fetched:

esphome clean waveshare-va.yaml
esphome run waveshare-va.yaml

Tuning From Home Assistant

No reflashing is required for everyday adjustments. The firmware exposes these as Home Assistant entities:

Ideas to Extend It — and Limitations

Ways to extend the project

Limitations to keep in mind

Verdict

This project delivers a polished, genuinely usable Home Assistant voice satellite on affordable hardware, with a clean package-based design that keeps your own config file to a minimum. The shared-I2S solution is the technically interesting heart of it — handled entirely in stock ESPHome, which means no maintenance burden from custom components. If you already run Home Assistant with an Assist pipeline, the barrier to a working voice room is one config file and a single flash command.

Sources

github.comMichalZaniewicz/esphome-waveshare-esp32-s3-audio-va — repository & README github.comOfficial website

Facts in this article come from the project's public README and GitHub metadata at the time of writing. Images belong to their respective owners and link back to the original source.