Skip to content

refactor(tts): TTS 四层架构彻底重构(Coordinator + SegmentPlanner) - #692

Open
codedogQBY wants to merge 9 commits into
mainfrom
codex/refactor-tts-architecture
Open

refactor(tts): TTS 四层架构彻底重构(Coordinator + SegmentPlanner)#692
codedogQBY wants to merge 9 commits into
mainfrom
codex/refactor-tts-architecture

Conversation

@codedogQBY

Copy link
Copy Markdown
Owner

背景

TTS 模块长期积累 7 个相关 bug(#683/#682/#681/#675/#634/#627/#626),根因是架构边界不清:tts-players.ts 单文件 1257 行塞了多供应商+音频解码+流式队列+播放控制+错误恢复,tts-store.ts 又管配置+播放器实例+会话+跳转+生命周期,导致大量回调竞态和隐式状态问题,打补丁无法根治。

重构方案(四层架构)

TTSCoordinator  → 播放会话/队列/暂停恢复/停止/跳转/取消(状态机 + sessionId 隔离)
SegmentPlanner  → 文本清洗/分段/段索引/CFI与字符偏移映射
TTSProvider     → system/edge/dashscope/xiaomi/openai,只负责合成音频
AudioBackend    → Web Audio/Expo AV/系统语音,只负责播放

核心机制

  • 状态机:idle → loading → playing → paused / stopping / error
  • sessionId 隔离:每次 play/jumpTo/切 provider 生成新 session + AbortController,所有回调带 sessionId 校验,旧回调一律忽略(根治'停止后自动下一句''旧音频复活'等竞态)
  • 统一错误:normalizeTTSError 带 sessionId/segment/provider/state 上下文
  • 跳转定位:SegmentPlanner 偏移/CFI 双向映射,jumpTo 取消旧 session 重建队列

改动

  • 新增:coordinator.ts(238 行)、segment-planner.ts(73 行)+ 专项测试
  • 重构:tts-store.ts(-140 行旧编排:删除 startPlayback/_sessionGeneration/detachAndStopAllPlayers)
  • 保留:TTSPlayerFactories 经 LegacyPlayerProvider 适配,对外 store API 不变,UI 无感知

Issue 关联

Closes #683 #682 #681 #675 #634 #626#627 需安卓真机验证 codec 兼容性)

验证

  • Core 全量测试 588 个全部通过(含新增状态机/session/分段测试)
  • 旧 store 对外 API 保持不变

风险

- TTSCoordinator:状态机(idle/loading/playing/paused/stopping/error)+ sessionId/AbortController 隔离
- 旧回调一律通过 isCurrent 校验忽略,根治竞态类 bug
- SegmentPlanner:分段、字符偏移、CFI 查找、跳转定位
- LegacyPlayerProvider 适配器保留旧播放器兼容
- 统一错误上下文(sessionId/segment/provider/state)
- 新增测试:状态机转移、session 隔离、自动下一段、分段/偏移/CFI
- 全部测试 588 个通过
- store 切换待下一步(契约差异需先扩展适配器)
- 删除 startPlayback、_sessionGeneration、detachAndStopAllPlayers 等旧逻辑
- 播放/暂停/恢复/停止/跳转/定位全部走 TTSCoordinator
- 保留 TTSPlayerFactories 通过 LegacyPlayerProvider 提供底层播放器
- 对外 store API 不变,UI 无感知
- 全部测试 588 个通过
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant