Voice_agent audio is silent on M5Stack CoreS3 (AW88298 + ES7210)

Category Details
Environment Board: M5Stack CoreS3 (AW88298 speaker amp + ES7210 mic codec)
Project components/livekit/examples/voice_agent
LiveKit Component livekit/livekit=0.3.6
ESP-IDF v5.5.3
Toolchain Windows + idf.py
Codec Board Type CONFIG_LK_EXAMPLE_CODEC_BOARD_TYPE="M5Stack_CoreS3"
Goal Run voice_agent example and hear remote AI agent voice via built-in speaker
Actual Behavior - WiFi + LiveKit connection works (Room state: Connected)
  • Audio subscription created (codec=9, sample_rate=16000, ch=1)
  • Audio frames received/decoded; I2S writes called continuously
  • PCM data has reasonable amplitude (max_abs 5k–17k)
  • Speaker is completely silent (same audio audible on browser client)|
    |Hardware Verification|Separate firmware successfully plays beeps/tones on CoreS3 speaker; hardware path (AXP2101 + AW9523 + AW88298) is functional|
    |Audio Configuration|Board: M5Stack_CoreS3
    I2C: SDA=12, SCL=11
    I2S: MCLK=0, BCLK=34, WS=33, DIN=14, DOUT=13
    Out: Codec=AW88298, PA=-1, use_mclk=1, pa_gain=3
    In: Codec=ES7210
    Mode: TDM (Mono/Stereo slot tested)|

|Key Questions|

  1. Is voice_agent expected to work on CoreS3 (AW88298) or only ES8311 boards?
  2. Is there a missing config in board_cfg.txt (I2S mode, slots, channel mask, AW88298 specifics)?
  3. Can a working board_cfg, AW88298 init steps, and mono/stereo config be shared?
  4. Should the user switch to an officially supported ES8311 board (e.g., ESP32-S3-Korvo-2)?|
    |Offer|Full serial logs and source files (board.c, codec_init.c, i2s_render.c) available upon request|

Log excerpt

text

Sub audio stream: codec=9, sample_rate=16000, ch=1

I (7028) livekit_engine: Opus payload first 4 bytes: 78 07 c9 79 (size=55)

I (7029) livekit_engine: Sub audio frames received: 1 (size=55, voice=1, ret=0)

Get samplerate 16000 chanel 2

I (7036) AV_RENDER: ARender Auto pause audio first frame …

I (7042) I2S_RENDER: reapply out unmute+vol(100) at write #1

I (7045) I2S_RENDER: write #1 size=2560 max_abs=1 peak=1

I (7050) I2S_RENDER: first 8 samples: 0 0 0 0 0 0 0 0

I (45631) I2S_RENDER: write #98 size=2560 max_abs=5602 peak=5602

I (45676) I2S_RENDER: write #99 size=2560 max_abs=10420 peak=10420

I (45721) I2S_RENDER: write #100 size=2560 max_abs=13022 peak=13022

This is a duplicate of this that is already answered: