Audio on ESPHome devices has mostly meant I2S: an amplifier or DAC board for output and a MEMS microphone for input, wired to the right pins. A new usb_audio component adds another route. An ESP32 with a USB OTG port can act as a USB host for USB Audio Class devices: sound cards, USB DACs, USB microphones and speakerphones. GitHub user ab-tools opened the pull request in November 2025, and J. Nick Koston (bdraco) merged it into the development branch on 19 October at 05:45 Polish time. It closes a feature request from August 2024 and is aimed at ESPHome 2026.11. The documentation pull request is still open.
Which chips and what it does
It needs an ESP32 variant with USB OTG: the ESP32-S2, ESP32-S3, ESP32-S31, ESP32-P4 or ESP32-H4. Under the hood it uses Espressif's usb_host_uac driver and loads the usb_host component, so it can share the port with other USB host components such as usb_uart.
There are two platforms. The usb_audio speaker plays to the device and passes volume and mute to it when the device has those controls; if it does not, ESPHome logs a warning and the setting does nothing. The usb_audio microphone records from it. Each usb_audio block handles one speaker and one microphone.
usb_audio:
speaker:
- platform: usb_audio
id: usb_speaker
sample_rate: 48000
bits_per_sample: 16bit
num_channels: 2
microphone:
- platform: usb_audio
id: usb_mic
sample_rate: 16000
bits_per_sample: 16bit
num_channels: 1
For music and announcements, the docs pair the USB speaker with the existing speaker media player and a mixer speaker. Voice Assistant and Micro Wake Word expect 16 kHz audio, so if a USB microphone does not offer that rate, you record at a rate it does support and put a resampler microphone in front of the voice components.
One format per stream
Each stream runs in one fixed format: a sample rate from 8,000 to 96,000 Hz, 8, 16, 24 or 32 bits, and mono or stereo. The speaker defaults to 48 kHz, 16-bit stereo and the microphone to 16 kHz, 16-bit mono. If the device does not support the format you set, the stream does not start and the formats it does support appear in the log. Devices that pad 24-bit samples into 4 bytes are not supported in that format.
On the ESP32-S2 and ESP32-S3, the USB controller has 800 bytes of usable FIFO memory for all USB packets. A 48 kHz 16-bit stereo speaker already needs ESP-IDF 5.5 or later, and a combination that does not fit at all, such as a 96 kHz 32-bit stereo speaker plus a microphone in the same format, fails validation.
Gaps and limits
- Flash writes stall the task that keeps audio queued on the bus, so you hear a short gap. The docs name the Safe Mode boot counter, which is written about a minute after each boot, saved preferences and OTA updates.
- A stream takes about a second to start on the USB device.
- You can plug the device in and pull it out while ESPHome runs. The speaker stops playing when it disappears, and the microphone resumes streaming when it comes back.
- The docs repeat the usual warning that audio components use a lot of RAM and CPU and that Bluetooth components are known to cause trouble alongside them.
The pull request adds automated tests, but its checklist leaves unticked the box saying the change was tested locally. Treat it as a first version until the beta reports come in.