ESPHome Audio Stack

August 29, 2026 ยท View on GitHub

A full-duplex audio backend for ESPHome voice devices: I2S and codec ownership, software echo cancellation, the complete Espressif AFE pipeline, and standard ESPHome microphone and speaker surfaces on top.

This repository contains three ESPHome components:

ComponentRole
esp_audio_stackOwns the physical audio path: I2S buses, TDM, hardware codecs, DMA, rate/bit-depth/channel conversion, playback buffering, the AEC reference and the audio task. Exposes ESPHome microphone and speaker platforms.
esp_aecStandalone acoustic echo cancellation through Espressif ESP-SR AEC. Light on RAM and flash.
esp_afeFull Espressif Audio Front End: AEC, noise suppression, VAD, AGC and dual-mic Speech Enhancement/BSS, with runtime switches and diagnostics.

Everything above the stack stays normal ESPHome: Voice Assistant, Micro Wake Word, media_player, mixer, resampler, VoIP components or your own C++ consumers. The stack does not replace the ESPHome audio ecosystem; it replaces the hardware/audio ownership layer underneath it that native ESPHome does not provide.

1. What This Is

ESPHome's native i2s_audio microphone and speaker work well when the two are independent devices and no software echo cancellation is needed. Real voice hardware is usually harder than that:

  • one codec owns both the ADC and the DAC on the same I2S bus, so mic and speaker cannot be two independent components;
  • software AEC needs a sample-aligned copy of what the speaker is playing, the playback reference;
  • media playback, TTS, wake word, Voice Assistant and calls all share one speaker and one microphone;
  • codecs speak 24/32-bit slots at 48 kHz while voice pipelines want 16 kHz mono s16;
  • multi-mic boards deliver audio as TDM frames where microphone slots and the hardware echo-reference slot must be extracted at fixed positions.

esp_audio_stack centralizes that layer:

I2S / codec / TDM / MEMS mic / I2S amp
        |
        v
esp_audio_stack
  - owns I2S and codec IO
  - converts rate, bit depth and channel layout
  - builds or captures the speaker reference for AEC/AFE
  - buffers speaker playback
        |
        v
optional processor: esp_aec or esp_afe
        |
        v
normal ESPHome microphone + speaker platforms
        |
        v
Voice Assistant, Micro Wake Word, media player, mixer, VoIP, custom logic

The design contract is deliberate: the stack solves the hardware and signal-processing problem once, then disappears behind interfaces every ESPHome component already understands. Consumers do not know or care whether the audio came from a shared codec bus, a TDM frame, or two separate MEMS/amp buses.

2. What It Gives You

  • Full-duplex audio on one owner. Simultaneous capture and playback on a shared codec bus, on split RX/TX buses, or on a TDM bus, driven by one pinned FreeRTOS task with an explicit runtime state machine: idle, mic, speaker, duplex.
  • Hardware codec control. Built-in esp_codec_dev backends for ES7210, ES8311, ES8388, ES8374 and ES8389, configured from YAML with no custom C++.
  • Format conversion where it belongs. The physical bus can run 48 kHz, 32-bit, stereo or TDM while consumers receive 16 kHz, s16, mono. Rate conversion uses Espressif esp_audio_effects.
  • Every practical AEC reference topology. Software reference from playback (previous_frame or an ADF Type2-style ring_buffer), stereo codec feedback, or a TDM hardware reference slot captured with the microphones.
  • Pluggable processing. processor_id attaches esp_aec or esp_afe behind the microphone surface. They are mutually exclusive by validation.
  • The clean-mic contract. With a configured processor enabled, the ESPHome microphone platform exposes the post-processor stream. If that enabled processor is temporarily unavailable, output fails closed to silence. The optional parent AEC switch is an explicit raw-mic bypass on the same surface; there is no second parallel raw microphone.
  • On-demand hardware lifecycle. One resident audio task is created during setup and parks without polling while idle. I2S channels, DMA and codec paths start when the first consumer appears and stop when the last one leaves. Consumers are reference-counted.
  • Runtime control from Home Assistant. Optional switch, number, binary_sensor and diagnostic sensor platforms expose AEC/AFE controls, mic gain, volume and TDM slot levels.
  • Strict YAML validation. Invalid topologies are refused at compile time: impossible rate conversion, TDM slot collisions, unsupported SoCs, invalid core pinning, mutually exclusive processors and more.
  • Controlled dependencies. Espressif component-manager dependencies use tested exact pins or compatible-version constraints and are documented; the resolved build manifest/lock data identifies the concrete firmware inputs.

3. Scenarios It Covers

Hardware / goalShape
Codec board, full-duplex audio, no echo cancellationesp_audio_stack alone
INMP441 + MAX98357A prototype, simple duplex testesp_audio_stack in dual-bus mode
Single-mic voice device that talks while it playsesp_audio_stack + esp_aec
Voice Assistant + wake word + media + calls on one speakeresp_audio_stack + esp_aec or esp_afe
Noisy room, variable speaker distance, VAD or AGC wantedesp_audio_stack + esp_afe
Dual-mic board with Speech Enhancement/BSSesp_audio_stack TDM + esp_afe
Wake word must keep working while TTS/media playsesp_aec sr_* modes or esp_afe type: sr
Hardware already outputs echo-cancelled PCM, for example XMOSESPHome native audio may be enough; this stack is optional

Supported release targets, enforced by validation:

VariantI2S portsDual-bus modeTDM
ESP32-S32yesyes
ESP32-P43yesyes

esp_audio_stack, esp_aec and esp_afe require the ESPHome psram: component. The maintained and release-tested targets are ESP32-S3 and ESP32-P4. Smaller ESP32 variants are not supported targets for this audio backend.

4. Core Concepts

Bus rate vs output rate. sample_rate is the physical I2S bus and speaker rate. output_sample_rate is the microphone rate handed to consumers. A voice device usually runs a 48 kHz bus with 16 kHz mic output. If output_sample_rate is omitted, no conversion happens. When present, it must divide sample_rate exactly and the ratio must not exceed 6.

The reference. AEC subtracts what the speaker played from what the microphone heard. The topology decides where that playback reference comes from: software (aec_reference), stereo codec feedback (use_stereo_aec_reference), or a TDM slot (use_tdm_reference).

The processor. esp_aec and esp_afe implement one shared AudioProcessor interface. esp_audio_stack feeds them mic frames plus the reference and publishes their output as the microphone stream.

Consumers and lifecycle. While nothing listens, the pre-created audio task is parked and the I2S/DMA/codec path is down. Hardware spins up when the first microphone listener or speaker stream arrives and winds down after the last one leaves; the task's TCB/stack remains allocated for the device lifetime.

The real-time boundary. The audio task runs at high priority, default 19, pinned to core 0 by default. Any C++ callback invoked from it must not block, allocate or do I/O.

5. Installation

Pull only the components your YAML needs.

Full-duplex audio only:

external_components:
  - source: github://n-IA-hane/esphome-audio-stack@v2026.9.0
    components: [esp_audio_stack]

With standalone AEC:

external_components:
  - source: github://n-IA-hane/esphome-audio-stack@v2026.9.0
    components: [esp_audio_stack, esp_aec]

With full AFE:

external_components:
  - source: github://n-IA-hane/esphome-audio-stack@v2026.9.0
    components: [esp_audio_stack, esp_afe]

Requirements:

  • ESP-IDF framework. Arduino is not supported.
  • PSRAM. The component schema requires the ESPHome psram: component so memory-heavy audio paths fail at YAML validation time instead of at runtime.
  • An i2c: bus when a hardware codec is configured.

Espressif dependencies are resolved automatically by the IDF Component Manager. Their source is not stored in this repository. The dual-mic GMF path is fetched from the pinned n-IA-hane/esp-gmf compatibility branch documented below.

6. Hardware Topologies

6.1 Single-Bus Codec

One codec handles both directions on a shared I2S bus. This is the common shape for compact voice boards: one I2C-controlled codec, one I2S port, mic ADC, speaker DAC and optional hardware echo feedback.

i2c:
  sda: GPIO47
  scl: GPIO48
  frequency: 400kHz

esp_audio_stack:
  id: audio_stack
  sample_rate: 48000
  output_sample_rate: 16000
  bits_per_sample: 32
  slot_bit_width: 32

  i2s_mclk_pin: GPIO5
  i2s_bclk_pin: GPIO6
  i2s_lrclk_pin: GPIO7
  i2s_din_pin: GPIO4
  i2s_dout_pin: GPIO8

  codec:
    input:
      type: es8311
      address: 0x18
    output:
      type: es8311
      address: 0x18

If the codec supports digital DAC feedback, prefer the stereo reference over the software one.

6.2 Dual-Bus, No Codec

One I2S peripheral reads the microphone, another drives the speaker amplifier. Typical parts: INMP441 or ICS MEMS mic plus MAX98357A-class I2S amp. Requires an SoC with at least two I2S ports.

esp_audio_stack:
  id: audio_stack
  sample_rate: 48000
  output_sample_rate: 16000
  bits_per_sample: 32
  slot_bit_width: 32

  rx_bus:
    i2s_num: 0
    i2s_bclk_pin: GPIO12
    i2s_lrclk_pin: GPIO13
    i2s_din_pin: GPIO11

  tx_bus:
    i2s_num: 1
    i2s_bclk_pin: GPIO9
    i2s_lrclk_pin: GPIO10
    i2s_dout_pin: GPIO14

  rx_slot_mode: stereo
  mic_channel: right

  # Lightweight software reference. Use ring_buffer when the enclosure needs
  # a delay-tunable AEC reference.
  aec_reference: previous_frame

Rules enforced at validation: rx_bus and tx_bus must be configured together, must use different i2s_num values, and top-level I2S data pins must not be set alongside them. Dual-bus mode does not support TDM. There is no hardware feedback channel in this topology, so AEC uses the software reference.

6.3 TDM Codec With Hardware Reference

Multi-slot TDM input through an ADC codec, with the speaker DAC feedback occupying one slot. This is the strongest software-AEC topology available: the reference is captured by hardware in the same TDM frame as the microphones.

Single mic plus hardware reference:

esp_audio_stack:
  id: audio_stack
  processor_id: afe_processor
  sample_rate: 48000
  output_sample_rate: 16000
  bits_per_sample: 32
  slot_bit_width: 32

  i2s_mclk_pin: GPIO5
  i2s_bclk_pin: GPIO6
  i2s_lrclk_pin: GPIO7
  i2s_din_pin: GPIO4
  i2s_dout_pin: GPIO8

  use_tdm_reference: true
  tdm_total_slots: 4
  tdm_mic_slot: 0
  tdm_ref_slot: 2
  tdm_tx_slot: 0

  codec:
    input:
      type: es7210
      address: 0x40
    output:
      type: es8311
      address: 0x18

Dual mic plus hardware reference for Speech Enhancement/BSS:

esp_afe:
  id: afe_processor
  type: sr
  mode: low_cost
  mic_num: 2
  se_enabled: true
  input_format: mmr
  aec_enabled: true
  ns_enabled: false
  agc_enabled: false

esp_audio_stack:
  id: audio_stack
  processor_id: afe_processor
  sample_rate: 48000
  output_sample_rate: 16000

  tdm_total_slots: 4
  tdm_mic_slots: [0, 2]
  use_tdm_reference: true
  tdm_ref_slot: 1
  tdm_tx_slot: 0

Slot numbers are zero-based physical TDM slots. The reference slot must differ from every mic slot, and tdm_total_slots must exceed the highest index in use. Use the schematic, and when in doubt use per-slot level sensors to find the slot that moves during playback.

7. Echo Cancellation Reference Topologies

7.1 Software Reference

When no hardware feedback exists, the stack derives the reference from the speaker playback path.

ModeWhat it doesCostUse it when
ring_bufferStores converted speaker TX frames in an Espressif ADF Type2-style ring buffer. Capacity is aec_reference_buffer_ms, default 80 ms, range 32 to 500.More RAM and one ring read/write per frame.No-codec enclosures where acoustic delay needs tuning or previous_frame leaves echo.
previous_frameConverts the latest speaker TX frame to the processor rate and reuses it as the next AEC reference frame.Lowest RAM and smallest compiled path. No delay tuning.Battery devices, simple prototypes, or tested layouts where the speaker/mic path is already close enough.

This mode is ignored automatically when a stereo or TDM reference is configured.

7.2 Stereo Codec Feedback

ES8311-class codecs can route DAC output back as the second ADC channel. The stack reads stereo input where one channel is the user's microphone and the other is the playback reference.

esp_audio_stack:
  id: audio_stack
  processor_id: aec_processor
  num_channels: 2
  use_stereo_aec_reference: true
  reference_channel: right

  codec:
    input:
      type: es8311
      address: 0x18
      no_dac_ref: false
    output:
      type: es8311
      address: 0x18
      no_dac_ref: false

This is the recommended AEC topology on ES8311 boards.

7.3 TDM Hardware Reference

TDM hardware reference is described in section 6.3. It is sample-aligned by hardware, supports one or two microphone slots, and is the required shape for dual-mic BSS with a real reference.

use_stereo_aec_reference and use_tdm_reference are mutually exclusive. A board has one hardware reference topology at a time, and the validator enforces it.

One common confusion: the AFE R channel does not have to be a physical slot. The processor is always fed a reference buffer; the topology only decides whether that buffer comes from hardware or from the playback stream.

8. Processors

8.1 esp_aec: Standalone Echo Cancellation

esp_aec wraps ESP-SR AEC as a minimal AudioProcessor. It is fixed at 16 kHz.

esp_aec:
  id: aec_processor
  sample_rate: 16000
  mode: sr_low_cost
  filter_length: 4

esp_audio_stack:
  id: audio_stack
  processor_id: aec_processor
ModeUse case
sr_low_costBest starting point for Voice Assistant and Micro Wake Word.
sr_high_perfStronger SR AEC, with more internal memory pressure.
fd_low_cost / fd_high_perfFull-duplex modes with NLP for codec targets where residual speaker echo is audible.
voip_low_cost / voip_high_perfVoIP-oriented suppression. Can hurt wake-word detection.

The mode can be switched at runtime with esp_aec.set_mode.

8.2 esp_afe: Full Audio Front End

esp_afe wraps Espressif AFE: the single-mic path calls ESP-SR directly, while the dual-mic path uses the GMF AFE element. Both expose AEC, noise suppression, VAD, AGC and, where supported, dual-mic Speech Enhancement/BSS.

esp_afe:
  id: afe_processor
  type: sr
  mode: low_cost
  mic_num: 1
  aec_enabled: true
  ns_enabled: true
  vad_enabled: false
  agc_enabled: true

esp_audio_stack:
  id: audio_stack
  processor_id: afe_processor
TypeUse case
srSpeech recognition profile. Right default for assistant devices.
vcVoice communication profile with stronger residual suppression.
fdFull-duplex pipeline with NLP baked in, for two-way speech.

Dual-mic Speech Enhancement requires mic_num: 2, se_enabled: true, two mic slots on a TDM board, and an input_format matching the ESP-SR channel order of your board port.

input_format letters:

LetterMeaning
MMicrophone channel
NUnknown/unused channel, usually zero or ignored by the pipeline
RPlayback reference channel for AEC

Supported values are auto, mr, mnr, mmr, mmnr. Leave it on auto unless porting a known board topology.

esp_aec and esp_afe are mutually exclusive in one firmware.

9. Microphone and Speaker Surfaces

9.1 Microphone

microphone:
  - platform: esp_audio_stack
    id: clean_mic
    esp_audio_stack_id: audio_stack

The platform publishes mono s16 audio at output_sample_rate. When processor_id is configured and enabled, this is the post-processor stream. Disabling the parent stack's AEC switch explicitly bypasses the processor and publishes the converted raw mic on the same surface. Feed it to normal ESPHome consumers:

micro_wake_word:
  microphone: clean_mic
  models:
    - model: okay_nabu

voice_assistant:
  microphone: clean_mic
  media_player: speaker_media_player
  micro_wake_word: mww

During TTS or media playback, wake word keeps working because the speaker signal has been subtracted. During a call, the assistant reacts to the person in the room, not to the remote caller's voice coming out of the speaker.

9.2 Speaker

speaker:
  - platform: esp_audio_stack
    id: speaker_out
    esp_audio_stack_id: audio_stack
    sample_rate: 48000
    bits_per_sample: 16
    buffer_duration: 500ms

The speaker accepts 16-bit PCM, one or two channels, 8 to 48 kHz, and plays at the bus rate. Combine it with ESPHome resampler and mixer speakers upstream when multiple sources at multiple rates share the output.

10. Lifecycle, Automations and Runtime Entities

Runtime state is one of idle, mic, speaker, duplex.

TriggerFires when
on_start / on_idleThe stack leaves / returns to idle.
on_stateAny state change. The new state is passed as a string.
on_mic_start / on_mic_idleCapture starts / stops.
on_speaker_start / on_speaker_idlePlayback starts / stops.
on_amplifier_required / on_amplifier_idleSpeaker-path aliases for GPIO amp control.
esp_audio_stack:
  id: audio_stack
  on_amplifier_required:
    then:
      - output.turn_on: speaker_enable
  on_amplifier_idle:
    then:
      - output.turn_off: speaker_enable

Actions and conditions:

ItemMeaning
esp_audio_stack.startStart the audio path explicitly.
esp_audio_stack.stopRequest a stop.
esp_audio_stack.is_idleCondition true when the stack is idle.

Runtime entities:

switch:
  - platform: esp_audio_stack
    esp_audio_stack_id: audio_stack
    aec:
      name: Echo Cancellation
      restore_mode: RESTORE_DEFAULT_ON

number:
  - platform: esp_audio_stack
    esp_audio_stack_id: audio_stack
    master_volume:
      name: Master Volume
      speaker_id: speaker_out
    mic_gain:
      name: Mic Gain

AFE switches:

switch:
  - platform: esp_afe
    esp_afe_id: afe_processor
    aec:
      name: Echo Cancellation
    ns:
      name: Noise Suppression
    vad:
      name: Voice Activity Detector
    agc:
      name: Auto Gain Control

TDM slot sensors exist to answer the common bring-up question empirically: play music, watch which slot moves, and you have found your reference slot; speak, and you have found the mic slots.

11. Configuration Reference

All values are verified against the component schema.

Core Audio

OptionDefaultRange / valuesMeaning
sample_rate160008000 to 48000Physical I2S bus and speaker rate.
output_sample_ratesample_rate8000 to 48000Microphone rate exposed to consumers. Must divide sample_rate, ratio at most 6.
bits_per_sample1616, 24, 32Sample container on the bus.
slot_bit_widthautoauto, 16, 24, 32Physical slot width.
num_channels11, 2Physical channel count on the standard I2S bus.
speaker_channels11, 2Playback channels. Two channels require standard I2S and num_channels: 2.
mic_channelleftleft, rightWhich stereo slot carries the mic when RX is stereo.
rx_slot_modemonomono, stereoRead one or both stereo slots on RX.
tx_channelleftleft, rightTX slot placement in mono-on-stereo layouts.
correct_dc_offsetfalseboolRemove DC bias from capture.
input_gain1.00.01 to 32.0Digital gain before the processor.
master_volume_min_dbcodec-dependent-96.0 to 0.0Bottom of the volume curve.

I2S Bus

OptionDefaultRange / valuesMeaning
i2s_num0SoC port indexI2S peripheral for single-bus mode.
i2s_lrclk_pin, i2s_bclk_pinrequiredGPIOBus clocks.
i2s_mclk_pin-1GPIO or -1Master clock.
i2s_din_pin, i2s_dout_pin-1GPIOData in / data out.
i2s_modeprimaryprimary, secondaryClock master or slave.
i2s_comm_fmtphilipsphilips, msb, pcm_short, pcm_longFrame format. PCM short/long are TDM-only.
mclk_multiple256128, 256, 384, 512MCLK to sample-rate ratio.
use_apllfalseboolAPLL clock source. In the maintained target set, only ESP32-P4 supports it.
rx_bus / tx_busnoneobjectDual-bus mode with separate I2S controllers.
dma_desc_num62 to 16DMA descriptor count.
dma_frame_numauto64 to 4092Frames per descriptor.

Processor and Reference

OptionDefaultRange / valuesMeaning
processor_idnoneidAttach esp_aec or esp_afe.
aec_referencering_bufferring_buffer, previous_frameSoftware reference mode. Ignored when stereo/TDM reference is active.
aec_reference_buffer_ms8032 to 500Ring capacity for ring_buffer.
use_stereo_aec_referencefalseboolStereo codec DAC feedback as reference.
reference_channelleftleft, rightWhich stereo channel carries the feedback.
use_tdm_referencefalseboolA TDM input slot carries the hardware reference.
tdm_total_slots42 to 8Slots in the physical TDM frame.
tdm_mic_slot00 to 7Single mic slot.
tdm_mic_slotsnonelist of 1 or 2Multi-mic slot list. Enables TDM bus.
tdm_ref_slot10 to 7Reference slot. Must differ from mic slots.
tdm_tx_slot00 to 7Playback slot.

Codec Block

OptionValuesNotes
input.typees7210, es8311, es8388, es8374, es8389ADC side.
output.typees8311, es8388, es8374, es8389DAC side.
addressI2C addressDefaults: ES7210 0x40, ES8311 0x18, others 0x20.
gain_db0.0 to 37.5Analog mic gain.
mic_selectedbitmaskES7210 ADC channel mask, default 0x0F.
ref_channel / ref_gain_dbchannel / dBES7210 reference routing and gain.
use_mclkboolES8311/ES8389 clocking mode.
no_dac_refboolSet ES8311 input side to false for stereo DAC feedback.

Task, Memory and Diagnostics

OptionDefaultRange / valuesMeaning
task_priority191 to 24Audio task priority.
task_core0-1 to 1Core pinning. Core 1 is rejected on single-core SoCs.
task_stack_size81924096 to 32768Audio task stack.
buffers_in_psramfalseboolMove non-DMA audio buffers to PSRAM.
audio_task_stack_in_psramfalseboolMove the audio task stack to PSRAM through ESPHome's PSRAM task-stack helper. Requires the psram component.
aec_ref_ring_in_psramfalseboolPut the Type2 reference ring in PSRAM.
telemetryfalseboolPer-stage cycle counting and diagnostics. Debug only.
telemetry_log_interval_frames1281 to 8192Telemetry log cadence.
audio_effects.rate_cvt_complexity31 to 3Rate converter quality/CPU trade-off.
audio_effects.rate_cvt_perf_typespeedspeed, memoryRate converter optimization target.

Full per-component references:

12. What The Validator Refuses

Audio bring-up failures are miserable to debug at runtime, so this component front-loads many of them into YAML compilation. It rejects:

  • sample_rate not divisible by output_sample_rate, or ratio above 6;
  • TDM mic/reference slot collisions, duplicate mic slots, or too few total slots;
  • use_tdm_reference together with use_stereo_aec_reference;
  • speaker_channels: 2 on TDM or without num_channels: 2;
  • pcm_short / pcm_long outside TDM mode;
  • rx_bus without tx_bus, both on the same i2s_num, top-level bus pins mixed with dual-bus mode, or dual-bus on a target without enough I2S ports;
  • I2S port numbers beyond the target SoC;
  • TDM options on SoCs without TDM support;
  • task_core: 1 on single-core variants;
  • use_apll on variants without APLL;
  • esp_aec and esp_afe in the same firmware;
  • esp_afe feed and fetch tasks pinned to the same core;

If your YAML compiles, the topology is at least physically coherent for your chip.

13. Performance And Memory Notes

  • ESP Audio Stack profiles require PSRAM; the supported targets are ESP32-S3 and ESP32-P4.
  • DMA descriptors and I2S buffers always live in internal RAM.
  • esp_aec is the lighter path.
  • esp_afe costs more RAM and flash and gives the full speech front end plus diagnostics.
  • PSRAM placement options trade internal-RAM headroom for latency. Enable them individually only when memory pressure is real.
  • Keep logger.level: INFO on release firmware. telemetry and DEBUG logging are diagnostic tools; per-frame logging on the audio core can itself cause audio glitches.

14. Examples

FileShows
examples/01-esp-audio-stack-only.yamlCodec-backed full-duplex mic/speaker, no processing.
examples/02-esp-audio-stack-aec.yamlThe same base with esp_aec.
examples/03-esp-audio-stack-afe.yamlThe same base with esp_afe.

The examples are intentionally minimal. Product YAMLs layer mixer, resampler, media player, wake word, Voice Assistant, display and call logic on top.

15. Provenance, Dependencies And License

This repository was extracted from the maintained n-IA-hane/esphome-intercom codebase, where this stack is the audio backend of a full SIP intercom platform and is exercised on real ES8311, ES7210/ES8311, ESP32-S3 and ESP32-P4 hardware. SOURCE.md records the initial extraction provenance; later repository commits are tracked by this repository's own history.

Espressif dependencies and their pins:

  • esp_codec_dev 1.5.10 for codec control;
  • esp_audio_effects 1.3.0~1 for rate, bit-depth and layout conversion;
  • esp-dsp ^1.8.0 and esp-sr ^2.4.6 for the processors;
  • dual-mic gmf_ai_audio from the pinned n-IA-hane/esp-gmf ref gmf-ai-audio-esp-sr-2.4.6.

These constraints are part of the tested build contract. Update them only with schema, firmware and real-device validation; they are not automatically removed after board bring-up.

This repository is MIT-licensed. Espressif dependencies keep their own licenses and hardware restrictions; dependency source is fetched at build time rather than stored in this repository.