dsh-pet-live2d 3.1.2 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -36
- package/README.md +26 -9
- package/lib/client.js +547 -58
- package/lib/index.js +96 -1
- package/lib/sound-files.js +231 -0
- package/package.json +3 -3
- package/pets/ds-whale-girl/README.md +2 -0
- package/pets/ds-whale-girl/pet.json +7 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,56 +1,54 @@
|
|
|
1
1
|
# 更新日志
|
|
2
2
|
|
|
3
|
-
## 3.
|
|
3
|
+
## 3.2.0(2026-10-09)
|
|
4
4
|
|
|
5
|
-
###
|
|
5
|
+
### 新:会话状态提示音
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
「桌宠 → 会话提示音」单独控制总开关和音量;「会话相位」改为两列概览、按需展开编辑,不再把八个动作池同时铺满页面。每个相位可上传 MP3 / WAV / OGG 提示音并随宠物分别保存;移除上传即恢复宠物默认音符,静音和总开关仍独立生效。
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
[Loader.load] Failed to load dsh-app://api/live2d-pet/asset/ds-whale-girl/textures/texture_01.png
|
|
11
|
-
Error: [WorkerManager.loadImageBitmap] Failed to fetch … 404 Not Found
|
|
12
|
-
```
|
|
9
|
+
### 新:提示音可以「试听」
|
|
13
10
|
|
|
14
|
-
|
|
11
|
+
设置页每个相位多了「试听」:点一下直接听这个相位**会响的那段声音**(有上传听上传,否则听宠物/内置音符),不用等会话真的跑到那个相位。它**故意不受**总开关与单相位静音影响 —— 默认总开关就是关的,跟着它走等于"点了没反应";音量用当前提示音音量,音量为 0 时按 0.35 试听。**拖音量滑杆也会即时试听**(停手才响一次,用最终音量;音量 0 就是没声,不给兜底)。
|
|
15
12
|
|
|
16
|
-
|
|
17
|
-
2. Live2D 引擎(Pixi)是在 **blob Worker** 里 `fetch` 贴图的,而 **blob Worker 里解析根相对
|
|
18
|
-
地址 `/api/...` 会把 host 丢掉** ⇒ 请求变成 `dsh-app://api/...` ⇒ 服务端收到的是
|
|
19
|
-
`/live2d-pet/asset/...`(少了 `/api`)⇒ 404 ⇒ 贴图全挂、模型加载失败。
|
|
13
|
+
### 改:上传音频的判据两端统一(并放行"长度未知"的 WAV)
|
|
20
14
|
|
|
21
|
-
|
|
22
|
-
**保住 host 的绝对地址** —— `<协议>//<host>/api/...`。http(s) 外壳下与相对地址等价
|
|
23
|
-
(驱动全绿),`dsh-app://app` 下这正是页面自己那些相对请求能通的形式。
|
|
15
|
+
以前网页端只认开头几个字节、桌面端会完整解析容器,于是同一个文件可能"网页端传得进、桌面端读不出来"——相位的「已上传」在桌面端凭空消失,而且两边都不报错。现在两份宿主共用一套判据,由 `tools/sound-vectors.json` 的合同向量在两边测试里钉住;顺带放行长度字段写 `0` / `0xFFFFFFFF` 的流式 WAV(这类文件浏览器本来就能播,以前会被桌面端错杀)。
|
|
24
16
|
|
|
25
|
-
|
|
26
|
-
**光访问 `localStorage` 就会抛 `SecurityError`**,抛在组件第一帧 ⇒ 宠物与设置页一起白掉。
|
|
27
|
-
两处都要有,才算真正"适配得了各种桌面外壳"。)
|
|
17
|
+
## 3.1.3(2026-10-01)
|
|
28
18
|
|
|
29
|
-
|
|
19
|
+
### 修:设置里选「桌面」后,桌面上什么都没有(手动双击同一个 exe 却正常)
|
|
20
|
+
|
|
21
|
+
插件拉起的桌面端会以「挂载模式」去 DSH 那里取宠物数据,而它拿到的地址一直退回默认端口
|
|
22
|
+
3080 —— 在官方桌面客户端下那个端口没人听,于是桌面上空的。现在改成同时看请求的 `Host`
|
|
23
|
+
头(官方客户端的页面地址是 `dsh-app://`,这种外壳下只有 `Host` 是真实地址)。
|
|
24
|
+
|
|
25
|
+
### 修:官方桌面客户端里贴图全 404、宠物加载失败(issue #1)
|
|
26
|
+
|
|
27
|
+
官方客户端的页面地址是 `dsh-app://`,而引擎在 Worker 里按相对地址取贴图时,地址里的
|
|
28
|
+
`/api` 会被当成主机名 ⇒ 贴图全部 404。现在交给引擎的地址一律拼成保住主机名的绝对地址。
|
|
30
29
|
|
|
31
|
-
###
|
|
30
|
+
### 修:某些桌面外壳里宠物和设置页一起白掉
|
|
32
31
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
禁用 storage)。它抛在组件的第一帧里 ⇒ **宠物和设置页一起白掉**,现象看起来就像"这个插件
|
|
37
|
-
不支持我的桌面端"。
|
|
32
|
+
自定义协议或隐私设置下,**一访问 `localStorage` 就会抛异常**,而插件原来到处直接用它。
|
|
33
|
+
现在全部走带兜底的封装:拿不到就退回内存存储 —— 本次会话内位置、大小、装扮照常工作,
|
|
34
|
+
只是关掉窗口不留存。
|
|
38
35
|
|
|
39
|
-
|
|
36
|
+
### 改:macOS(arm64)的桌面端进了主包声明
|
|
40
37
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
38
|
+
装插件时会自动带上 mac 桌面端(在这之前只能从 Release 下 zip)。
|
|
39
|
+
|
|
40
|
+
## 3.1.2(2026-09-30)
|
|
41
|
+
|
|
42
|
+
### 修:官方桌面客户端里"加载失败"(issue #1)
|
|
43
|
+
|
|
44
|
+
`dsh-app://` 外壳下引擎取贴图的地址会丢主机名 ⇒ 404。现已改为传给引擎的地址保住主机名。
|
|
45
|
+
|
|
46
|
+
## 3.1.1(2026-09-30)
|
|
44
47
|
|
|
45
|
-
|
|
46
|
-
(`dsh.bundle` / `dsh.client` / `slots`)—— 所以换成 `http://127.0.0.1:<端口>` 之外的外壳
|
|
47
|
-
地址也不该受影响。
|
|
48
|
+
### 修:某些桌面外壳里宠物与设置页一起白掉
|
|
48
49
|
|
|
49
|
-
|
|
50
|
+
这些外壳里访问 `localStorage` 会抛异常;现已加兜底,拿不到就用内存存储。
|
|
50
51
|
|
|
51
|
-
`dsh-pet-live2d-desktop-darwin-arm64` 已在上一版发上 npm,这一版把主包的
|
|
52
|
-
`optionalDependencies` 补上它 —— mac 用户装插件时会自动带上桌面端(在这之前只能从
|
|
53
|
-
Release 下 zip)。
|
|
54
52
|
|
|
55
53
|
## 3.1.0(2026-09-29)
|
|
56
54
|
|
package/README.md
CHANGED
|
@@ -62,7 +62,7 @@ dsh plugin --profile web add "link:./dsh-pet-live2d/dsh-live2d-pet"
|
|
|
62
62
|
|
|
63
63
|
插件包里就带着一只可用的宠物(`pets/ds-whale-girl/`,CC BY-NC-SA 4.0)。**第一次运行时
|
|
64
64
|
宿主半区会把它复制进 `%DSH_HOME%\pets\`**,所以装完插件、重启 `dsh web` 就能看见。
|
|
65
|
-
|
|
65
|
+
升级时原封不动的随包宠物会同步新版默认值(包括提示音);你自己改过的宠物目录优先,不会被覆盖。
|
|
66
66
|
|
|
67
67
|
## 怎么用
|
|
68
68
|
|
|
@@ -85,9 +85,9 @@ dsh plugin --profile web add "link:./dsh-pet-live2d/dsh-live2d-pet"
|
|
|
85
85
|
- **「默认」=回到默认**(把这个槽位清空)。`默认 10 : 脸红 1` = 大约每 11 次摸鱼脸红一次、
|
|
86
86
|
其余时间回到没有。想让某个槽位**完全不动**,把它的条目删光或权重归 0。
|
|
87
87
|
|
|
88
|
-
###
|
|
88
|
+
### 会话相位:动作、气泡与提示音放在一起
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
设置页「会话提示音」卡统一控制开关和音量;紧邻的「会话相位」卡将八个相位排成宽屏两列、窄屏单列的概览,默认收起,点开一个相位后才显示它的「气泡与提示音」「动作槽位」编辑区。行头「重置动作」只恢复动作槽位;台词用自己的「恢复默认」按钮,提示音可单独静音、**试听**或上传文件。动作池子仍是"槽位 → 条目表",机制和摸鱼一样。**宠物跟着 DSH 的真实事件换相位**:
|
|
91
91
|
|
|
92
92
|
| 相位 | 什么时候 | 这只宠物演什么 |
|
|
93
93
|
|---|---|---|
|
|
@@ -106,10 +106,11 @@ dsh plugin --profile web add "link:./dsh-pet-live2d/dsh-live2d-pet"
|
|
|
106
106
|
|
|
107
107
|
相位表**一开始就列出全部相位**,显示的是**有效池子**:
|
|
108
108
|
|
|
109
|
-
|
|
|
109
|
+
| 行头概览 | 含义 | 恢复方式 |
|
|
110
110
|
|---|---|---|
|
|
111
|
-
|
|
|
112
|
-
|
|
|
111
|
+
| 动作默认 / 已改 | 动作槽位沿用宠物默认 / 用你的池子 | 动作改过才显示「重置动作」,只重置动作池 |
|
|
112
|
+
| 台词默认 / 已改 | 该相位台词是否被你修改 | 展开后点「恢复默认」 |
|
|
113
|
+
| 音频宠物默认 / 已上传 / 已静音 / 未配置 | 宠物音符、当前宠物的上传文件、单独静音或未声明 | 展开后上传、移除上传或勾选提示音 |
|
|
113
114
|
|
|
114
115
|
改动**只在真的编辑时才落盘**,所以"看一眼"不会留下覆盖 —— 以后宠物更新了默认值,
|
|
115
116
|
没改过的相位照样吃得到。
|
|
@@ -125,6 +126,18 @@ dsh plugin --profile web add "link:./dsh-pet-live2d/dsh-live2d-pet"
|
|
|
125
126
|
|
|
126
127
|
右键面板的「装扮」页签跟着相位走 —— 会话中它显示的是**相位抽到的**,不是你上次手选的。
|
|
127
128
|
|
|
129
|
+
### 提示音:完成 / 失败 / 需要你处理
|
|
130
|
+
|
|
131
|
+
在 **DSH 设置页 → 桌宠 → 会话提示音** 打开总开关并调节音量(默认关闭);到紧邻的「会话相位」卡点开相位,在「提示音」处选 **上传音频**。支持 MP3 / WAV / OGG,单文件最多 1 MB;每只宠物、每个相位分别保存到 `$DSH_HOME/pet-sounds/`,换宠物不会沿用另一只的上传音频。「移除上传」恢复宠物默认音符,静音勾选框也能关闭已上传音频;上传成功会解除该相位先前的静音,但不会替你打开总开关。上传音频比宠物音符优先,两个窗口最多 3 秒同步一次。
|
|
132
|
+
|
|
133
|
+
上传的文件是按**容器结构**校验的(不是看扩展名,也不是只看开头几个字节):MP3 要有合法的帧头、Ogg 要过页校验、WAV 的 fmt/data 块要自洽 —— **网页端与桌面端用的是同一套判据**(同一份合同向量在两边测试里跑)。长度字段写成 `0` 或 `0xFFFFFFFF` 的"流式" WAV 也收;明显不是音频、或被截断的文件会在上传时就报错,不会写进 `$DSH_HOME/pet-sounds/`。
|
|
134
|
+
|
|
135
|
+
旁边的 **「试听」** 让你不必等会话真的跑到那个相位:点一下直接听这一相位**会响的那段声音**(有上传听上传,否则听宠物/内置音符)。它**故意不受**总开关与单相位静音影响 —— 默认总开关就是关的,跟着它走等于"点了没反应";音量用当前提示音音量,音量为 0 时按 0.35 试听。没有任何音源(未配置、也没上传)的相位,按钮是灰的。
|
|
136
|
+
|
|
137
|
+
**拖动「会话提示音」卡里的音量滑杆也会即时试听**一小段(防抖:停手才响,响的是最终音量;这只宠物一个音源都没有时只给数字反馈)。音量滑杆这条**按真实音量**响 —— 拖到 0 就是静音,不会像「试听」按钮那样兜底发声,否则你听到的就不是"0 有多大声"了。
|
|
138
|
+
|
|
139
|
+
未上传时,内置宠物的 `done`、`failed`、`waiting`(待批准)、`asking`(待回答)各有一段合成短音;别的宠物可在 `pet.json` 的 `live2d.sounds` 声明自己的音符,空数组表示该相位不响,未声明整个字段的旧宠物沿用内置四声。音量拉到 0 会静音;首次播放前浏览器需要你点击一次页面解锁音频。初次连接的状态快照和重复状态不会响;若两个窗口同时接收相位,两边都开启时可能各响一次。
|
|
140
|
+
|
|
128
141
|
### 互动:摸头 / 摸尾巴 / 转圈
|
|
129
142
|
|
|
130
143
|
点她身上会有反应,判定用的是**模型自己的几何**,不是画出来的区域:
|
|
@@ -159,9 +172,7 @@ dsh plugin --profile web add "link:./dsh-pet-live2d/dsh-live2d-pet"
|
|
|
159
172
|
她说话时会弹一个小气泡(问候、点击、摸头、摸尾巴、转晕、归位,以及**每个会话相位一句**:
|
|
160
173
|
思考中 / 用工具 / 等你批准 / 等你回答 / 叫了帮手 / 消息排队 / 完成 / 出错)。
|
|
161
174
|
|
|
162
|
-
-
|
|
163
|
-
(随机挑一句);**留空 = 用宠物默认**(`pet.json` 的 `live2d.lines`),所以"看一眼"不会
|
|
164
|
-
把默认改掉。
|
|
175
|
+
- **所有文本都能改**:会话台词在「会话相位」卡的对应相位里,其他台词在「气泡」卡。非相位的一组台词**用 `|` 分隔多个变体**(随机挑一句),留空使用宠物默认;相位台词是一句,留空表示该相位不弹,点「恢复默认」可回到宠物台词。看一眼设置不会留下覆盖。
|
|
165
176
|
- **位置可调**:左右 / 上下偏移两个滑杆(相对她头顶的默认位置),另有"一句话停留多久"。
|
|
166
177
|
- **总开关**:关掉之后任何台词都不弹。
|
|
167
178
|
|
|
@@ -258,6 +269,8 @@ dsh plugin --profile web add "link:./dsh-pet-live2d/dsh-live2d-pet"
|
|
|
258
269
|
],
|
|
259
270
|
// 会话相位 -> 槽位 -> 选项(读成"每个槽位一条、权重 1"的池子)
|
|
260
271
|
"looksByPhase": { "done": { "whale": "头顶鲸", "mood": "开心兴奋" } },
|
|
272
|
+
// 可选:每个相位一组 [频率 Hz, 从开始播放起的秒数];空数组表示该相位静音
|
|
273
|
+
"sounds": { "done": [[660, 0], [880, 0.13]], "failed": [] },
|
|
261
274
|
// 摸鱼默认盯哪些槽位(用户还能再加;不写就是"手/情绪/脸红/嘴/眼"那五个兜底)
|
|
262
275
|
"fidgetSlots": ["rhand", "lhand", "mood", "cheek", "mouth", "eyes", "selfie"],
|
|
263
276
|
// 互动反应候选(标签 = 动作的中文名或表情名)。**三个键都可以不写** ——
|
|
@@ -278,6 +291,7 @@ dsh plugin --profile web add "link:./dsh-pet-live2d/dsh-live2d-pet"
|
|
|
278
291
|
|
|
279
292
|
- **动作和表情列表以 `.model3.json` 里声明的为准**,插件启动时从模型读出 —— 换模型 / 改模型
|
|
280
293
|
文件立刻生效,不用改插件代码。
|
|
294
|
+
- `sounds`:宠物声明后只有列出的相位会响;每相位最多 8 个正弦音符,频率 80–4000 Hz、起始时间 0–2 秒。没写整个字段的旧宠物沿用内置四声;无效音符不会播放。声音由页面合成,音量和静音可在设置页调整。
|
|
281
295
|
- `motionOptions`:`hold`(停在最后一帧)/ `persist`(定格且不自动放手)/ `prepend`(先播前置
|
|
282
296
|
动作)/ `preset`(开播前把某些参数写死)。不写就是"播一次然后回待机"。
|
|
283
297
|
- `motionGuards`:动作的前提,形如"槽位 = 标签白名单"。**白名单形式没法自动满足,只能拦**
|
|
@@ -295,6 +309,9 @@ dsh plugin --profile web add "link:./dsh-pet-live2d/dsh-live2d-pet"
|
|
|
295
309
|
| GET | `/api/live2d-pet/asset/<id>/<path>` | 只服务 `model3.json` **引用闭包**内的文件(白名单 Set 比对 + realpath 包含,`..` 永远匹配不上) |
|
|
296
310
|
| GET | `/api/live2d-pet/runtime/live2dcubismcore.min.js` | Cubism Core:本地有就发本地的,没有就去 Live2D 官方 CDN 取一份并缓存(`x-live2d-core-source: cdn`);两边都拿不到才 502 |
|
|
297
311
|
| GET | `/api/live2d-pet/runtime/live2d-vendor.js` | 插件内置的 MIT vendor 分包(pixi.js + 引擎),按需懒加载 |
|
|
312
|
+
| GET | `/api/live2d-pet/sound/<id>` | 查询这只宠物已上传音频的相位、URL、格式和版本 |
|
|
313
|
+
| GET | `/api/live2d-pet/sound/<id>/<phase>` | 读取已上传的相位音频 |
|
|
314
|
+
| POST | `/api/live2d-pet/sound/<id>/<phase>` | JSON `{ "base64": "..." }` 上传,或 `{ "action": "reset" }` 移除;限 MP3 / WAV / OGG、1 MB |
|
|
298
315
|
|
|
299
316
|
API 与资产路由默认只答本机回环请求。
|
|
300
317
|
|