# 2025-11-21 Kapi_Rtc 音频/RTC 问题分析与烧录测试总结

## 概览
- 目标：修复开机播报“尖锐/刺耳”、欢迎语速度异常；保证火山 RTC 入房稳定，避免设备重启；比较 Airhub_Rtc_h 参考实现。
- 结论：问题核心在“开机阶段单声道 PCM 直接写入立体声 I2S 槽”的通道不匹配。保持设备端立体声输出以保证 RTC 连接稳定，同时在软件层将单声道复制为双声道即可消除“尖锐”。

## 关键事实与参数
- 开机 P3 资产参数（生成规格）：采样率 `16000 Hz`、帧时长 `60 ms`、声道 `单声道`、编码 `OPUS`。
- RTC下行音频参数：
  - OPUS：采样率 `16000 Hz`、帧时长 `60 ms`、单声道（`main/protocols/volc_rtc_protocol.cc:304-320`）。
  - PCM：采样率 `8000 Hz`、帧时长 `20 ms`、单声道（同上，`downlink_is_pcm_` 为真时）。
- 设备端编解码器（ES8311）初始化：默认立体声槽与双通道输出更稳定。
  - 输出通道：`output_channels_ = 2`（`main/audio_codecs/es8311_audio_codec.cc:12-15`）。
  - I2S 槽：`slot_mode = STEREO`、`slot_mask = BOTH`（`main/audio_codecs/es8311_audio_codec.cc:105-109`）。

## 今日修改与实现
- 在开机阶段的“非管线路径”增加单声道→立体声复制，避免直接将单声道 PCM 写入立体声槽：
  - 代码位置：`main/application.cc:1224-1230`。
  - 逻辑：当 `codec->output_channels()==2` 时，将 `pcm` 复制为交错的 `stereo`（L=R）后输出；否则原样输出。

## 现象与测试过程
- 开机播报尖锐（问题初始）：
  - 路径：开机阶段未启用播放管线，走直接输出（`main/application.cc:1224-1230`）。
  - 原因：单声道 PCM 与设备端立体声槽不匹配，导致通道/槽打包伪像，主观听感“尖锐”。
  - 资产引用：
    - 触发播放：`main/application.cc:531`（`PlaySound(Lang::Sounds::P3_LALA_KAIJIBOBAO);`）。
    - 资产绑定：`main/assets/lang_config.h:275-280`（`LALA_kaijibobao.p3` 二进制绑定）。
    - 文件：`main/assets/zh-CN/LALA_kaijibobao.p3`、`main/assets/zh-CN/LALA_lianjiewangluo.p3`。

- 修复后（非管线分支 L/R 复制）：
  - 结果：开机播报“尖锐”消失；欢迎语与 RTC 对话不受影响。
  - 说明：开机阶段保留 `OpusResampler` 的 16k→设备输出采样率（常为 24k）重采样质量，避免最近邻重采样造成伪像。

- 测试方案 A：尝试将设备端改为单通道/单声道 I2S 槽（MONO）：
  - 修改：`main/audio_codecs/es8311_audio_codec.cc:13-14` 将输出通道 `2→1`；`110-111` 将 `STEREO→MONO`（左槽）。
  - 现象：RTC 入房超时，日志显示：
    - `VolcRtcProtocol: Wait connect bits=0x0 free_heap=...` 与 `RTC连接超时`（`main/protocols/volc_rtc_protocol.cc:212-216`，终端选中行 Terminal#296-297）。
  - 分析：RTC SDK 音频通道初始化/握手更依赖“标准立体声 I2S 时序”，MONO 改动改变 WS 宽度与槽掩码，仅跑一个槽，导致 SDK 不置位连接成功事件（`VOLC_MSG_CONNECTED` 未触发，`main/protocols/volc_rtc_protocol.cc:260-266`），最终超时。
  - 结论：在当前 SDK/驱动组合下，保持立体声输出更稳；不建议在开机阶段强行改为 MONO 以避免连接不稳定。

- 测试方案 B：将 P3 资产改为双声道 OPUS（16kHz/60ms）：
  - 可行性：解码后直接生成双声道 PCM，与立体声槽完全匹配；即使直接输出也不会“尖锐”。
  - 代价：资产体积与解码开销增加，RTC 下行仍是单声道；属于“资源换兼容”，与当前 RTC 参数不匹配，无额外协同收益。
  - 结论：不推荐作为常规方案。

## 原理解释与定位
- 为什么开机解码是单声道 PCM：
  - P3 资产与解码器均为单声道配置（`SetDecodeSampleRate(16000,60)`，`main/application.cc:269-292`）。
- 为什么立体声输出更稳：
  - 设备端 ES8311 默认按立体声槽/双通道配置，I2S 时钟/槽时序与 DMA 工作稳定性更好；RTC SDK 在连接阶段可能验证或依赖该时序，MONO 改动会破坏这些假设。
- 为什么对齐 RTC 参数并不能单独解决尖锐：
  - 开机 P3 资产已与 RTC OPUS 参数一致（16k/60ms/单声道），问题不在采样率/帧长，而在“声道与 I2S 槽模式的匹配”。

## 代码引用（便于定位）
- 开机资产播放触发：`main/application.cc:531`。
- 资产二进制绑定：`main/assets/lang_config.h:275-280`。
- 直接输出路径与修复点：`main/application.cc:1224-1230`。
- ES8311 通道与槽配置：`main/audio_codecs/es8311_audio_codec.cc:12-15`、`105-111`、`171-179`。
- RTC 连接等待与事件位：`main/protocols/volc_rtc_protocol.cc:212-216`（等待位）、`260-266`（连接事件）。
- RTC 下行类型与采样率识别：`main/protocols/volc_rtc_protocol.cc:304-320`。

## 建议与结论
- 保持设备端立体声输出（保证 RTC 入房稳定）。
- 保持资产单声道与 RTC 单声道一致；在软件层面针对未启用管线的播放路径增加单声道→立体声复制（已实现）。
- 不建议将 P3 资产改为双声道；如确有需要，也应评估体积/性能影响。
- 若要在开机阶段采用 MONO，再在入房后切回 STEREO，需要细致的时序与设备重建流程，风险较高；当前无需引入。

## 后续动作
- 继续观察开机播报听感与 RTC 入房稳定性。
- 如需进一步优化淡入或重采样质量，可微调淡入时长或评估更高质量重采样算法，但当前修复已满足听感与稳定性目标。

