Skip to content

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

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

refactor(tts): TTS 四层架构彻底重构(Coordinator + SegmentPlanner)#692
codedogQBY wants to merge 3 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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] 小米 tts 朗读会跳大段文字

1 participant