Appearance
角色台词生成 — 人设约束 + 情绪解析 + TTS 朗读
系统概览
ADR-156 创意路线的台词生成子系统(Step 1 + Step 2a 已落地)。以内建「角色圣经」约束 LLM 用固定人设产出带情绪标签的结构化对白,解析后可用浏览器原生 SpeechSynthesis 朗读。台词模式挂在 settings-diagnostic.ts 的 dialogue tab,底座为 ADR-196 的 AiService 传输层。
核心职责
character-bible.ts— 人设数据(BUILTIN_BIBLES:miku/narrator)+buildDialogueSystemPrompt()(组装 system prompt,要求 JSON[{line, emotion}]输出)+parseDialogueLines()(容错解析)+DIALOGUE_EMOTIONS情绪闭集dialogue-session.ts— 薄状态封装:单点持有_activeBibleId,转发 prompt 构建;getActiveBible/setActiveBible/listBiblesdialogue-speech.ts— Web Speech API 封装:speakLines()(按情绪调 rate/pitch 串联朗读)/cancelSpeech()/isSpeechSupported()
对外 API(节选)
getBible(id)/getActiveBible()/setActiveBible(id)/listBibles()buildDialogueSystemPrompt(bible)— 人设 + 结构化输出契约parseDialogueLines(raw)— LLM 文本 →DialogueLine[]speakLines(lines, lang?)/cancelSpeech()/isSpeechSupported()
与其他子系统关系
- 上行:
menus/settings-diagnostic.ts的 dialogue tab 取getActiveBible()组 prompt、调parseDialogueLines、speakLines - 下行:经
ai-service(ADR-196)发起 LLM 请求;朗读走浏览器 SpeechSynthesis - 口型:Step 2b 待评估,需与 ADR-079 感知层 LipSync 独立对接(当前 TTS 不驱动口型)
不变量
- character-bible.ts 为纯数据+纯函数叶子,零副作用、零应用层依赖;人设内建,不从 novel/ 抽取(novel/ 是开发编年史非角色人设)
- parseDialogueLines 容错:非法情绪归一到 neutral,解析失败时整段文本兜底为单条 neutral,保证 UI 永远有内容
- dialogue-session 的 _activeBibleId 为唯一模块级状态,唯一写入点 setActiveBible,非法 id 经 getBible 兜底到首个内置角色
- SpeechSynthesis 走浏览器独立音频输出,不经 AudioContext,无法被 LipSync BeatDetector 采样,TTS 口型闭环需独立方案(ADR-156 Step 2b)
- speakLines 先 cancel 既有队列避免叠加重播;环境不支持时静默 no-op
验证入口
- 决策见 ADR-156;暂无专门单测(纯函数
parseDialogueLines为后续补测优先项)