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

5.5 KiB
Raw Blame History

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_ = 2main/audio_codecs/es8311_audio_codec.cc:12-15)。
    • I2S 槽:slot_mode = STEREOslot_mask = BOTHmain/audio_codecs/es8311_audio_codec.cc:105-109)。

今日修改与实现

  • 在开机阶段的“非管线路径”增加单声道→立体声复制,避免直接将单声道 PCM 写入立体声槽:
    • 代码位置:main/application.cc:1224-1230
    • 逻辑:当 codec->output_channels()==2 时,将 pcm 复制为交错的 stereoL=R后输出否则原样输出。

现象与测试过程

  • 开机播报尖锐(问题初始):

    • 路径:开机阶段未启用播放管线,走直接输出(main/application.cc:1224-1230)。
    • 原因:单声道 PCM 与设备端立体声槽不匹配,导致通道/槽打包伪像,主观听感“尖锐”。
    • 资产引用:
      • 触发播放:main/application.cc:531PlaySound(Lang::Sounds::P3_LALA_KAIJIBOBAO);)。
      • 资产绑定:main/assets/lang_config.h:275-280LALA_kaijibobao.p3 二进制绑定)。
      • 文件:main/assets/zh-CN/LALA_kaijibobao.p3main/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→1110-111STEREO→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-15105-111171-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 入房稳定性。
  • 如需进一步优化淡入或重采样质量,可微调淡入时长或评估更高质量重采样算法,但当前修复已满足听感与稳定性目标。