toy-Kapi_Rtc/04-2025-11-21音频优化记录.md
2026-01-20 16:55:17 +08:00

72 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 资产改为双声道 OPUS16kHz/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 入房稳定性。
- 如需进一步优化淡入或重采样质量,可微调淡入时长或评估更高质量重采样算法,但当前修复已满足听感与稳定性目标。