Project status: in progress

Home Assistant Voice Satellite (In Progress): reSpeaker XVF3800 + XIAO ESP32-S3

A do-it-yourself voice satellite for Home Assistant's Assist, built from a Seeed reSpeaker XVF3800 microphone board and a Seeed XIAO ESP32-S3, running ESPHome. This write-up documents the project as it stands on October 15, 2026. The project is in progress: the board is soldered, the configuration is written, and the first firmware build has started.

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

How the satellite and Home Assistant share the work The satellite hears the wake word and streams the request over Wi-Fi to Home Assistant on the Raspberry Pi. Home Assistant runs speech-to-text, intent handling and text-to-speech, then sends the spoken reply back to the satellite to play. The satellite (this project) 1. Microphones pick up sound 2. XVF3800 chip cleans the audio 3. ESP32-S3 hears the wake word 4. Streams your request 8. Plays the spoken reply LED ring shows what it is doing (listening, thinking, replying) Home Assistant (Pi 5) 5. Speech-to-text 6. Intent handling: work out the request and act on it 7. Text-to-speech: make the spoken reply The engines are chosen per pipeline (still to be decided) voice audio over Wi-Fi spoken reply over Wi-Fi
Figure 1. Division of work between the satellite and Home Assistant, drawn for this page from Home Assistant's description of an Assist pipeline and the project's component list.215

↑ Top

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

↑ Top

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.

Table 1. Parts used, as listed in the project notes, with general facts from the manufacturers' pages.
PartWhat it isIts job here
Seeed Studio reSpeaker XVF3800 USB 4-Mic Array, bare board V1.1A 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.13The 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.13Cleans 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.13Drives 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.12The satellite's brain: runs ESPHome, detects the wake word, and talks to Home Assistant.
u.FL Wi-Fi antennaA small external antenna that clips onto the XIAO's tiny u.FL connector. Seeed cites a range of over 100 m with it attached.12Must 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 caseA 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

↑ Top

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.

  1. 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).
  2. Attach the antenna to the XIAO's u.FL connector. It must be attached for Wi-Fi to work properly.
  3. Connect the speakers to the reSpeaker's 3.5 mm jack. The speakers take their own power over USB.
  4. Fit everything into the case (planned; see below).
Layout of the boards and connections, seen from the back (component side) The round reSpeaker board has its USB-C power port and 3.5 millimetre jack on one edge. The XIAO ESP32-S3 is soldered to the back at the opposite edge, shield up, with its own USB-C port facing outward and the antenna attached. A 5 volt USB-C supply plugs into the reSpeaker. USB-powered speakers plug into the jack. reSpeaker XVF3800 (back, component side) USB-C jack XIAO ESP32-S3 shield up u.FL Wi-Fi antenna must be attached XIAO USB-C: used for the first flash from the computer 5 V USB-C supply powers both boards Computer speakers USB-powered, 3.5 mm plug
Figure 2. Board layout seen from the back (component side), drawn for this page from the project notes. Not to scale.

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:

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.

↑ Top

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:

Table 2. The five packages, from the project README.15
PackageWhat it sets up
baseThe 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.
hardwareMicrophones, speaker output, the audio codec, and the XVF3800 itself, including a copy of its firmware.
voice-assistantOn-device wake word detection (micro wake word), the voice assistant connection, and a media player for replies and announcements.
ledsThe LED ring animations that show what the satellite is doing.
timers-alarmVoice 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:

ESPHome Device Builder editing the respeaker-xvf3800-assistant device. Left: the device navigator. Centre: the OTA updates section with its password field blacked out. Right: the YAML configuration with substitutions, five packages from the formatBCE GitHub repository, and wifi, api and ota blocks that use !secret references.
Figure 3. The device configuration in the ESPHome Device Builder. The password field has been blacked out and the Home Assistant sidebar cropped away. The YAML on the right contains only !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:

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.

↑ Top

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:

  1. The XIAO ESP32-S3 is soldered to the reSpeaker and its antenna is attached.
  2. The formatBCE project repository was saved to a Windows PC as a zip, for reference.
  3. The ESPHome Device Builder app is installed in Home Assistant.
  4. A secrets.yaml file with the Wi-Fi details, API encryption key and OTA password has been created.
  5. The device respeaker-xvf3800-assistant has been created in the Device Builder (ESP32-S3, Generic ESP32-S3 Board), with the project's example configuration.
  6. 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:

Known issues

7. Next steps

  1. 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.
  2. 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
  3. 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.flash action if they differ.15
  4. 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
  5. Choose and test the wake word (to be decided; Okay Nabu is the likely default), then try a few everyday commands.
  6. Print case Rev C and do the final assembly.

↑ Top

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.

Sources

Accessed October 15, 2026. Version numbers and project details for this build come from the project notes.

  1. [1]Home Assistant. "Assist: Talk to your smart home with Home Assistant." home-assistant.io/voice_control/
  2. [2]Home Assistant. "Set up a fully local voice assistant." home-assistant.io/voice_control/voice_remote_local_assistant/
  3. [3]Home Assistant. "The Home Assistant approach to wake words." home-assistant.io/voice_control/about_wake_word/
  4. [4]Home Assistant. "Home Assistant Voice Preview Edition." home-assistant.io/voice-pe/
  5. [5]ESPHome. "Getting Started with ESPHome." esphome.io/guides/getting_started_hassio/
  6. [6]ESPHome. "Voice Assistant." esphome.io/components/voice_assistant/
  7. [7]ESPHome. "Micro Wake Word." esphome.io/components/micro_wake_word/
  8. [8]ESPHome. "YAML Configuration in ESPHome" (secrets and substitutions). esphome.io/guides/yaml/
  9. [9]ESPHome. "Packages." esphome.io/components/packages/
  10. [10]ESPHome. "Native API Component." esphome.io/components/api/
  11. [11]ESPHome. "ESPHome OTA Updates." esphome.io/components/ota/esphome/
  12. [12]Seeed Studio. "Getting Started with Seeed Studio XIAO ESP32-S3 Series." wiki.seeedstudio.com/xiao_esp32s3_getting_started/
  13. [13]Seeed Studio. "Getting Started with reSpeaker XVF3800 USB Mic Array." wiki.seeedstudio.com/respeaker_xvf3800_introduction/
  14. [14]Seeed Studio. "Smart Home Voice Control with Home Assistant with reSpeaker XVF3800." wiki.seeedstudio.com/respeaker_xvf3800_xiao_home_assistant/
  15. [15]formatBCE. "Respeaker-XVF3800-ESPHome-integration" (README). GitHub. github.com/formatBCE/Respeaker-XVF3800-ESPHome-integration

↑ Top