At a glance
- Status
- In progress. Board soldered, configuration written, first firmware build started. Not yet flashed or talking to Home Assistant.
- Goal
- A local voice assistant for Home Assistant: say a wake word in the room, give a command, hear the answer.
- Brain
- Seeed XIAO ESP32-S3, a thumb-sized Wi-Fi microcontroller board.12
- Ears and voice
- Seeed reSpeaker XVF3800, a four-microphone board with an audio-cleaning chip, an LED ring and a headphone jack.13
- Speaker
- A pair of USB-powered computer speakers, fed from the 3.5 mm jack.
- Software
- ESPHome, using a community project written for this exact board.15
- Connection
- 2.4 GHz Wi-Fi to the Home Assistant server. No cable to the server.
1. What a voice satellite is
In short A voice satellite is a small box with microphones and a speaker. It listens for a wake word, records what you say, and sends it over the network to Home Assistant, which works out what you meant and replies.
Home Assistant (HA) is free, open-source software that controls smart-home devices from a computer in your own home. In this project it runs on a Raspberry Pi 5, a small single-board computer, using Home Assistant OS, the ready-made operating system that Home Assistant publishes for it. The two earlier pages in this series explain both: What Is Home Assistant? and Setting Up Home Assistant on a Raspberry Pi.
Assist is the voice assistant built into Home Assistant. Home Assistant describes it as a way to control your home in natural language that can run entirely on your own hardware.1 You can talk to Assist through the Home Assistant phone app, but to talk to it from across a room you need a device with good microphones and a speaker. That device is a voice satellite. Home Assistant's documentation suggests building satellites with ESPHome on inexpensive ESP32 microcontrollers, to add Assist to every room.1
How it fits with Assist
Assist handles a spoken request in stages, which Home Assistant calls a voice pipeline. Its own description of a local setup is: a microphone hears you, a speech-to-text engine turns your voice into text, Home Assistant works out what you want, and a text-to-speech engine speaks the answer.2
- Wake word: the trigger phrase that tells the device to start listening. In this project it is detected on the satellite itself (see Section 5).
- Speech-to-text (STT): turns the recording into written words.
- Intent handling: Home Assistant matches the words to an action, such as switching a light on.
- Text-to-speech (TTS): turns the reply into spoken audio, which the satellite plays.
2. Why a DIY build
The project was first planned around the Home Assistant Voice Preview Edition, the ready-made satellite that Home Assistant recommends for Assist.14 At the time (early October 2026) it was out of stock or available only for preorder in the US, so the project switched to building a satellite from parts. The community software used here borrows its notification sounds from the Voice Preview Edition project.15
3. The parts and what each does
In short Three boards do the real work. The reSpeaker hears and plays sound, the XMOS chip on it cleans up the audio, and the XIAO ESP32-S3 runs the software and talks to Home Assistant over Wi-Fi.
| Part | What it is | Its job here |
|---|---|---|
| Seeed Studio reSpeaker XVF3800 USB 4-Mic Array, bare board V1.1 | A round board with four microphones in a circle, an XMOS XVF3800 audio chip, a TLV320AIC3104 audio codec, 12 RGB LEDs, physical mute and reset buttons, a USB-C port and a 3.5 mm audio jack. Seeed rates it for 360° voice pickup up to 5 m.13 | The satellite's ears, voice and status light. The buttons are not used by this firmware (see below). |
| XMOS XVF3800 (on the reSpeaker) | A DSP, a digital signal processor: a chip built to process audio in real time. Seeed lists echo cancellation, beamforming, noise suppression, de-reverberation, direction-of-arrival detection and automatic gain control.13 | Cleans up the microphone sound before the wake word and speech recognition hear it. |
| TLV320AIC3104 (on the reSpeaker) | An audio codec, a chip that converts between digital audio and the analog signal a speaker needs.13 | Drives the 3.5 mm jack that feeds the speakers. |
| Seeed XIAO ESP32-S3 (plain version, no camera) | A 21 × 17.8 mm microcontroller board built on an ESP32-S3: a dual-core processor at up to 240 MHz, 8 MB of PSRAM, 8 MB of flash, 2.4 GHz Wi-Fi and Bluetooth LE 5.0, with a connector for an external antenna.12 | The satellite's brain: runs ESPHome, detects the wake word, and talks to Home Assistant. |
| u.FL Wi-Fi antenna | A small external antenna that clips onto the XIAO's tiny u.FL connector. Seeed cites a range of over 100 m with it attached.12 | Must be attached for Wi-Fi to work properly. |
| Stereo 2.0 computer speakers (Amazon Basics) | A pair of ordinary desktop speakers, powered by USB, with a 3.5 mm audio plug. | Play Assist's spoken replies. The audio comes from the reSpeaker's jack. |
| 3D-printed case | A custom case designed in OpenSCAD for printing on an Anycubic Kobra 2, in PLA or PETG. | Holds the boards, with openings for the microphones, light ring, buttons, jack and USB-C ports. |
The audio-cleaning terms, one line each beamforming, echo cancellation and more
- Beamforming: combining the four microphones so the board listens hardest in the direction of the person speaking.
- Echo cancellation (AEC): subtracting the satellite's own speaker output from what the microphones hear, so it can still hear you while it is talking.
- Noise suppression: reducing steady background sound such as fans.
- De-reverberation: reducing the echo of a room's hard surfaces.
- Direction of arrival (DoA): working out which direction a voice is coming from. The community project shows that direction on the LED ring.15
- Automatic gain control (AGC): raising quiet voices and lowering loud ones to an even level.
Seeed lists all of these as features of the XVF3800.13 The community project feeds one processed output to speech-to-text and a second, differently tuned output to the wake word detector.15
About the buttons. The reSpeaker has physical mute and reset buttons.13 The community ESPHome firmware used here does not use them; its README lists "no buttons" as a known issue.15 In practice that means:
- you say "stop" to stop a timer or a spoken response;
- there is no manual way to start the assistant, only the wake word;
- volume is software-only: there is no hardware volume control.15
4. Wiring and assembly
In short There is no loose wiring. The XIAO is soldered directly onto the back of the reSpeaker, the antenna clips on, the speakers plug into the jack, and one USB-C power supply runs everything.
Seeed sells the reSpeaker XVF3800 in two versions: one with a XIAO ESP32-S3 already fitted, and a bare board without one.13 This project uses the bare board (V1.1) and a separately bought plain XIAO ESP32-S3, hand-soldered on.
- Solder the XIAO to the reSpeaker. The XIAO sits on the back (component side) of the reSpeaker, at the edge opposite the reSpeaker's own USB-C port and 3.5 mm jack. Its USB-C port faces outward so it can still be plugged in, and its metal shield faces up. The joints were made with lead-free solder and the iron at about 370 °C (700 °F).
- Attach the antenna to the XIAO's u.FL connector. It must be attached for Wi-Fi to work properly.
- Connect the speakers to the reSpeaker's 3.5 mm jack. The speakers take their own power over USB.
- Fit everything into the case (planned; see below).
The 3D-printed case
The case was designed in OpenSCAD, a program that builds 3D models from written dimensions, for printing on an Anycubic Kobra 2 in PLA or PETG, two common 3D-printing plastics. It has:
- holes over the microphones, each fitted with a gasket (a soft ring that seals the gap between the board and the case);
- a window for the LED ring and vents;
- access to the physical buttons;
- room for a right-angle 3.5 mm plug and access to the USB-C ports.
The first print blocked the XIAO's USB-C port, which is needed to load the firmware. Revision C adds an opening for it. Revision C has not been printed yet.
Power
When finished, the satellite runs from any 5 V USB-C supply plugged into the reSpeaker's USB-C port, which also powers the XIAO. It needs no cable to the Raspberry Pi: it talks to Home Assistant over 2.4 GHz Wi-Fi. The speakers have their own USB power. The XIAO's own USB-C port is used to connect it to a computer for the first firmware flash.
5. The ESPHome setup
In short ESPHome turns a short text file describing the hardware into firmware for the XIAO. Here, almost all of that file comes ready-made from a community project; the local file only names the device and points to the private settings.
ESPHome is a system for programming ESP32-type boards without writing code: you describe the hardware in a configuration file, ESPHome compiles it into firmware and installs it, and everything the device offers shows up automatically in Home Assistant.5 The configuration is written in YAML, a plain-text format that uses indentation to group settings.
The ESPHome Device Builder is ESPHome's web interface for creating, editing and installing those configurations.5 It runs inside Home Assistant as an app. Newer Home Assistant versions call add-ons "Apps", and Seeed's guide installs the Device Builder from Settings > Apps > App Store.14 This project uses Device Builder 1.14.9 with ESPHome 2026.9.1.
The device configuration
The software is the community project formatBCE/Respeaker-XVF3800-ESPHome-integration, which Seeed links from its XVF3800 Home Assistant guide.1415 It needs ESPHome 2026.9.0 or later, and its README warns that it is under development.15 The device was created in the Device Builder with the board picker set to the ESP32-S3 chip and "Generic ESP32-S3 Board", and its configuration was then replaced with the project's example configuration from the README.15 That configuration has four parts:
- Substitutions: the device's name and display name, plus which version of the project to use. A substitution is a named value defined once and reused everywhere.8
- Packages: five ready-made configuration files fetched from the project's GitHub repository. A package is a block of configuration pulled in from elsewhere and merged with the local file.9
- Wi-Fi, API and OTA blocks: these refer to private values with
!secretinstead of containing them.
| Package | What it sets up |
|---|---|
| base | The core: the ESP32-S3 itself, its PSRAM memory, logging, Wi-Fi, the Home Assistant connection, and a patched i2s_audio audio component that the README says the board needs. It is fetched automatically. |
| hardware | Microphones, speaker output, the audio codec, and the XVF3800 itself, including a copy of its firmware. |
| voice-assistant | On-device wake word detection (micro wake word), the voice assistant connection, and a media player for replies and announcements. |
| leds | The LED ring animations that show what the satellite is doing. |
| timers-alarm | Voice timers and an alarm clock. |
The project repository was also saved to the Windows PC as a zip, for reference. It holds the packages, the custom components, the example configuration and the DSP firmware.15 The live build pulls the packages straight from GitHub, so the zip is not strictly needed.
The README says all five packages must be included, because they depend on one another.15 Two features are worth explaining:
- Micro wake word is ESPHome's on-device wake word detection: the XIAO listens for the wake word itself instead of streaming room audio to Home Assistant to listen for it there.73
- The ESPHome voice assistant component streams the microphone audio to Home Assistant, where the pipeline processes it.6
!secret references, the names of private values, not the values themselves.Where the private settings live secrets.yaml, API key, OTA password
Three private values are needed: the Wi-Fi network details, an API encryption key, and an OTA password. They live in a separate file called secrets.yaml, and the configuration refers to them by name with !secret. ESPHome provides this so that a configuration can be shared without revealing the values.8 None of them are published here.
- The native API is ESPHome's network connection to Home Assistant. With an encryption key set, that traffic is encrypted.10 Home Assistant asks for the same key when the device is added.15
- OTA, "over the air", means updating the firmware over Wi-Fi instead of a USB cable.11 The OTA password checks that whoever uploads new firmware is allowed to.11
The project README also notes that a remote package cannot read secrets, which is why these three blocks sit in the local file rather than in the packages.15
Building and flashing
The firmware is compiled by the ESPHome Device Builder on the Raspberry Pi. For the first install, Install > Plug into this computer sends the finished firmware to the XIAO over its USB-C port, from Chrome or Edge on a Windows PC; Seeed's guide also uses Chrome or Edge for this browser-based flashing.14 After that first flash, updates go over Wi-Fi using OTA.11
The DSP firmware
The XVF3800 runs its own firmware, separate from the ESPHome firmware on the XIAO. Seeed's guide explains that ESPHome cannot generate the audio clock the XVF3800 needs, so the XVF3800 must run a firmware that makes it the clock source.14
In this project that firmware, v1.0.7 (file application_xvf3800_inthost-lr48-sqr-i2c-v1.0.7-release.bin), is built into the ESPHome build. The project's respeaker_xvf3800 component reads the DSP's firmware version at boot. If it differs from the built-in copy, the respeaker_xvf3800.flash action sends the v1.0.7 firmware to the XVF3800 over I2C, a simple two-wire link between chips, in 128-byte blocks.15 No separate firmware tool is needed on the computer.
Seeed also documents a separate method: updating the XVF3800 over USB with DFU (Device Firmware Upgrade) using the dfu-util command-line tool.13 That is an alternative, and it is not being used here.
The planned voice pipeline and wake word
The pipeline on the Home Assistant side has not been built yet. Speech-to-text is still undecided between two options:
- Speech-to-Phrase, which runs locally. Home Assistant describes it as a closed-ended model that only recognises the phrases it knows, with very fast transcription even on a Raspberry Pi 4.2
- Home Assistant Cloud speech-to-text, the speech service included with Home Assistant Cloud, which Home Assistant calls the simplest option.12
Text-to-speech will be Piper, which Home Assistant describes as a fast, local neural text-to-speech system optimised for the Raspberry Pi 4.2
Wake word: to be decided. The firmware includes four on-device wake word models: Okay Nabu, Hey Jarvis, Hey Mycroft and a "Kenobi" model.15 The active one can be switched from Home Assistant. Okay Nabu is the likely default, but the choice has not been made yet.
6. Project status: in progress
In short This project is in progress. The hardware is soldered, the software is set up, and the first firmware build has started. The satellite has not yet been flashed, added to Home Assistant or tested by voice. Status as of October 15, 2026.
What works so far
Completed October 13–14, 2026:
- The XIAO ESP32-S3 is soldered to the reSpeaker and its antenna is attached.
- The formatBCE project repository was saved to a Windows PC as a zip, for reference.
- The ESPHome Device Builder app is installed in Home Assistant.
- A
secrets.yamlfile with the Wi-Fi details, API encryption key and OTA password has been created. - The device
respeaker-xvf3800-assistanthas been created in the Device Builder (ESP32-S3, Generic ESP32-S3 Board), with the project's example configuration. - Install > Plug into this computer has been started: the Device Builder on the Pi compiles the firmware, and the browser on the Windows PC will flash it over the XIAO's USB-C.
In progress
Now: the first firmware compile is running in the Device Builder. Flashing the XIAO over USB comes next. The project README notes that the first build takes several minutes, because ESPHome also compiles the underlying ESP-IDF framework the first time.15
Still to do:
- The first flash of the XIAO.
- Adding (adopting) the device in Home Assistant with the API encryption key.
- Checking the XVF3800 firmware version and running the DSP "flash" action if it differs.
- Building and testing the voice pipeline.
- Choosing the wake word (Okay Nabu is the likely default) and testing it.
- Printing case Rev C.
- Final assembly.
Known issues
- Case, XIAO USB-C port: the first case print blocked the XIAO's USB-C port. Rev C adds an opening for it, but Rev C has not been printed yet.
- Buttons not used by the firmware: the reSpeaker's physical mute and reset buttons do nothing in this firmware. You say "stop" to stop a timer or a response, there is no manual way to start the assistant, and volume is software-only, with no hardware volume control. The project README lists these as known issues.15 See About the buttons.
- Software maturity: the README says the integration is still under development and needs ESPHome 2026.9.0 or later.15 This project uses 2026.9.1.
7. Next steps
- Finish the first flash. Let the compile finish in the Device Builder and flash the XIAO over its USB-C from the browser on the Windows PC. Later updates go over Wi-Fi.
- Adopt it in Home Assistant. When Home Assistant discovers the new ESPHome device, add it and enter the API encryption key from
secrets.yaml.515 - Check the DSP firmware. Compare the XVF3800's firmware version, read at boot, with the built-in v1.0.7 and run the
respeaker_xvf3800.flashaction if they differ.15 - Build the voice pipeline. Choose speech-to-text (Speech-to-Phrase or Home Assistant Cloud), add Piper for text-to-speech, and assign the pipeline to the satellite.2
- Choose and test the wake word (to be decided; Okay Nabu is the likely default), then try a few everyday commands.
- Print case Rev C and do the final assembly.
Glossary
- API (ESPHome native API)
- The network connection ESPHome devices use to talk to Home Assistant; it can be encrypted with a key.
- Assist
- Home Assistant's built-in voice assistant, which turns spoken or typed requests into actions.
- Audio codec
- A chip that converts between digital audio and the analogue signal a speaker or headphone jack uses.
- DSP (digital signal processor)
- A chip built to process audio quickly; on the reSpeaker it is the XMOS XVF3800, which cleans up the microphone sound.
- ESPHome
- Software that builds firmware for ESP32 boards from a text description and links them to Home Assistant.
- ESPHome Device Builder
- ESPHome's web interface for creating, editing and installing device configurations; it runs as a Home Assistant app.
- Firmware
- The program stored on a device's chip that runs whenever it is powered.
- Home Assistant
- Open-source software that runs a smart home locally, here on a Raspberry Pi 5.
- I2C
- A simple two-wire connection that chips on a board use to talk to each other.
- Intent recognition
- The pipeline step that works out what a sentence is asking for, such as "turn on the kitchen light".
- Microcontroller
- A small, single-chip computer that runs one program; here the ESP32-S3 on the XIAO board.
- Micro wake word
- ESPHome's wake word detector that runs on the device itself.
- OTA (over the air)
- Updating a device's firmware over the network instead of a cable.
- Package (ESPHome)
- A reusable block of ESPHome configuration pulled in from another file or a Git repository.
- Pipeline (voice pipeline)
- The chain of steps Assist runs on a request: wake word, speech-to-text, intent recognition, text-to-speech.
- Speech-to-text (STT)
- Turning recorded speech into written text.
- Substitution (ESPHome)
- A named value defined once and reused throughout an ESPHome configuration.
- Text-to-speech (TTS)
- Turning written text into spoken audio.
- Voice Preview Edition
- Home Assistant's own ready-made voice satellite hardware.
- Voice satellite
- A small device with a microphone and speaker that listens for requests and passes them to Home Assistant.
- Wake word
- The spoken phrase that tells a voice device to start listening.
- YAML
- A plain-text format that uses indentation to arrange settings.
Related pages
- What Is Home Assistant?: what Home Assistant is and what it can do.
- Setting Up Home Assistant on a Raspberry Pi: installing Home Assistant OS on the Raspberry Pi that this satellite talks to.
Sources
Accessed October 15, 2026. Version numbers and project details for this build come from the project notes.
- [1]Home Assistant. "Assist: Talk to your smart home with Home Assistant." home-assistant.io/voice_control/
- [2]Home Assistant. "Set up a fully local voice assistant." home-assistant.io/voice_control/voice_remote_local_assistant/
- [3]Home Assistant. "The Home Assistant approach to wake words." home-assistant.io/voice_control/about_wake_word/
- [4]Home Assistant. "Home Assistant Voice Preview Edition." home-assistant.io/voice-pe/
- [5]ESPHome. "Getting Started with ESPHome." esphome.io/guides/getting_started_hassio/
- [6]ESPHome. "Voice Assistant." esphome.io/components/voice_assistant/
- [7]ESPHome. "Micro Wake Word." esphome.io/components/micro_wake_word/
- [8]ESPHome. "YAML Configuration in ESPHome" (secrets and substitutions). esphome.io/guides/yaml/
- [9]ESPHome. "Packages." esphome.io/components/packages/
- [10]ESPHome. "Native API Component." esphome.io/components/api/
- [11]ESPHome. "ESPHome OTA Updates." esphome.io/components/ota/esphome/
- [12]Seeed Studio. "Getting Started with Seeed Studio XIAO ESP32-S3 Series." wiki.seeedstudio.com/xiao_esp32s3_getting_started/
- [13]Seeed Studio. "Getting Started with reSpeaker XVF3800 USB Mic Array." wiki.seeedstudio.com/respeaker_xvf3800_introduction/
- [14]Seeed Studio. "Smart Home Voice Control with Home Assistant with reSpeaker XVF3800." wiki.seeedstudio.com/respeaker_xvf3800_xiao_home_assistant/
- [15]formatBCE. "Respeaker-XVF3800-ESPHome-integration" (README). GitHub. github.com/formatBCE/Respeaker-XVF3800-ESPHome-integration