Skip to content

TTS NPC 对白归属 ​

开启后,一条消息里多个角色的引号对白可以各用各的声音朗读:AI 在后台判断每句引号是谁说的,识别出的 NPC 自动出现在语音映射里,每句引号旁边还会多一个单独播放按钮。

中英文引号均算对白("…"、“…”、「…」 等)。

开启 ​

  1. 先打开 扩展 → TTS 抽屉,选择一个 TTS 服务商并启用 —— 归属解析依赖 TTS 处于启用状态。

    TTS 设置面板

  2. 向下滚动到正则设置下方的区块,勾选 NPC 对白归属。

    NPC 对白归属设置区块

  3. 选择解析所用的连接和预设:

    • 归属解析 API 连接 — 用哪个 API 连接跑归属解析。只有一个连接时保持当前 API 配置即可。
    • 归属解析聊天补全预设 — 解析走哪个聊天补全预设。建议选轻量、快速的预设,这是一个分类任务,不需要创作能力。
    • 归属解析重试次数 — 模型返回不可用答案时的重试次数。默认为 2。

单独播放一句 ​

消息里每句引号对白的末尾会出现一个小喇叭图标。点击后只播放这一句,用归属到的说话人的声音。

消息中的引号播放按钮

  • 点击播放的是原始引号内容。全局朗读筛选(跳过代码块、仅朗读引号等)作用于整条消息的朗读,不影响这些单句点击。
  • 对旧消息点击时如果解析还没完成,按钮会显示加载动画,等结果到位后播放。解析失败时,这句会用作者的声音播放。
  • 移动端隐藏这些按钮,避免滚动时误触。

给 NPC 分配语音 ​

所有说话人的语音均在 TTS 面板 语音映射 区的 管理语音 按钮里。按钮会打开一个弹窗,列出所有说话人 —— 聊天参与者(角色卡主角、群聊成员、你)加上所有已配置的 NPC,每个名字一行,带语音下拉,NPC 行还带 NPC 标签。

语音映射弹窗与 NPC 行

NPC 名字有两种加入方式:

  1. 自动发现。 归属解析在引号对白里认出新说话人时,名字自动加入语音映射,默认跟随默认语音。打开 管理语音 给它指定语音,跨聊天记忆。
  2. 提前手动添加。 在 管理语音 弹窗顶部的输入框输入 NPC 名字并点击 添加。提前配置的名字会作为候选说话人交给归属解析 AI,该 NPC 的台词从第一次播放起就能被识别(并配上声音)—— 无需等待发现。

在语音映射弹窗中添加说话人名字

NPC 行(带标签、非聊天参与者的行)可以用行尾的 ✕ 按钮移除。改动在弹窗点击 完成 关闭时生效。

NPC 的行在配置之前跟随默认语音。如果播放时某个 NPC 没有出声,检查它的行(或默认语音行)是不是设为了 disabled。

整条消息的朗读同样受益:从第二次播放起,每句对白会用各自说话人的声音。新消息的第一次播放可能仍用作者的声音 —— 后台解析可能还没完成。

开启内置的 为 "引号"、星号文本 和其他文本使用不同声音 时,归属到的 NPC 也会得到同样的三个槽位(引号 / 星号文本 / 其他文本)。给 NPC 的引号槽位指定不同声音,可以让它的台词和旁白用不同的语音。

常见问题 ​

NPC 第一次播放后没有声音。 后台解析可能还在进行。另外在 管理语音 里检查 NPC 的行 —— 它跟随默认语音,而默认语音出厂是 disabled。提前手动添加名字(见上文)可以完全避开这个等待。

旧消息上一直不出现按钮。 按钮在消息渲染时或功能启用后切换聊天时添加。重新加载页面,或在功能开启时切到别的聊天再切回来。

每条消息均会发一次 AI 请求吗? 只有包含引号对白的角色消息才会。没有引号的消息直接跳过不发请求,结果缓存到消息内容变化为止。

技术深入 ​

给好奇的读者和贡献者

解析时机与输入 ​

角色回复生成完毕后,Luker 在后台自动跑一次小型 AI 解析(走一次工具调用,模型要做的只是给每句引号填一个说话人)。解析读取这条消息的原文、它前面的两条消息和当前说话人名单:聊天参与者加上语音映射里已有的全部名字(含提前手动配置的 NPC)。说话人不在名单里时,模型可以直接给出新名字。

对旧消息第一次点播放按钮时,会补跑同样的解析。

缓存与失效 ​

解析结果按消息存在每个聊天的楼层状态文件里,用消息内容哈希校验。消息被编辑或 swipe 后缓存自动失效,下次播放时重新解析。归属结果只影响朗读时的声音选择,不改动消息文本和聊天记录。

解析失败不缓存失败结果:按重试次数重试后仍失败时,该句回落到作者声音,并在控制台记录一条警告。

引号识别 ​

与消息渲染里的引号高亮共用同一套识别规则:"…"、“…”、«…»、「…」、『…』、"…"。代码块和行内代码里的引号不算对白。

基于 SillyTavern 构建