On 16 October 2026 ESPHome merged full duplex support for the i2s_audio component. A microphone and a speaker that share one I2S port can run together when you set full_duplex: true on that bus. Until now starting one side locked the other out, so a voice device with a single external audio codec could not listen while it played a reply.
The change landed on the dev branch (version string 2026.11.0-dev) as pull request #19959 by Remco van Essen, with documentation merged the same day. A follow-up fix on 17 October stopped a restart loop that left the speaker silent on some full duplex boards.
What changes in the firmware
ESP-IDF only shares bit and word clocks between a TX and an RX channel when both are allocated in one call. The I2S bus now creates those two channels once during setup and keeps them for the life of the device. The microphone and speaker borrow the RX or TX channel when they start and hand it back when they stop. The RX side keeps the shared clocks running whenever either side is active, so playback still works if the mic is idle, and the other way around.
Because the channel is configured only once, the speaker must receive audio in exactly the configured sample rate, bit depth and channel layout. Streams in any other format are rejected with a clear log line. Put a resampler speaker in front of it to convert media to that fixed format. The same constraint applies to wake-word and voice-assistant capture: a resampler microphone can downsample a 48 kHz bus mic to 16 kHz mono while the media path stays at the bus rate.
Validation refuses unsafe mixes. A full duplex bus needs exactly one standard (non-PDM) i2s_audio microphone, at least one external-DAC speaker, matching sample_rate, bits_per_sample, i2s_mode, use_apll and mclk_multiple on both sides, and matching output pin, channel and communication format across every speaker that shares the one TX channel. Leave full_duplex unset and the old exclusive behaviour stays; the new code is not compiled in.
Who it is for
Builders of ESP32 voice satellites and small wall panels that use one I2S codec for both the mic and the speaker are the main audience. Those boards could already play Assist replies or media, but barge-in and continuous listening needed a second audio path or a second chip. Full duplex removes that hardware split for ESP-IDF builds. Arduino-framework ESP32 boards are outside this path.
The feature is in the development tree for the 2026.11 release. To try it before the stable tag, install the dev ESPHome channel or wait for the monthly beta, then add full_duplex: true to the shared i2s_audio bus and wire microphone and speaker through resamplers where the rates differ.