dsh-live2dwaifu
Shows a Live2D character in the bottom-right corner of the DSH web UI: blinking, breathing, lip-sync while talking, seven moods, and a speech bubble with its own chat, memory, corpus and stickers. Models are never bundled; every user drops in their own folder.
Install
dsh plugin --profile web add dsh-live2dwaifu
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-live2dwaifu
把一只 Live2D(Cubism 3 / 4) 角色请进 DSH 网页的右下角。她会眨眼、会呼吸、头发会被风吹,说话时嘴一张一合,眼珠跟着鼠标走,心情变了眉毛跟着动。
她还能跟你说话——不用经过聊天框,不用进聊天记录。有自己的记忆、自己的作息、自己的声音(那种“哔哔”的电子音),高兴了甩你一张贴图。
模型不是内置的:谁装谁放自己的。文件全留在这台机器上,一根网线都不往外走。
给她一个模型,她给你一个会呼吸的角落。
状态 · 说明
展开 · 一张竖卡片:上半身、气泡、底下一个输入框
收起 · 缩成一条,只剩名字和一个 ⌃
装
dsh plugin --profile desktop add dsh-live2dwaifu
重启 DSH。右下角出现一张小卡片 → 点 ⚙ → 「导入模型」→ 选装着 .model3.json 的那个文件夹 → 完事。
桌面端也可以在设置 → 插件里搜名字安装。
别手动解压到 node_modules。 DSH 只加载列在 profile package.json 的 dsh.profile.bundles 里的包。手动扔进去的名字不会自动登记,表现就是“装了但右下角什么都没有”,/dsh-live2d/api/models 也返回 404。真遇到了,把 dsh-live2dwaifu 补进 bundles 和 dependencies 再重启。
卡片
位置和大小
按住标题栏能拖到屏幕任何地方。
改大小:卡片左上角那个小斜纹,往左上拖变大、往右下拖变小——卡片本身钉在屏幕右下角,所以动的是它的左上角(宽 200–720,高 220–视口高−80)。
位置、大小、背景、开合状态都记在本机,下次打开还是这样。
拖到一半跑到屏幕外了?关掉重开一次就回到默认位置。
标题栏按钮
按钮 · 干什么
⚙ · 抽屉:模型列表、自定义表情、全部开关
◐ · 换背景:透明 / 深色 / 浅色 / 纸质
♪ · 音色调色页(每只模型各存一份音色),在卡片里盖一层打开
✎ · 人设卡编辑页,同样盖一层打开
↻ · 重载 iframe(模型卡住时点这个)
⌄ / ⌃ · 收起 / 展开
放自己的模型
1. ⚙ → 「导入模型」
2. 选整个文件夹,里面要有 .model3.json、.moc3、贴图,最好带 .physics3.json
3. 读完它自己认出模型并切过去
想放好几个也行:列表里「用这个」换人,「删」送走。
吃:Cubism 3 / 4(.model3.json + .moc3)。
不吃:Cubism 2 老格式(.model.json + .moc)。
模型自带的动作:有 .motion3.json 的,隔十几秒自己播一个;没有也能活——眨眼靠 EyeBlink 参数组,嘴动靠 ParamMouthOpenY,头发晃动是 physics3.json 的物理。
模型自带的表情:带 .exp3.json 的会在抽屉里列出来,点一下叠上去(Add / Multiply / Overwrite 照原样执行)。没带的话,内置七种:平静、开心、委屈、生气、害羞、无语、困。
导入卡住或只导入一半:模型大(贴图 4K)时浏览器要一张张传,慢是正常的,进度在抽屉底下显示。传一半断了就再来一次,同名文件会覆盖。
她是谁:人设卡
她说话像不像人,全看这一段字。别只写“一个可爱的女孩”——那样只会得到一段没味道的话。
人设卡存在 ~/.dsh/dsh-live2d/models/<id>/meta.json 的 persona 字段里,也可以点标题栏 ✎ 在网页里改,改完她一重载就按新的说。
值得写进去的:
- 她是谁、几岁、做什么工作的
- 说话什么调子:短句还是长句、用不用标点、爱不爱反问
- 口头禅、习惯性的小动作、称呼你什么
- 怕什么、喜欢什么、有什么毛病
- 跟你是什么关系、你们在哪儿过日子
- 这个时间点她通常在干嘛
写得越具体越像人,写一句“性格开朗”没什么用。写完可以自己念一遍,像不像一个人在发消息。
世界隔离(人设卡页底下一个开关):开着的时候,她不知道什么是程序、界面、插件、模型,问起来就当你在她身边;关掉她就老老实实承认自己是插件里的角色。默认开。
不写 persona 也行,会用默认那份(若妍)。
跟她说话
三条路
一、卡片底下的输入框:打一句、回车。这条线不进你的聊天记录,往来只存在她自己的 chat.json 里。
二、手机:手机连同一个地址,打开 /dsh-live2d/chat,全屏就她的脸加一个输入框,不用看整个 DSH。
端口每次启动可能不一样。在 DSH 设置里能看到当前地址,把它换成 /dsh-live2d/chat 就行。手机和电脑得在同一个局域网。
三、别的插件推(见下面「给别的插件用」)。
她记得住
记忆分两层:
- 最近二十来句:原话,最近说了什么都在。
- 关于你的事实:名字、作息、口味、忌讳、答应过的事——从对话里攒出来的,长期挂着。聊天时只挑跟你这句话对得上的几条带上,不会一股脑塞进提示词。
攒满三十句,前面二十句会压成小结,不丢。嫌费 token,就在 ⚙ 里把「记住之前说的」关掉。
她说的话会过一道筛子
模型写出来的东西先过一遍:套话会被删掉——“好的”“我理解你的感受”“希望帮到你”“还有什么需要我帮忙的吗”这些,出来就没有。最多留两三句,也允许她只回两个字。
提示词里还会明确禁止:不总结、不分点、不讲道理、不解释心情、你没问就不给建议。
另外给了几组说话样例(“他:今天吃啥 —— 你:锅里还有,热的。”这种),让她照着那个密度和信息量说,不是照着内容抄。长度硬卡在四十字上下,超了会被截。
还是觉得哪句像 AI?记下来告诉作者,往规则里加。
她偶尔给你选项
话说到需要你挑的地方,她会在气泡上方冒出两三个按钮,点一个就等于你回了她。
她不给就没有——要不要给是她自己决定的,不是每次都有。通用短答试过,效果不好,撤掉了。
她知道现在几点,也知道自己该在干嘛
提示词里会让她按人设推断这个时间点的处境——早上在实验室、半夜还没睡——话里自然带着那个味道。不用你提醒,也不用写死时间表。
她偶尔自己开口
十几分钟没人理她,她就找个话头说一句,通过卡片的气泡冒出来。嫌吵:⚙ 里关掉「没人理就自己开口」。
开了却从不出现?她只在页面开着的时候说,而且说出来到显示有几秒延迟(卡片每 2.5 秒拉一次)——等一会。
喂她语料
人设卡告诉她「是谁」,语料告诉她「怎么说话」。⚙ 抽屉里的 语料 按钮打开一个页面,有模型选择、大文本框、文件按钮和拖拽区。
四种喂法,怎么方便怎么来:
1. 直接粘贴——打字、贴聊天记录、贴剧本都行
2. 点「选文件」,.txt / .json / .jsonl / .csv,可以多选
3. 把文件拖到那个虚框里
4. 一行一句地贴她的台词,什么都不用标
认得的写法:
他:今天吃啥 ← 认得出谁说的
你:锅里还有,热的。
「嗯。我也是。」 ← 只认她是说话人
- 先坐下。水在桌上。 ← 一行一句台词
[{"user":"累吗","assistant":"还行。"}] ← JSON 也行
说话人写 他 / 我 / 用户 算你,你 / 她 / 助手 算她;认不出来的一律当她说的——只贴台词最省事。
页面右边会实时显示解析出来的条数,和前面十几条预览。贴错了能看见,改完再存。
存法有两种:「加进去」是并到原来的里面,「替换成这些」是把之前清掉。第一次喂就用加。
以后她说话会从语料里挑几条贴进去当样例——优先挑跟你这句话沾边的问答,另外随机抽几句她的台词找语感。所以语料越多、越像她本人,她说得就越像。
存的位置:~/.dsh/dsh-live2d/models/<id>/corpus.json。
声音
她说话时一个字一声很短的电音,标点停一拍,句尾沉一下。不是朗读,是“哔哔”那种。
调色:标题栏 ♪ 打开调音页,左边是这只模型真身,右边四个预设(柔和 / 清脆 / 机械 / 游戏)加五个滑块(基频、抖动、长度、音量、语速)。边调边听,满意了点「存到这只模型」。每只模型各存一份,换人换声。
安静:⚙ 里关掉「出声」,或把音色调到音量 0。关掉之后只剩气泡和口型。
第一次没有声音?浏览器要求用户先点一下页面才允许出声。点她一下,或者点一下调音页的按钮,再试。
表情包(测试功能)
她说话时可能甩一张贴图,贴在气泡里。
⚙ 里有一根四档滑轴:
档位 · 意思
不使用 · 不说话配图
只使用自带 · 只用插件自带的那套
均开启 · 自带和 dsh-meme 混着来
只用 dsh-meme · 只借你本机已装的 dsh-meme 图库
自带那套是作者 OC 的 Q 版贴纸(效果不是很好其实)。
怎么挑图:她点名叫哪张就用哪张(提示词里给了名字清单);没点名的话,按她这句话的情绪随机抽一张,大约三成概率。
给 dsh-meme 用:自带那二十张是标准图库格式,导一次就能丢给它。
python tools/export-dsh-meme.py
产物在 dsh-live2d/dsh-meme-pack/xialing-001/,整个目录丢进 ~/.dsh/profiles/desktop/node_modules/dsh-meme/memes/ 下面就认。
图不贴题?这功能还在试。滑到「不用」最干净。
全部开关
⚙ 抽屉底下分两栏。「这台机器上」存 localStorage,只管这一台浏览器;「她那边」存 ~/.dsh/dsh-live2d/config.json,跟着插件走。
开关 · 位置 · 默认 · 说明
视线跟随鼠标 · 本机 · 开 · 角色的眼睛和头跟着鼠标动
点击角色有反应 · 本机 · 开 · 点她不同部位有不同反应
自动播放动作 · 本机 · 开 · 模型带动作文件时,隔一会儿播一个
说话带电子音 · 本机 · 开 · 每个字一声短音
复述聊天内容 · 本机 · 开 · 聊天窗口出现新回复时,由她念出来
表情包出现的位置 · 本机 · 文字左边 · 文字左边 / 文字上方 / 卡片左上角 / 说话不配图
没人的时候自己说两句 · 本机 · 开 · 隔 30 秒 / 1 分钟 / 2 分钟 / 5 分钟 / 10 分钟,默认 2 分钟
闲置主动说话的间隔 · 服务端 · 30 分钟 · 关闭 / 30 分钟 / 1 小时 / 2 小时 / 4 小时
回复附带选项按钮 · 服务端 · 开 · 她觉得需要选择时,气泡上方出现可点按钮
记住聊过的内容 · 服务端 · 开 · 关掉就不带记忆、不压缩
表情包(四档) · 服务端 · 不使用 · 测试功能,见上面那节
「本机」存 localStorage,只影响这一台浏览器;「服务端」存 ~/.dsh/dsh-live2d/config.json,换浏览器也一样。
主动开口那根滑轴给的是基准时长,实际会在这个数前后浮动,不是准点报到;夜里 0 点到 7 点她不出声。想看效果不用等,⚙ 里有一句「让她现在说一句」,点一下马上说一句。
给别的插件用
卡片里是个 iframe(/dsh-live2d/viewer)。同源脚本可以直接指挥它:
const frame = document.querySelector('iframe.dsh-l2d-body');
// 说话:逐字蹦出来,嘴跟着动,可选配图
frame.contentWindow.postMessage({
type: 'dsh-live2d/say',
text: '窗台那盆番茄红了。',
mood: '开心',
image: '/dsh-live2d/ownmeme/deyi.jpg',
}, '*');
// 只换脸
frame.contentWindow.postMessage({ type: 'dsh-live2d/mood', mood: '委屈' }, '*');
// 打开模型抽屉
frame.contentWindow.postMessage({ type: 'dsh-live2d/manage' }, '*');
HTTP 接口,给不想碰 iframe 的:
方法 · 路径 · 作用
GET · /dsh-live2d/api/models · 模型列表 + 当前选中 + 每只的音色
POST · /dsh-live2d/api/select · {id} 换人
POST · /dsh-live2d/api/import?model=<id>&path=<相对路径> · 请求体是文件字节
POST
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::35,最后更新 2026-10-25