0
Fork 0
mirror of https://github.com/Silent1566/webhtv.git synced 2026-11-14 02:00:15 +00:00
webhtv-mys/scripts/pull-ad-audio-log.sh
Silent1566 532be2d7ed 修复:语音广告识别全链路失效
语音去广在此前从未真正运行过。逐环定位并修复五处缺陷,每处都有先失败后通过的回归测试:

1. UI 绑定竞态:isOwner() 在 onServiceConnected/onResume 时为 false,两次绑定
   全部落空且无补绑路径,运行时始终 ui==null 而停用所有 provider。改为在
   onPlaybackStateChanged 取得所有权后补绑。
2. bindUi 非幂等:重建 coordinator 会让已运行的 provider 变成孤儿,其候选被
   coordinator != currentCoordinator 守卫静默丢弃。同一 UiPort 重绑时改为复用。
3. 候选时间基错误:onRecognitionResult 读取缓存的 hostPosition,而它仅在
   bind/refresh/READY 时发布,稳态播放期间陈旧达数分钟。改用识别器已经回传的
   采集时间戳,并移除 provider 侧的时长钳制,由 AdSkipCoordinator 统一钳制。
4. IDLE 销毁识别器:缓冲导致位置暂时不可用时释放识别器和采集租约,每次缓冲
   抖动都重建 sherpa。改为停泊保活,isActiveLocked 将 IDLE 视为存活,并校验
   会话 id 以免持有失效会话的租约。
5. 缺少位置泵:host position 无周期性推送,provider 启动后即停滞。挂到已有的
   5 秒播放遥测心跳上。

另:邮箱容量 8 提升至 16(48 kHz 下 1 秒内即溢出);忽略抑制键加入匹配区间,
此前所有语音候选共用 ruleId,一次忽略会静音整代后续提示。

新增受调试日志开关控制的诊断输出,用于定位上述问题。record() 的日志在锁外
并做采样:SpiderDebug 写日志是同步磁盘 IO,而 STALE_GENERATION/QUEUE_OVERFLOW
可能每个 PCM 帧触发一次,且调用方位于 ExoPlayer 音频线程。日志只输出状态、
计数和时间戳,不含识别文本、关键词、URL 与请求头。

音频管线重建加入每会话次数上限:refreshAdAudioRuntime 现由 5 秒心跳驱动,而
rebuildAudioPipeline 是完整的播放器重启,音频直通等配置下租约永远无法满足,
不设上限会导致每 5 秒重启一次播放。

同时补齐合并 beta 后缺失的 import(AlertDialog、LightDialog、
MaterialAlertDialogBuilder),此前两个设置页无法编译。

验证:Leanback 全量单测 461 类 2775 项通过,Mobile ARM64 编译通过。
MpvPreloadControllerTest 的 2 项失败随 beta 合并引入,与本次改动无关
(stash 全部改动后仍失败)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 16:27:50 +08:00

53 lines
2.4 KiB