john-walks-slow/dsh-live2d-voice ↗★ 0

dsh-live2d-voice

Live2D session view with realtime voice: continuous voice input, streaming TTS, subtitle translation, multi-model catalog, standalone entry / Live2D 实时语音会话视图:连续语音输入、流式 TTS、字幕翻译、多模型目录、独立入口 适合需要与Live2D角色进行语音互动和视觉反馈的用户。

패키지
dsh-live2d-voice
호환성
미검증
Cordis peer 범위
^4.0.1
버전
1.5.0
라이선스
MIT
최근 업데이트
2026. 9. 27.

설치

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:john-walks-slow/dsh-live2d-voice

配置

配置文件:/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""多模型目录下当前选中的角色名(空 = 第一个)
voiceIdremFish Audio 参考音色 id
ttsModels2.1-pro-freeFish 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)
sentenceSubtitlestrue逐句字幕:开启(默认)时每句独立 TTS、字幕逐句跟随发音;关闭时句子攒成段落块,一次 TTS 合成、字幕按段显示(语音更连贯、首音稍晚)
eyeTrackingfalse实验性:前置摄像头视线追踪(⚙ 面板可切换;首次开启经插件路由下载视线模型)
gyroParallaxfalse实验性:陀螺仪视差(DeviceOrientation → 头部/身体/眼球角度 + 位置偏移;开启时校准正中姿势)
emotionMap9 情绪默认表标签 → 表情索引/名称(neutral/joy/sappiness/sadness/anger/surprise/fear/disgust/shy)
speechPrompt""自定义指令,仅语音模式生效(HUD ⚙ 里也能编辑)
thirdPersonfalse第三人称模式总开关(⚙ 面板与系统设置可切,写回配置);开启后输入由玩家化身先说出
playerModelSelection""玩家角色(多模型目录中的角色名);空 = 无形象仅语音"画外音",未选模型也可开模式
playerVoiceId元气少年音玩家音色(Fish Audio 参考音色 id,预设任选;与 AI 音色相同时 ⚙ 提示换一个)
playerPolishtrue润色/翻译层:把输入改写成玩家角色的台词(按 playerPrompt 人设与 playerSpeechLanguage);关闭 = 原文直念
playerSpeechLanguage"zh"玩家角色说话语言(润色目标语言;auto = 不限)
playerPrompt""玩家人设,润色提示词的一部分(语气/口癖/自称等)
playerEmotionMap9 情绪默认表玩家情绪标签 → 玩家模型表情索引/名称(同 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 视图的会话**生效,其他会话不受影响