본문으로 건너뛰기
F

dsh-live2dwaifu

fujiwarareisen/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.

설치

dsh plugin --profile web add github:fujiwarareisen/dsh-live2dwaifu

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/dsh-live2d/api/commit{id,name} 扫一遍并选中
POST/dsh-live2d/api/delete{id} 删掉
GET/dsh-live2d/api/voice?id=读这只模型的音色
POST/dsh-live2d/api/voice{id,voice} 存音色
GET/POST/dsh-live2d/api/persona读 / 存人设卡
GET/POST/dsh-live2d/api/settings读 / 存开关
POST/dsh-live2d/api/chat{text} 跟她说一句,返回 {reply,image,choices}
POST/dsh-live2d/api/push{text,image,mood} 让她说一句(外部推送口)
GET/dsh-live2d/api/poll?since=卡片每 2.5 秒拉一次,取待播的话

im 机器人接进来就一句话:

curl -X POST http://127.0.0.1:<端口>/dsh-live2d/api/push \
  -H 'content-type: application/json' \
  -d '{"text":"锅里有汤。","mood":"平静","from":"im"}'

数据存在哪

~/.dsh/dsh-live2d/
  config.json              现在轮到谁上场 + 各项开关
  models/<id>/
    meta.json              { name, model3, persona, isolation, voice }
    chat.json              { messages, summary, facts }  跟她私聊的记录和记忆
    <模型文件…>

插件自己的文件在 ~/.dsh/profiles/desktop/node_modules/dsh-live2dwaifu/,自带的二十张贴图在 assets/memes/。

想清空她对你记的事:删掉对应模型的 chat.json。想彻底重来:整个 ~/.dsh/dsh-live2d/ 删掉,模型得重新导入。


常见问题

右下角什么都没有 先重启。还不来,看 profile 的 package.json:dsh.profile.bundles 和 dependencies 里都得有 dsh-live2dwaifu。手动拷进 node_modules 的不会自动登记。

她只有半张脸 / 位置偏上 模型画布比例跟卡片不一样。卡片是竖的,太宽或太扁的模型会被裁两边。拖左上角那个小斜纹改形状试试。

导入了却不认得 .model3.json 的层级选错了。选它隔壁那一层。

她不动、不眨眼 点一次 ↻ 重载。还不行就看浏览器控制台——多半是模型缺 .moc3 或缺贴图。

跟她说话没反应

  • 确认 ⚙ 里「记住之前说的」不是全关(不影响回复,只影响记忆)
  • 后台直接调 DSH 的模型接口,所以 DSH 自己得能正常对话
  • 报“模型接口不可用”就是当前没有可用模型,去设置里选一个

她说的话还是像 AI 规则在 lib/index.js 的 AI_WORDS 和提示词那段。可以自己加词,改完重启。

手机打不开 /dsh-live2d/chat 手机和电脑得在同一个局域网;端口用 DSH 设置里显示的那个(每次启动会变);防火墙可能挡了局域网访问。

表情包一直不出现 滑轴滑到「不使用」了,或者她是随机三成概率——多聊几句。只使用自带的话,确认 assets/memes/ 里有那二十张。

动作播得很怪 / 抽搐 有些模型的 motion 会覆盖插件在算的参数。⚙ 里关掉「自己播动作」。

她记得太多了 / 词太占 token ⚙ 里关掉「记住之前说的」。或者删 chat.json 里不要的条目。


已知限制

  • 只支持 Cubism 3 / 4,不吃 Cubism 2
  • 表情只认 .exp3.json,不认 .motion3.json 里的表情轨
  • 卡片是浮层(shell.overlay),不是聊天区分栏,会盖住右下角——能拖走、能收起
  • 内置七种情绪;自定义表情一次只能叠一个
  • 跟她的对话不经过 DSH 会话,所以没有工具调用、不能上网、不读文件,只说话
  • 内置的 Cubism Core 是 Live2D Inc. 的 Redistributable Code,随包分发,使用受其 EULA 约束

关于别人的插件

她的图、她的耳朵,都是从你已经装好的插件里读的。这个包里不带任何第三方素材,也一行没改别人的代码:

  • 表情图:从 dsh-meme 的图库目录里挑一张,只在本机显示,不上传、不分发。没装就没有图,其它照常。
  • 麦克风:交给 dsh-ears,本插件不碰录音,只是把转写好的字送进对话。
  • 对话:走 DSH 自己的模型接口(ctx.llm),不经过任何人的会话,也不写你的聊天记录。

不喜欢这些联动,⚙ 里都能单独关掉。


更新日志

版本号怎么走:动了功能和结构就抬第二位(1.2.0),只补洞和小修就抬第三位(1.2.1)。

2.3.0

  • 加:「没人的时候自己说两句」可以关掉了,间隔也能调:30 秒 / 1 分钟 / 2 分钟 / 5 分钟 / 10 分钟,默认 2 分钟。以前是写死的 9 秒轮询,实际差不多每四十秒冒一句。
  • 改:这句碎话只在「够久没说话、气泡也空了」的时候才冒,不再按固定节拍硬插进来。
  • 加:跟 2.2.0 合并发布,两个版本一起算这次 GitHub 发布。

2.2.0

  • 加:表情包出在哪儿可以选。默认「文字左边」——图跟文字并排,图不再把文字往下顶。另有三档:「文字上方」(旧样子)、「卡片左上角」(单独浮一张,不挤气泡)、「说话不配图」。⚙ 第一栏就能改,改完正在显示的那张也会挪过去。
  • 修:气泡每 9 秒会被固定台词(「嗯。」「在的。」「今天还行。」)顶掉,她刚说的话、配的图都会被盖没。现在 45 秒内有过新话、或者气泡还挂着,就不插嘴。
  • 修:答题式的固定台词也换成只在她确实安静的时候才冒一句。

2.1.0

「随机主动消息」这一块基本重做了。之前那版有两个毛病,都是真的。

  • 修:间隔根本不受设置管。计时器只存在内存里,每次重启 DSH 归零,于是「闲置 1 小时才说一句」实际变成「重启后 1 小时说一句」。你重启三次,她就说三次,看着像 12 分钟、23 分钟一次。现在计时落到 ~/.dsh/dsh-live2d/auto.json,锚点取聊天记录里最后一条的时间,重启不影响。
  • 改:间隔改成浮动。设定值只当基准,每轮在 0.8~1.4 倍之间重新抽一次,不再准点报到。
  • 加:夜里 0 点到 7 点不主动开口,白天再补。
  • 修:主动开口的样式是照着问答样例生成的,所以每句都像在回答一个不存在的问题,结尾固定挂「你饿不饿」。现在换成开口样例(短句、不起头就是一句陈述),每轮随机指定一种开口方式:说手上的事、想起他一句、抱怨一句、只丢两三个字、说一件变化、提一件打算做的事。
  • 加:主动开口会读自己最近六句,撞了就不说——同一个道具(粥、袖口、手凉)不会连着出现。两次都撞就这轮作罢,宁可不说。
  • 加:主动开口也带情绪和配图(按表情包设置),并且会清掉上一次没点的选项按钮。
  • 修:guessMood 用单字匹配,「了」被算进「无语」,导致「番茄藤绑好了」这类正常句子一律判成无语、连表情都选错。改成按词判断。
  • 加:⚙ 里多一个「让她现在说一句」,不等时间,点了就看效果。
  • 修:README 开关表里混进来一段旧表格残块。

2.0.1

  • 修:拖动时没限制边界,卡片能被推到屏幕外,标题栏抓不回来。现在拖动过程中就夹住,标题栏永远露在视口里。
  • 加:双击标题栏回到右下角默认位置。

2.0.0

  • 修:ISOLATION 这个变量在 1.3.0 被误删,/api/chat 全部返回 500——那之后她其实一句都说不出来。这是这版最主要的问题。
  • 修:补回 1.3.1 里漏掉的语料接口(之前保存语料会 404)。
  • 修:调音页的下拉框改成只试听,不再顺手把正在显示的模型换掉;要换模型另点「切到这只模型」。
  • 修:卡片位置存在本机,窗口缩小后可能跑到屏幕外,现在重开时自动收回可见范围。
  • 修:页面切到后台时暂停轮询,不再空跑请求。
  • 修:所有接受模型 id 的接口加了字符校验,避免拼出奇怪路径。
  • 改:对话要求补一条——不要每句都反问,不要用「哈哈」「嗯嗯」凑字数。
  • 清:删掉几个没用到的常量、开关和恒真判断。
2.0.0 之前的记录(黑历史,留着自嘲)

1.3.1

  • 修:语料接口整个漏掉了(页面打得开,存不进去,返回 404)。补回来。
  • 修:关掉「记住聊过的内容」之后不写聊天记录了,之前还在偷偷存。
  • 修:语料里的问答样例只在有当前这句话时挑,主动开口不再乱塞无关问答。
  • 修:主动说话间隔滑轴遇到旧配置值(比如 12 分钟)会显示成「关闭」,现在找最接近的档位。
  • 修:语料接口的模型 id 只接受安全字符。
  • 加:按 Esc 关掉覆盖层。

1.3.0

  • 主动说话的间隔可以调了:⚙ 里一根滑轴,关闭 / 30 分钟 / 1 小时 / 2 小时 / 4 小时。默认从原来的十几分钟放宽到 30 分钟。
  • 提示词改了顺序和说法:当前这句话和规则挪到最后,语料样例挪到前面并注明「只参考语气,别拿去回答」。之前她容易跟着样例跑,答非所问。
  • 规则里加了硬要求:先接住这句话,别答非所问;接不住就说短的,不要编。
  • 语料取样从「最多 3 组问答 + 4 句台词」收到「2 + 2」,少喂点无关内容。

1.2.2

  • 人设卡、音色、语料三个页面的按钮和说明改成通用说法:保存/追加保存/覆盖保存/放弃修改/选择文件/播放/关掉。
  • 状态提示统一成「读取中/已读取/保存中/已保存/保存失败」,不再出现「读…」「存好了」这种。
  • 语料页的示例和解析结果里,标签从「他/你」换成「对方/角色」。

1.2.1

  • 人设卡、音色、语料三个页面右上角各加了一个「关掉」。之前只能点外层那条栏上的按钮,页面本身没出口。
  • 外层那条栏的按钮改成「× 关掉」,更好认。

1.2.0

  • 语料吃的文件多了:.md、.csv、.srt、.vtt、.ass。字幕会自动去掉序号、时间轴和样式标签。
  • 拖进图片或视频会告诉你怎么办,不再默默没反应:图片留着当形象参考,视频请先导出字幕,或者把台词复制进来。
  • 语料页的文案改成不预设角色,原来的「他/你」换成「对方/角色」。

1.1.0

  • 加了语料功能:粘贴、选文件、拖拽三种喂法。解析结果实时预览,能看见条数和前十几条。
  • 存的语料会挑几条贴进提示词,优先挑跟当前这句话沾边的问答。

1.0.6

  • 音色和人设卡改成在卡片里盖一层打开。原来点按钮开新窗口,桌面端会拦掉,看起来像没反应。
  • 对话加了说话样例,删掉一句会让她自说自话的提示(“想想你此刻在做什么”)。
  • 回的句子硬卡在六十个字以内。
  • 没写人设时不再套用若妍那套词,换成只带模型名字的通用版。

1.0.5

  • 拖窗口改成用一层全屏遮罩接指针,修「窗口拖不动」。

1.0.4

  • README 加了反馈邮箱。

1.0.3

  • 设置项换成直白说法,每项加了鼠标悬停说明。

1.0.2

  • 缩放手柄挪到左上角,拖的时候不再粘手。
  • 拖动加了边界,拖出屏幕也拉得回来。

1.0.1

  • 去掉通用短答兜底。选项只由角色自己决定给不给。

1.0.0

  • 界面重做一轮。
  • README 重写成说明书。
  • 自带二十张 Q 版贴纸,可以导给 dsh-meme 用。
  • 记忆分两层:最近二十来句原文,加上关于对方的一串事实。
  • 去 AI 味:删套话、卡长度、允许只回两个字。
  • 手机页 /dsh-live2d/chat。
  • 人设卡编辑页、音色调色页。
  • 对外接口:/api/chat、/api/push、/api/poll。

反馈

遇到问题、想要新功能、觉得哪句话还是像 AI,都可以写信到 FujiwaraReisen@outlook.com。

也可以直接去 GitHub Issues 提,附上模型的来源和出问题的样子更容易定位。

致谢

  • Live2D Cubism Core © Live2D Inc.
  • pixi-live2d-display 与 pixi.js
  • DeepSeek Harness 大肥鱼

MIT © LFR · npm: dsh-live2dwaifu · GitHub

관련 플러그인