john-walks-slow/dsh-live2d-voice ↗★ 0
dsh-live2d-voice
提供带实时语音输入和流式TTS的Live2D视图 适合需要与Live2D角色进行语音互动和视觉反馈的用户。
安裝
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:john-walks-slow/dsh-live2d-voice說明文件
閱讀完整 README ↗配置
配置文件:/live2d-voice.json(如 ~/.dsh/live2d-voice.json)。保存后刷新页面即生效(音色也可在 HUD 里直接切换,会写回该文件)。
{
// 角色模型目录:包含 .model3.json 的文件夹(Cubism 4)
"modelPath": "/root/.dsh/live2d-voice-models/haru",
// Fish Audio 音色 id(见下方预设表)
"voiceId": "0c7771ca5910484e8a4933068017fcee",
// TTS 模型名
"ttsModel": "s2.1-pro-free",
// Fish Audio API key:内联数组,或指向 key 文件(每行一个,或 JSON 数组)
// 多 key 自动轮询:401/402/429 时切换下一个
"apiKeys": [],
"apiKeyFile": "/root/.config/fish-audio/keys.json",
// 情绪标签 → 模型表情(Haru 的表情索引;值也可以是表情名字符串)
"emotionMap": {
"neutral": 0, "joy": 1, "sappiness": 1, "sadness": 2,
"anger": 3, "surprise": 4, "fear": 5, "disgust": 6, "shy": 7
},
// 语音输入:火山引擎 ASR 凭证文件(JSON:apikey,或 appid+accessToken)
"asrCredentialsFile": "~/.config/volc-asr/credentials.json",
// 语音输入识别语言:auto(自动检测中/日/英等)| zh | ja | en
"sttLanguage": "auto",
// 角色说话语言:ja(默认,角色始终用日语交流)| zh | en —— 注入 live 模式提示词
"speechLanguage": "ja",
// 角色台词的翻译目标语言:zh / ja / en / ko…(languageLabel 支持即有效);off 关闭
"subtitleLanguage": "zh",
// 多模型目录下的当前选中角色(⚙ 里切换会写回)
"modelSelection": "",
// 自定义提示词:仅在 Live2D 语音模式下随情绪标签协议一起注入
// 例:"无论用户说什么语言,总是用日语自然交流。用户会看到字幕翻译。"
"speechPrompt": "",
// ── 第三人称模式(v1.5.0)──
// 总开关:开启后输入由玩家化身先说出(润色 → 玩家 TTS → AI 回应)
"thirdPerson": false,
// 玩家角色(多模型目录中的角色名;空 = 无形象,仅语音"画外音")
"playerModelSelection": "",
// 玩家音色(Fish Audio 预设任选;与 AI 同音色时 ⚙ 会提示换一个)
"playerVoiceId": "ed3a1c523b524870a85a5a76cb1e0c3d",
// 润色/翻译层:把输入改写成玩家角色的台词(失败自动回退原文)
"playerPolish": true,
// 玩家角色说话语言(润色目标语言;auto = 不限)
"playerSpeechLanguage": "zh",
// 玩家人设:润色时的角色设定(语气/口癖/自称等)
"playerPrompt": "",
// 玩家情绪标签 → 玩家模型表情(同 emotionMap 格式)
"playerEmotionMap": {},
// per-workspace 覆盖(可选):按会话工作区的绝对路径覆盖表现层配置
// "workspaces": {
// "/root/projects/xxx": { "voiceId": "abf4fa2e25634b41aadc4e0ef9ddaea5", "speechLanguage": "zh" }
// }
"workspaces": {}
}
| 字段 | 默认 | 说明 |
|---|---|---|
modelPath | "" | 必填。两种形态:目录直接放一个或多个 .model3.json(多文件时同样出现 ⚙ 切换器);或放多个角色子目录(每个一级子目录一个 .model3.json)。为空时页面显示配置引导,也不会注入任何提示词;可覆盖于 workspaces(资产路由多根解析) |
modelSelection | "" | 多模型目录下当前选中的角色名(空 = 第一个) |
voiceId | rem | Fish Audio 参考音色 id |
ttsModel | s2.1-pro-free | Fish Audio TTS 模型 |
apiKeys | [] | 内联 key 列表(优先于 apiKeyFile) |
apiKeyFile | "" | key 文件路径(每行一个 key 或 JSON 数组) |
asrCredentialsFile | ~/.config/volc-asr/credentials.json | 火山 ASR 凭证(JSON 含 apikey 或 appid+accessToken);未配置时 🎙 点击给出引导提示 |
sttLanguage | "auto" | 语音识别语言;auto 用火山 enable_auto_lang 自动检测(仅 nostream 模式生效;流式模式自动识别中/英+方言) |
asrMode | "stream" | 语音识别传输:stream(默认)实时推流(边说边出字幕、说完 ≈0.6s 定稿;不支持日语/韩语输入);nostream 一次性整句识别(延迟 ≈1.3s;25 语种含日语) |
speechLanguage | "ja" | 角色说话语言,注入"始终用 X 语言交流"指令;auto 跟随用户语言(不注入语言指令)。日语指令中的"(用户会看到字幕翻译)"承诺仅在 subtitleLanguage 实际生效(非 off 且不同于角色语言)时出现 |
subtitleLanguage | "zh" | 角色台词的翻译目标语言(off 关闭;与会话生效的 speechLanguage 相同或 speechLanguage=auto 时可能整句透传,按需配置;可覆盖于 workspaces) |
sentenceSubtitles | true | 逐句字幕:开启(默认)时每句独立 TTS、字幕逐句跟随发音;关闭时句子攒成段落块,一次 TTS 合成、字幕按段显示(语音更连贯、首音稍晚) |
eyeTracking | false | 实验性:前置摄像头视线追踪(⚙ 面板可切换;首次开启经插件路由下载视线模型) |
gyroParallax | false | 实验性:陀螺仪视差(DeviceOrientation → 头部/身体/眼球角度 + 位置偏移;开启时校准正中姿势) |
emotionMap | 9 情绪默认表 | 标签 → 表情索引/名称(neutral/joy/sappiness/sadness/anger/surprise/fear/disgust/shy) |
speechPrompt | "" | 自定义指令,仅语音模式生效(HUD ⚙ 里也能编辑) |
thirdPerson | false | 第三人称模式总开关(⚙ 面板与系统设置可切,写回配置);开启后输入由玩家化身先说出 |
playerModelSelection | "" | 玩家角色(多模型目录中的角色名);空 = 无形象仅语音"画外音",未选模型也可开模式 |
playerVoiceId | 元气少年音 | 玩家音色(Fish Audio 参考音色 id,预设任选;与 AI 音色相同时 ⚙ 提示换一个) |
playerPolish | true | 润色/翻译层:把输入改写成玩家角色的台词(按 playerPrompt 人设与 playerSpeechLanguage);关闭 = 原文直念 |
playerSpeechLanguage | "zh" | 玩家角色说话语言(润色目标语言;auto = 不限) |
playerPrompt | "" | 玩家人设,润色提示词的一部分(语气/口癖/自称等) |
playerEmotionMap | 9 情绪默认表 | 玩家情绪标签 → 玩家模型表情索引/名称(同 emotionMap 格式) |
workspaces | {} | per-workspace 覆盖:{ "": { voiceId, modelPath, modelSelection, speechLanguage, sttLanguage, subtitleLanguage, speechPrompt, emotionMap 任选 } };凭证类字段只在全局层 |
提示词注入是会话级、按需生效的:只有当前会话打开了 Live2D 视图(SSE 在连)时,才会注入"语音输出格式 + 情绪标签"提示词(含 speechPrompt 自定义指令);普通 Chat 会话完全不受影响。从 Live2D 切回普通对话后的首轮回复会自动附上一段"已退出语音模式"的提醒,模型随即恢复正常 Markdown/代码块输出,对话可以无缝续接。
预设兼容:语音模式指令以用户消息注入(
agent/pre-step向组装消息追加一条 role:user 的插件消息,参考 dsh-mnemon 的注入方式)而非 systemPrompt section——不受任何 preset 的complete: true语义影响,chat等极简预设下同样生效。注入消息带source: {kind:"plugin", plugin:"dsh-live2d-voice"}标识,会话日志可见。
内置音色预设(HUD ⚙ 里可直接切换):
| 预设 | voiceId |
|---|---|
| Rem · 温柔女仆 | 0c7771ca5910484e8a4933068017fcee |
| 元气女仆 | abf4fa2e25634b41aadc4e0ef9ddaea5 |
| 芙莉莲 · 知性 | c174516c799a42e7be88b96c86cfbd3e |
| 芙宁娜 · 娇俏 | 3fd70bbcdb6342df8c0c4143b958944b |
| Cute Girl · 甜美 | 0c54c26032024142bf6339dc4d4aca1b |
角色模型
任意 Cubism 4 模型(.model3.json)均可,放入一个目录并把 modelPath 指向它。例如官方示例 Haru:
mkdir -p ~/.dsh/live2d-voice-models
cd ~/.dsh/live2d-voice-models
## 使用
1. 打开任一会话,顶部视图 tab 切到 **Live2D**
2. 点 HUD 的 ⌨ 打开输入框直接对话;或点 🎙 开启连续语音输入——说话自然停顿后一句自动识别、自动发送(说完即可继续说下一句)
3. AI 说话时直接开口即可**打断**(barge-in 立即静音角色并转向你的新输入);正在生成回复时的新语音会以 steer 模式插队
4. 表情/口型/字幕随回复自动驱动;🔇 静音、💬 字幕开关、⛶ 全屏、⚙ 音色/模型/语言/视线追踪
5. 全屏 + 语音监听时屏幕保持常亮——适合把一台旧手机常驻 Live2D 页当角色终端;长时间静默挂机无内存增长,说话即响应
角色与字幕(v0.3.0):
- `modelPath` 放多个角色子目录时,⚙ 面板出现「角色模型」切换器,点击即换(模型立即重新加载)
- 角色台词若与 `subtitleLanguage` 不同语言,会自动翻译并以小字附在原句下方(用当前会话同款模型,逐句异步,不影响语音节奏)
- `workspaces` 按工作区路径覆盖配置:不同工作区的会话可以各有各的音色/角色/语言
第三人称模式(v1.5.0):
- ⚙ 面板或系统设置开启「第三人称」后,舞台变双角色同台:左侧玩家角色(`playerModelSelection`)、右侧 AI 角色;开关切换即时重排、不重载模型
- 键盘/语音输入不再直接交给 AI:先(可选,`playerPolish`)润色成玩家角色的台词 → 玩家音色念出(字幕行带「你」徽章)→ AI 角色回应;**润色后的台词才是进入会话日志的消息**(Chat tab 所见即玩家皮套所说)
- 提交后字幕区先出一行置灰的「酝酿中…」瞬态提示,玩家台词到达即替换;关闭润色则原文直念
- 未选玩家模型也可开启:无形象的"画外音"模式(润色/语音/字幕照常,仅无口型与形象)
- 玩家台词播放中再次开口(键盘或语音)会打断当前播放,barge-in 语义与第一人称一致;AI 回应中插话同样切断 AI 语音
语音输入细节:
- 识别延迟(流式模式,默认):**边说边出字**(开口 ≈1s 出首字、实时跟进),说完 ≈0.6s 出定稿并自动提交;`asrMode: nostream` 时为 说完话 0.5s(VAD 判停)+ 识别约 1.3s
- 流式模式走火山双向流式优化版(`bigmodel_async` + `enable_nonstream` 二遍识别):实时字幕与 nostream 级准确率兼得;**不支持日语/韩语等小语种输入**(官方语言参数仅 nostream 端点支持,日语实测空文本)——需要日语输入时把 `asrMode` 切回 `nostream`
- 角色的语音可能被麦克风拾到(外放场景):识别结果与角色最近台词高度重合时会被当作回声丢弃
- 浏览器要求 HTTPS 或 localhost(getUserMedia 限制);手机浏览器同样可用
- `sttLanguage: auto` 实测覆盖中文/日语/英语自动检测(nostream);流式模式下中/英+方言自动识别,无需指定语言;`ja`/`zh`/`en` 锁定仅在 nostream 模式生效
注意:
- 情绪标签(如 `[joy]`)会随消息写入会话日志——切回 Chat tab 可见完整对话记录
- Live2D 页不显示历史消息;要看历史请切回 Chat tab
- TTS 只对**当前打开了 Live2D 视图的会话**生效,其他会话不受影响