dsh-notify-say 0.4.21 → 0.4.25
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/README.md +216 -176
- package/docs/audio-audit/README.md +164 -0
- package/docs/audio-audit/fetch-snapshots.ps1 +76 -0
- package/docs/audio-audit/snapshots/ameharu-hau.txt +89 -0
- package/docs/audio-audit/snapshots/goki-nuigurumi.txt +73 -0
- package/docs/audio-audit/snapshots/kasukabe-tsumugi.txt +197 -0
- package/docs/audio-audit/snapshots/manbetsu-hanamaru.txt +27 -0
- package/docs/audio-audit/snapshots/meimei-meria.txt +84 -0
- package/docs/audio-audit/snapshots/mochiko.txt +27 -0
- package/docs/audio-audit/snapshots/namiine-ritsu.txt +76 -0
- package/docs/audio-audit/snapshots/shirakami-kotaro.txt +158 -0
- package/docs/audio-audit/snapshots/sss-anonymous-common.txt +142 -0
- package/docs/audio-audit/snapshots/sss-zundamon.txt +142 -0
- package/docs/audio-audit/snapshots/voicevox-software.txt +41 -0
- package/docs/audio-audit/snapshots/voicevox-vvm-terms.txt +385 -0
- package/docs/audio-audit/snapshots/yurei-chan.txt +112 -0
- package/docs//345/276/205/345/201/232/346/270/205/345/215/225.md +218 -0
- package/docs//350/257/255/351/237/263/345/214/205/345/210/206/345/217/221/346/226/271/346/241/210-/345/276/205/345/256/241/351/230/205.md +378 -0
- package/lib/client.js +50 -8
- package/lib/config-route.js +251 -209
- package/lib/http-guard.js +222 -0
- package/lib/index.js +1822 -1768
- package/lib/session-bridge.js +138 -117
- package/package.json +11 -2
- package/test/audio-source.test.mjs +184 -0
- package/test/audio-wiring.test.mjs +287 -0
- package/test/client-bundle.test.mjs +671 -0
- package/test/client-contract.test.mjs +118 -0
- package/test/config-coverage.test.mjs +109 -0
- package/test/config-route.test.mjs +212 -0
- package/test/config-schema.test.mjs +147 -0
- package/test/config-store.test.mjs +256 -0
- package/test/dev-reload.test.mjs +132 -0
- package/test/effective-for-client.test.mjs +142 -0
- package/test/fail-route.test.mjs +128 -0
- package/test/fail-voice.test.mjs +193 -0
- package/test/http-guard.test.mjs +143 -0
- package/test/http-integration.test.mjs +284 -0
- package/test/idle-gate.test.mjs +167 -0
- package/test/preview.test.mjs +92 -0
- package/test/real-cordis.test.mjs +204 -0
- package/test/release-voice-guard.test.mjs +185 -0
- package/test/reload-live.test.mjs +261 -0
- package/test/reload-verification.test.mjs +218 -0
- package/test/route-loader-register.mjs +22 -0
- package/test/scalar-guard.test.mjs +125 -0
- package/test/session-jump.test.mjs +266 -0
- package/test/stub-child-process.mjs +43 -0
- package/test/tts-lines.test.mjs +112 -0
- package/test/version-consistency.test.mjs +98 -0
- package/test/voice-availability.test.mjs +90 -0
- package/test/wav-gain.test.mjs +138 -0
- package/test/wiring.test.mjs +287 -0
- package/tools/notify-config.ps1 +472 -471
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# 待做清单
|
|
2
|
+
|
|
3
|
+
> 最后更新:2026-10-18(v0.4.24)
|
|
4
|
+
> 来源:外部代码审阅(2026-10-18)、外部合规审阅(2026-10-18)、自查
|
|
5
|
+
|
|
6
|
+
## 状态图例
|
|
7
|
+
|
|
8
|
+
- ✅ 已完成
|
|
9
|
+
- 🔴 高优(影响正确性或安全)
|
|
10
|
+
- 🟡 中优(影响可维护性)
|
|
11
|
+
- 🟢 低优(体验优化)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 一、已完成
|
|
16
|
+
|
|
17
|
+
| # | 事项 | 版本 |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| 1 | 热重载可自证生效(三个真 bug) | 0.4.20 |
|
|
20
|
+
| 2 | 阻断个人声音样本进发布包 | 0.4.21 |
|
|
21
|
+
| 3 | 移除 Mixkit mp3(许可禁止再分发) | 0.4.22 |
|
|
22
|
+
| 4 | npm files 补第三方声明 | 0.4.22 |
|
|
23
|
+
| 5 | 音色许可审核体系 + 13 份官方原文快照 | 0.4.22 |
|
|
24
|
+
| 6 | 禁用 mochiko / kasukabe-tsumugi / yurei-chan | 0.4.22 |
|
|
25
|
+
| 7 | **P0 会话跳转类型不匹配 bug** | 0.4.23 |
|
|
26
|
+
| 8 | jumpEnabled 降级逻辑与注释相反 | 0.4.23 |
|
|
27
|
+
| 9 | GUI 音色列表含被禁音色 | 0.4.23 |
|
|
28
|
+
| 10 | 安装提示指向不存在的脚本 | 0.4.23 |
|
|
29
|
+
| 11 | **插件路由无鉴权**(实测可无凭据改配置)+ 本地来源防护 | 0.4.24 |
|
|
30
|
+
| 12 | 请求体大小上限 + preview/selftest 限流 | 0.4.24 |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 二、🔴 高优(下批做)
|
|
35
|
+
|
|
36
|
+
### 1. HTTP 接口安全边界(✅ 主体已完成,余项见下)
|
|
37
|
+
|
|
38
|
+
**2026-10-18 实测结论**:宿主 `/api` 网关有鉴权(无凭据 401),
|
|
39
|
+
但插件 `webServer.register()` 的路由**不在保护范围** ——
|
|
40
|
+
不带凭据 POST `config/set` 返回 200 且真的改了配置。
|
|
41
|
+
|
|
42
|
+
已完成(v0.4.24):
|
|
43
|
+
- [x] 查清监听地址(webServer 默认 `127.0.0.1`)与鉴权边界
|
|
44
|
+
- [x] `readJsonBody()` 加 64 KB 累计上限(413 区分于 400)
|
|
45
|
+
- [x] `preview` / `selftest` 3 秒最小间隔限流(429 + retry-after)
|
|
46
|
+
- [x] 本地来源防护:Origin/Referer 必须本机回环、拒绝 cross-site、
|
|
47
|
+
写操作强制 JSON(堵死跨站表单提交)
|
|
48
|
+
|
|
49
|
+
**剩余待做**:
|
|
50
|
+
- [ ] `consume` 仍用 GET 清状态(语义上应 POST)—— 已加来源防护,
|
|
51
|
+
但语义仍不理想;改动需同步 client.js 与测试
|
|
52
|
+
- [ ] `selftest` / `preview` 仍是 GET 触发副作用 —— 同上
|
|
53
|
+
- [ ] 加「导出诊断」时的脱敏(见第 5 项)
|
|
54
|
+
|
|
55
|
+
**仍然存在的局限(如实记录)**:
|
|
56
|
+
- 不防本机进程。本机进程伪造 Origin 很容易,但它在 Windows 上本来
|
|
57
|
+
就能直接读文件,不属本模块职责。
|
|
58
|
+
|
|
59
|
+
### 2. 公开测试与 CI
|
|
60
|
+
|
|
61
|
+
**现状**:公开仓库没有 `test/`、没有 `.github/workflows/`、
|
|
62
|
+
`package.json` 没有 `scripts`、没有 `tools/release*.ps1`。
|
|
63
|
+
但 README 让人运行 `npm run test:all` —— **跑不了**。
|
|
64
|
+
|
|
65
|
+
**具体待办**:
|
|
66
|
+
- [ ] 把 `test/` 中**不依赖本机 DSH 安装**的部分公开
|
|
67
|
+
- [ ] 公开 `tools/release-build.ps1`(去掉本机路径)
|
|
68
|
+
- [ ] `package.json` 加 `scripts.test` / `scripts.test:all`
|
|
69
|
+
- [ ] GitHub Actions:提交 → 单元测试 → PowerShell 语法检查 → 打包检查
|
|
70
|
+
- [ ] 区分「可在公共 CI 跑」与「需本机 DSH 环境」两类测试
|
|
71
|
+
|
|
72
|
+
**为什么优先**:这是「本地修好但 GitHub 没更新」这类问题的根治手段。
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 三、🟡 中优
|
|
77
|
+
|
|
78
|
+
### 3. 语音包存储层重构(**必须先于下载功能**)
|
|
79
|
+
|
|
80
|
+
**现状**:三处都硬编码「插件安装目录」:
|
|
81
|
+
|
|
82
|
+
| 位置 | 行为 |
|
|
83
|
+
|---|---|
|
|
84
|
+
| `index.js → hasVoiceLine` | 查 `<plugin>/sounds/voice-lines` |
|
|
85
|
+
| `dsh-notify.ps1` | 从插件目录找声音 |
|
|
86
|
+
| `tools/notify-config.ps1 → Remove-VoicePack` | 直接删插件目录里的 wav |
|
|
87
|
+
|
|
88
|
+
**问题**:下载功能要写到 `%LOCALAPPDATA%`(插件目录不可写)。
|
|
89
|
+
若不先改路径,会出现「下载成功但插件找不到音色」。
|
|
90
|
+
|
|
91
|
+
**目标结构**:
|
|
92
|
+
```
|
|
93
|
+
<plugin-root>/sounds/voice-lines/ 只读,随 npm 安装
|
|
94
|
+
%LOCALAPPDATA%/dsh-notify-say/
|
|
95
|
+
voice-lines/<key>/ 用户下载,读写
|
|
96
|
+
packs.json 已装包清单
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**具体待办**:
|
|
100
|
+
- [ ] 新建 `lib/voice-pack-store.js`:统一查找 / 安装 / 卸载
|
|
101
|
+
- [ ] 查找顺序:用户目录 → 插件目录(后者兜底)
|
|
102
|
+
- [ ] PowerShell 播放脚本改为**接收明确路径参数**,不自己拼规则
|
|
103
|
+
- [ ] ZIP 解压:SHA-256 校验 + 拒绝 `../` 与绝对路径 + 先写临时目录再切换
|
|
104
|
+
|
|
105
|
+
### 4. README 全量校正
|
|
106
|
+
|
|
107
|
+
**现状**:改名后多处仍是旧内容。
|
|
108
|
+
|
|
109
|
+
| 位置 | 现状 | 应为 |
|
|
110
|
+
|---|---|---|
|
|
111
|
+
| 标题 | `dsh-notify-desktop` | `dsh-notify-say` |
|
|
112
|
+
| 插件搜索名 | 旧包名 | 新包名 |
|
|
113
|
+
| 手动 link 示例 | 旧包名 | 新包名 |
|
|
114
|
+
| 测试部分 | 101 条 + 不存在的脚本 | 与真实情况同步 |
|
|
115
|
+
| 设置页介绍 | 「主要由 Config schema 自动生成」 | 说明实际是设置卡片 |
|
|
116
|
+
| 语音包说明 | 旧音色数量 | 以真实已发布资源为准 |
|
|
117
|
+
|
|
118
|
+
**具体待办**:
|
|
119
|
+
- [ ] 全量对照实际代码校正
|
|
120
|
+
- [ ] 重组结构:功能 → 安装 → 首次成功通知 → 配置 → 语音包 → 故障排查 → 开发
|
|
121
|
+
- [ ] 内部设计历史移到 `docs/`,首页不让新用户先读开发过程
|
|
122
|
+
|
|
123
|
+
### 5. 日志隐私分级
|
|
124
|
+
|
|
125
|
+
**现状**:日志记录了 TTS 台词全文、Toast 标题正文,写入 `%TEMP%`。
|
|
126
|
+
用户提 Issue 时可能直接上传。
|
|
127
|
+
|
|
128
|
+
**具体待办**:
|
|
129
|
+
- [ ] 默认档:只记时间、事件类型、音源、成功/失败、错误码(**不记台词正文**)
|
|
130
|
+
- [ ] Debug 档:用户主动开启,明确提示可能含敏感信息
|
|
131
|
+
- [ ] 「导出诊断」功能:自动脱敏用户名与路径
|
|
132
|
+
|
|
133
|
+
### 6. 主文件职责拆分
|
|
134
|
+
|
|
135
|
+
**现状**:`index.js` 约 1769 行 / 88 KB,`client.js` 约 1489 行 / 69 KB。
|
|
136
|
+
|
|
137
|
+
**建议顺序**(不做一次性重写):
|
|
138
|
+
- [ ] 先提取 `audio-runner.js`(PowerShell 启动、超时、并发)
|
|
139
|
+
- [ ] 再提取 `idle-gate.js`(等子代理真正完成)
|
|
140
|
+
- [ ] 长注释逐步搬到 `docs/architecture.md`
|
|
141
|
+
|
|
142
|
+
**注意**:`client.js` 跑在 DSH 受限渲染环境,拆分前要确认宿主模块加载约束。
|
|
143
|
+
|
|
144
|
+
### 7. 自热重载移出生产路径
|
|
145
|
+
|
|
146
|
+
- [ ] 生产版不提供普通 GUI 开关
|
|
147
|
+
- [ ] 开发版保留
|
|
148
|
+
- [ ] 待宿主接口稳定 + 能验证全部模块一致替换后再考虑正式支持
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 四、🟢 低优
|
|
153
|
+
|
|
154
|
+
### 8. 发布资源机器可读清单
|
|
155
|
+
|
|
156
|
+
- [ ] `MANIFEST.md` 去掉本机 `E:\...` 路径
|
|
157
|
+
- [ ] 改为记录:Git commit、构建版本、构建脚本版本、资源哈希、可公开的工具链信息
|
|
158
|
+
|
|
159
|
+
### 9. 试听状态细化
|
|
160
|
+
|
|
161
|
+
**现状**:启动子进程即返回 `{ok:true}`,不代表真的播出来了。
|
|
162
|
+
|
|
163
|
+
- [ ] 状态区分:`accepted` / `throttled` / `failed-to-start` / 实际播放完成
|
|
164
|
+
|
|
165
|
+
### 10. Windows 集成测试
|
|
166
|
+
|
|
167
|
+
- [ ] 建立专门的 PowerShell 集成测试入口
|
|
168
|
+
- [ ] 明确标注哪些需真实 DSH 环境
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## 五、产品功能待做
|
|
173
|
+
|
|
174
|
+
### 11. 语音包下载 UI
|
|
175
|
+
|
|
176
|
+
**前置**:第 3 项(存储层重构)必须先完成。
|
|
177
|
+
|
|
178
|
+
- [ ] GUI「语音包管理」区:列出 13 个已审核音色
|
|
179
|
+
- [ ] 显示许可摘要(署名要求 + 禁止事项 + 官方链接)
|
|
180
|
+
- [ ] 下载前必须勾选「我已阅读适用条款」
|
|
181
|
+
- [ ] 随 ZIP 附带该音色的 `TERMS.md`
|
|
182
|
+
- [ ] 下载后刷新音色列表
|
|
183
|
+
|
|
184
|
+
### 12. GitHub Release 归档
|
|
185
|
+
|
|
186
|
+
- [ ] 建 Release 页面(有 tag 但 Releases 页是空的)
|
|
187
|
+
- [ ] 上传 13 个音色 zip(或总包)
|
|
188
|
+
|
|
189
|
+
### 13. 音色扩充调研
|
|
190
|
+
|
|
191
|
+
- [ ] **VOICEVOX Nemo**:无人格纯音声库,条款最简单,值得优先评估
|
|
192
|
+
- [ ] 中国うさぎ、中部つるぎ(SSS 阵营,条款同源)
|
|
193
|
+
- [ ] WhiteCUL、猫使アル/ビィ、春歌ナナ 等(需逐个查条款)
|
|
194
|
+
|
|
195
|
+
### 14. 其他
|
|
196
|
+
|
|
197
|
+
- [ ] 关闭 Wiki(`has_wiki: true` 但无内容)
|
|
198
|
+
- [ ] 加 `.gitattributes`(ps1 用 CRLF)
|
|
199
|
+
- [ ] README 界面截图
|
|
200
|
+
- [ ] 手工验收 GUI 增益滑杆与试听按钮
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## 六、已知限制(不打算改)
|
|
205
|
+
|
|
206
|
+
| 项 | 原因 |
|
|
207
|
+
|---|---|
|
|
208
|
+
| 缺 VOICEVOX 生成记录 | 历史文件无法反推;已如实标注 `not_recorded` |
|
|
209
|
+
| `wixsite.com` 抓不到 | 本机网络不可达;已有摘要,且相关音色已排除 |
|
|
210
|
+
| 13 个音色均为 CONDITIONAL 而非专项授权 | 官方未针对「ZIP 语音包」明文许可,属综合解释 |
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## 七、维护规则
|
|
215
|
+
|
|
216
|
+
1. 新增音色 → 先抓官方原文快照 → 填 `docs/audio-audit/README.md` → 才能进下载列表
|
|
217
|
+
2. 改用途(收费/公司/赞助)→ 全部重新审核
|
|
218
|
+
3. 每项完成后在本文件标记 ✅ 并写版本号
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
# 语音包分发方案(供外部审阅)
|
|
2
|
+
|
|
3
|
+
> 本文档用于外部技术/合规审阅。审阅者可直接访问下方仓库核对实际代码与文件。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 0. 项目基本信息(供审阅者核对)
|
|
8
|
+
|
|
9
|
+
| 项 | 值 |
|
|
10
|
+
|---|---|
|
|
11
|
+
| 项目名 | `dsh-notify-say` |
|
|
12
|
+
| GitHub | https://github.com/unifilitence/dsh-notify-say (公开,MIT) |
|
|
13
|
+
| npm | `dsh-notify-say@0.4.20` |
|
|
14
|
+
| 性质 | 免费、开源、无商业化计划 |
|
|
15
|
+
| 运行平台 | DeepSeek Harness (DSH) Desktop 插件,Windows |
|
|
16
|
+
| 代码许可 | MIT(仅代码) |
|
|
17
|
+
| 语音素材 | 由 VOICEVOX 生成,许可独立于代码 |
|
|
18
|
+
| 当前测试 | 239 条自动化测试全绿 |
|
|
19
|
+
|
|
20
|
+
### 功能定位
|
|
21
|
+
|
|
22
|
+
DSH 任务完成/失败/提问时,用**人声**播报结果(而非系统"叮"声)。
|
|
23
|
+
差异化点:本地合成、零网络、不调用云端 TTS。
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 1. 现状事实(已核实,非推测)
|
|
28
|
+
|
|
29
|
+
### 1.1 素材规模
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
音色数:16
|
|
33
|
+
文件数:247 个 wav
|
|
34
|
+
总体积:47.9 MB
|
|
35
|
+
单音色:约 2.8 MB
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 1.2 18 个音色清单
|
|
39
|
+
|
|
40
|
+
| # | 音色 key | 句数 | 状态 |
|
|
41
|
+
|---|---|---|---|
|
|
42
|
+
| 1 | ameharu-hau(雨晴はう) | 6 | ⚠️ 待查 |
|
|
43
|
+
| 2 | ankomon(あんこもん) | 6 | ✅ 相对安全 |
|
|
44
|
+
| 3 | goki-nuigurumi(後鬼) | 6 | ⚠️ 待查(企业使用需确认) |
|
|
45
|
+
| 4 | kasukabe-tsumugi(春日部つむぎ) | 6 | ⚠️ 待查 |
|
|
46
|
+
| 5 | kyushu-sora(九州そら) | 6 | ✅ 相对安全 |
|
|
47
|
+
| 6 | manbetsu-hanamaru-genki(万別花丸) | 6 | ✅ 相对安全 |
|
|
48
|
+
| 7 | meimei-meria(冥鳴ひまり) | 6 | ✅ 相对安全 |
|
|
49
|
+
| 8 | **mochiko(もち子さん)** | 6 | ❌ **疑似明确禁止无偿分发** |
|
|
50
|
+
| 9 | namiine-ritsu(波音リツ) | 6 | ⚠️ 待查 |
|
|
51
|
+
| 10 | shikoku-metang(四国めたん) | 6 | ✅ 相对安全 |
|
|
52
|
+
| 11 | shirakami-kotaro(白上虎太郎) | 6 | ⚠️ 待查 |
|
|
53
|
+
| 12 | tohoku-kiritan(東北きりたん) | 6 | ✅ 相对安全 |
|
|
54
|
+
| 13 | tohoku-zunko(東北ずん子) | 6 | ✅ 相对安全 |
|
|
55
|
+
| 14 | yurei-chan(ユーレイちゃん / U-Stella, CV:神崎零) | 6 | ⚠️ 非商用可,商用需事前确认 |
|
|
56
|
+
| 15 | zundamon-amama(ずんだもん/あまあま) | 6 | ✅ 相对安全 |
|
|
57
|
+
| 16 | zundamon-normal(ずんだもん/ノーマル) | 6 | ✅ 相对安全 |
|
|
58
|
+
|
|
59
|
+
**注意**:"相对安全"指该角色属于 SSS / ずんずんプロジェクト 等有公开统一条款的阵营,**不等于已完成逐条审核**,也不等于已获得官方认可。
|
|
60
|
+
|
|
61
|
+
### 1.3 关键缺口:**没有生成记录**
|
|
62
|
+
|
|
63
|
+
这是本方案最实质的约束。当前**没有**保存:
|
|
64
|
+
|
|
65
|
+
- 每个 wav 的原始台词文本
|
|
66
|
+
- 使用的 `style_id`
|
|
67
|
+
- 语速/音高/抑扬参数
|
|
68
|
+
- VOICEVOX 引擎版本
|
|
69
|
+
|
|
70
|
+
**影响**:无法复现生成、无法证明某文件对应该角色。外部审阅建议的 `AUDIO_MANIFEST.csv`(含 SHA-256、生成文本、许可 URL)目前**无法完整填写**。
|
|
71
|
+
|
|
72
|
+
**可补救程度**:部分。VOICEVOX 引擎仍在本机(`E:\Tools\VOICEVOX`,2.3 GB),但仅凭音频无法反推原始参数。
|
|
73
|
+
|
|
74
|
+
### 1.4 已查证的条款要点
|
|
75
|
+
|
|
76
|
+
| 来源 | 结论 |
|
|
77
|
+
|---|---|
|
|
78
|
+
| [VOICEVOX 软件条款](https://voicevox.hiroshiba.jp/term/) | 商用/非商用皆可;软件本身禁止再分发;需署名 |
|
|
79
|
+
| [ずんずんプロジェクト音源规约](https://zunko.jp/con_ongen_kiyaku.html) | 商用/非商用皆可;需署名 `VOICEVOX:ずんだもん` 式;**规定了向"他者"授权时须传递条款义务** |
|
|
80
|
+
| [もち子さん 角色规约](https://vtubermochio.wixsite.com/mochizora/) | **禁止无偿配布/有偿贩卖其合成音声制作的音声素材**(已有官方原文支持,见 §1.5) |
|
|
81
|
+
| [VOICEVOX vvm README](https://github.com/VOICEVOX/voicevox_vvm/blob/main/README.md) | **ユーレイちゃん**:非商用可(含同人/直播收入),**商用须向 U-Stella 事前确认** |
|
|
82
|
+
|
|
83
|
+
**关键判读分歧**:
|
|
84
|
+
|
|
85
|
+
- **甲方观点**:ずんずん条款写了"向他者授权时须传递义务",说明再分发**是被考虑的、允许的**,只是须附条件。
|
|
86
|
+
- **乙方观点**:该条款只规定义务传递,**未明确授予再分发权**;且各角色条款差异大,不能一概而论。
|
|
87
|
+
|
|
88
|
+
**本方案不预设哪方正确,而是采用"最保守做法可同时满足两方"的路径**(见 §3)。
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 2. 技术约束(已实测,非推测)
|
|
93
|
+
|
|
94
|
+
| 能力 | 结果 | 影响 |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| 宿主 `fetch` 联网 | ✅ 可用(Node 24 内置,实测 HTTP 200) | 可实现下载 |
|
|
97
|
+
| `node_modules` 写入 | ❌ 不可写 | 不能把语音包放安装目录 |
|
|
98
|
+
| `$DSH_HOME/storages` 写入 | ✅ 可写 | 但那是配置目录,不该放音频 |
|
|
99
|
+
| 渲染进程写文件 | ❌ 沙箱内无 fs | 必须由宿主侧写盘 |
|
|
100
|
+
| GUI 与宿主通信 | ✅ 已有 HTTP route 机制 | 可加 `/voicepack` 路由 |
|
|
101
|
+
|
|
102
|
+
### 2.1 体积对比(决定"是否内置合成")
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
VOICEVOX 完整安装:2,348 MB
|
|
106
|
+
本插件发布包: 4.2 MB
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**结论:绝不内置 VOICEVOX**(体积 550 倍,且条款明确禁止再分发软件本身)。
|
|
110
|
+
同理不内置 Piper/Kokoro(需 Python 运行时,把纯 JS 插件变成需装环境的东西)。
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 3. 方案选项(三个,互斥)
|
|
115
|
+
|
|
116
|
+
### 方案 A:只做下载,不做合成(**推荐**)
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
用户点「下载语音包」→ 从 GitHub Release 取 zip → 解压到
|
|
120
|
+
%LOCALAPPDATA%\dsh-notify-say\voice-lines\<音色>\
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
| 维度 | 评价 |
|
|
124
|
+
|---|---|
|
|
125
|
+
| 用户成本 | 零安装,按需下载 2.8 MB/音色 |
|
|
126
|
+
| 我们成本 | 一次性打包上传(我们已有 247 个文件) |
|
|
127
|
+
| 合规 | 取决于 §1.2 审核结果;方案本身不改变合规性 |
|
|
128
|
+
| 技术难度 | 低(fetch + 解压 + 写盘) |
|
|
129
|
+
|
|
130
|
+
**这是唯一能在「合规」与「用户体验」间取平衡的方案。**
|
|
131
|
+
|
|
132
|
+
### 方案 B:用户自装 VOICEVOX,插件调用其 API 生成
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
检测 http://127.0.0.1:50021 → 有则调用合成 → 写盘
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
| 维度 | 评价 |
|
|
139
|
+
|---|---|
|
|
140
|
+
| 合规 | **零风险**(用户在自己机器上用官方软件生成) |
|
|
141
|
+
| 用户成本 | 装 2.3 GB 软件 |
|
|
142
|
+
| 技术难度 | 中(需处理 VOICEVOX 未启动、版本差异) |
|
|
143
|
+
|
|
144
|
+
**可作为 A 的补充路径**,给"愿意装软件换全音色"的用户。
|
|
145
|
+
|
|
146
|
+
### 方案 C:改用 Kokoro/Piper 等在许可上更明确的开源模型
|
|
147
|
+
|
|
148
|
+
| 维度 | 评价 |
|
|
149
|
+
|---|---|
|
|
150
|
+
| 合规 | 可能更清晰,但**需先核实模型卡是否允许分发输出** |
|
|
151
|
+
| 音色 | 不如动漫角色有个性,中文支持不如 VOICEVOX |
|
|
152
|
+
| 工作量 | 需重新生成全部素材 |
|
|
153
|
+
|
|
154
|
+
**不推荐作为第一版**,可作为长期备选。
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 4. 拟采纳的路径(A + 分阶段审核)
|
|
159
|
+
|
|
160
|
+
### 阶段 1:建立审核基础设施(不依赖任何人,可立即做)
|
|
161
|
+
|
|
162
|
+
1. **移除 `mochiko`**(唯一有明确负面证据的音色)
|
|
163
|
+
2. 生成 `AUDIO_MANIFEST.csv`:文件名、SHA-256、音色、池(done/fail/…)、体积、状态
|
|
164
|
+
- 生成文本/参数等字段**留空并标注"未记录"**(诚实优于编造)
|
|
165
|
+
3. 写 `THIRD_PARTY_AUDIO.md`(第三方音频声明,非许可证)
|
|
166
|
+
4. GUI 加「音源授权」页面,展示当前音色的署名与限制
|
|
167
|
+
5. 下载前必须弹确认(显示署名要求 + 禁止用途)
|
|
168
|
+
|
|
169
|
+
### 阶段 2:逐音色核对官方条款
|
|
170
|
+
|
|
171
|
+
对 §1.2 中 7 个 ⚠️ 音色,逐个访问其角色官方规约页,检索关键词:
|
|
172
|
+
`再配布`、`音声素材`、`商用利用`、`事前連絡`、`無償配布`
|
|
173
|
+
|
|
174
|
+
输出:**可发布 / 需移除 / 待权利人确认** 三分类。
|
|
175
|
+
|
|
176
|
+
### 阶段 3:按审核结果决定发布内容
|
|
177
|
+
|
|
178
|
+
- 若通过审核的音色 ≥ 8 个 → 发布这些,其余不在发布包内
|
|
179
|
+
- 若通过 < 5 个 → 只发通过审核的,其余通过方案 B(用户自生成)提供
|
|
180
|
+
|
|
181
|
+
**核心原则(引用外部审阅意见)**:
|
|
182
|
+
> 宁愿第一版只带通过审核的声音,也不要为了凑齐 18 个音色承担不必要的发布风险。
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## 5. 拟写的声明文件结构
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
LICENSE ← 仅代码,纯 MIT
|
|
190
|
+
THIRD-PARTY-NOTICES.md ← VOICEVOX 软件 / Mixkit 音效
|
|
191
|
+
licenses/AUDIO.md ← 每个音色的具体条款与署名
|
|
192
|
+
licenses/AUDIO_MANIFEST.csv ← 逐文件追溯表
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 关键约束(自我限定)
|
|
196
|
+
|
|
197
|
+
`licenses/AUDIO.md` 中**不得出现**以下表述:
|
|
198
|
+
|
|
199
|
+
- ❌ "本音频以 MIT 许可发布"
|
|
200
|
+
- ❌ "本音频为 CC0 / 公有领域"
|
|
201
|
+
- ❌ "已获 VOICEVOX 官方认可"
|
|
202
|
+
|
|
203
|
+
**只能**表述为:
|
|
204
|
+
|
|
205
|
+
- ✅ "本音频由 VOICEVOX 生成"
|
|
206
|
+
- ✅ "使用时须遵守 <角色> 的音源利用规约"
|
|
207
|
+
- ✅ "本插件不代表官方,也未获官方背书"
|
|
208
|
+
|
|
209
|
+
### `licenses/AUDIO.md` 草案
|
|
210
|
+
|
|
211
|
+
```markdown
|
|
212
|
+
# 第三方音频声明
|
|
213
|
+
|
|
214
|
+
本插件部分预制 WAV 音频由 VOICEVOX 合成。VOICEVOX 及其角色音源
|
|
215
|
+
不属于本插件开发者所有,代码的 MIT 许可**不适用**于这些音频。
|
|
216
|
+
|
|
217
|
+
## 音源署名
|
|
218
|
+
|
|
219
|
+
- VOICEVOX:ずんだもん
|
|
220
|
+
- VOICEVOX:四国めたん
|
|
221
|
+
- (仅列出实际包含且已审核的音色)
|
|
222
|
+
|
|
223
|
+
## 使用条件
|
|
224
|
+
|
|
225
|
+
1. 源代码许可(MIT)不自动适用于上述音频。
|
|
226
|
+
2. 使用相关音频须遵守 VOICEVOX 软件规约及对应角色的音源规约。
|
|
227
|
+
3. 再分发时须继续传递上述限制,不得附加更宽松的许可。
|
|
228
|
+
4. 各角色的署名格式、商业用途、禁止事项可能不同,以权利人官方规定为准。
|
|
229
|
+
5. 本插件不代表 VOICEVOX 官方或任何角色权利人,未获其背书。
|
|
230
|
+
|
|
231
|
+
## 官方规约
|
|
232
|
+
|
|
233
|
+
- VOICEVOX:https://voicevox.hiroshiba.jp/term/
|
|
234
|
+
- ずんだもん等:https://zunko.jp/con_ongen_kiyaku.html
|
|
235
|
+
- (其他角色逐条列出)
|
|
236
|
+
|
|
237
|
+
## 问题反馈
|
|
238
|
+
|
|
239
|
+
如发现音频许可、署名或其他权利问题,请通过仓库 Issue 联系维护者。
|
|
240
|
+
核实后将修正、替换或移除。
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## 6. 待审阅者判断的关键问题
|
|
246
|
+
|
|
247
|
+
请重点复核以下五点:
|
|
248
|
+
|
|
249
|
+
### Q1:再分发的权利基础是否成立
|
|
250
|
+
|
|
251
|
+
ずんずん条款「他者に許諾する際は…義務付けてください」——
|
|
252
|
+
这是**对再分发的规范**(故允许),还是**仅对已获授权情形的补充**(故不构成授权)?
|
|
253
|
+
|
|
254
|
+
### Q2:`mochiko` 的判断是否需要更硬的证据
|
|
255
|
+
|
|
256
|
+
我方目前仅有二手信息称其"禁止无偿分发音频素材"。
|
|
257
|
+
是否需要我们直接抓取该角色规约原文并在此文档中引用?
|
|
258
|
+
|
|
259
|
+
### Q3:`AUDIO_MANIFEST.csv` 缺生成文本/参数,是否构成实质缺陷
|
|
260
|
+
|
|
261
|
+
无法复现生成是否影响"证明该文件确由 VOICEVOX 生成"?
|
|
262
|
+
有无其他可接受的替代证据(如文件格式特征、批量生成时间戳)?
|
|
263
|
+
|
|
264
|
+
### Q4:方案 A(下载)与方案 B(用户自生成)并存是否更稳妥
|
|
265
|
+
|
|
266
|
+
即:默认只提供**已审核音色**的下载,未审核的引导用户自行生成。
|
|
267
|
+
这样即使某个音色条款有争议,责任也落在"用户自己生成"一侧。
|
|
268
|
+
|
|
269
|
+
### Q5:免费 + 非商用是否应作为抗辩理由
|
|
270
|
+
|
|
271
|
+
我方立场:项目完全免费、无广告、无赞助、无商业化计划。
|
|
272
|
+
这在评估"是否超出许可范围"时应占多大权重?
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## 7. 明确不做的事
|
|
277
|
+
|
|
278
|
+
为避免误解,列出已排除的选项:
|
|
279
|
+
|
|
280
|
+
| 不做 | 理由 |
|
|
281
|
+
|---|---|
|
|
282
|
+
| 内置 VOICEVOX 引擎 | 2.3 GB;且条款禁止再分发软件本身 |
|
|
283
|
+
| 内置 Piper/Kokoro | 需 Python 运行时;把插件变成需装环境 |
|
|
284
|
+
| 把音频标为 MIT/CC0 | 我方无权变更第三方素材的许可 |
|
|
285
|
+
| 用免责声明替代授权 | 声明不创造权利,只能履行告知义务 |
|
|
286
|
+
| 声称已获官方认可 | 事实不符 |
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## 8. 当前状态
|
|
291
|
+
|
|
292
|
+
```
|
|
293
|
+
GitHub: https://github.com/unifilitence/dsh-notify-say (v0.4.20)
|
|
294
|
+
npm: dsh-notify-say@0.4.20
|
|
295
|
+
语音包下载功能:**尚未实现**(本文档为其前置方案)
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**在审核结论出来前,不会把任何语音包上传到 Release。**
|
|
299
|
+
现有发布包只含 `zundamon-normal` 一个音色(2.8 MB),已在 README 中说明"核心包只带一个日语音色"。
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
*本文档由项目维护者编写,用于外部审阅。不构成法律意见。*
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## 附录 A:审阅者可直接核对的代码位置
|
|
308
|
+
|
|
309
|
+
以下路径均可在 GitHub 仓库中直接查看(v0.4.20):
|
|
310
|
+
|
|
311
|
+
| 内容 | 路径 |
|
|
312
|
+
|---|---|
|
|
313
|
+
| 音频选择逻辑(决定播哪个 wav) | `dsh-notify.ps1` 的 `Play-VoiceLine` 函数 |
|
|
314
|
+
| 音源抽象(tts/bundled/system/custom) | `lib/audio-source.js` |
|
|
315
|
+
| 语音包目录结构 | `sounds/voice-lines/`(根=done,`fail/` `question/` `approval/` 为子池) |
|
|
316
|
+
| 第三方声明 | `THIRD-PARTY-NOTICES.md` |
|
|
317
|
+
| 代码许可 | `LICENSE`(纯 MIT,21 行) |
|
|
318
|
+
| 发布包构建规则(哪些文件会进发布) | `tools/release-build.ps1` 的 `$includeFiles` / `$includeDirs` |
|
|
319
|
+
|
|
320
|
+
### 当前发布包实际包含的音频
|
|
321
|
+
|
|
322
|
+
```
|
|
323
|
+
sounds/voice-lines/zundamon-normal.wav 198 KB
|
|
324
|
+
sounds/voice-lines/fail/zundamon-normal~1..3.wav
|
|
325
|
+
sounds/voice-lines/question/zundamon-normal~1..4.wav
|
|
326
|
+
sounds/voice-lines/approval/zundamon-normal~1..2.wav
|
|
327
|
+
sounds/master-voice.wav 198 KB
|
|
328
|
+
sounds/*.mp3 (10 个 Mixkit 音效)
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
**只有 1 个音色**(zundamon-normal),这是 `release-build.ps1` 的 `-VoiceKey` 参数控制的。
|
|
332
|
+
其余 17 个音色**仅在本地自用版**,从未分发过。
|
|
333
|
+
|
|
334
|
+
### 这意味着
|
|
335
|
+
|
|
336
|
+
审阅者若关注"当前已公开的内容是否合规",
|
|
337
|
+
实际只有 `zundamon-normal` 一个音色需要评估——
|
|
338
|
+
它属于 SSS/ずんずんプロジェクト 的明确许可阵营。
|
|
339
|
+
|
|
340
|
+
其余 17 个是**尚未分发**的,正是本方案要决定"能不能发、发哪些"的对象。
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## 附录 B:我方对"免费"的界定
|
|
345
|
+
|
|
346
|
+
为避免歧义,明确当前与可预见的未来:
|
|
347
|
+
|
|
348
|
+
```
|
|
349
|
+
✅ 插件本身免费,无付费墙、无内购
|
|
350
|
+
✅ 无广告
|
|
351
|
+
✅ 无赞助 / 无商业合作
|
|
352
|
+
✅ 无计划推出付费版
|
|
353
|
+
✅ 源码 MIT 公开
|
|
354
|
+
❌ 不接受"付费解锁音色包"
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
如果未来情况变化(如接受赞助、公司运营),按 §4 阶段 3 的维护规则重新审核。
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## 附录 C:希望审阅者给出的输出格式
|
|
362
|
+
|
|
363
|
+
建议按此结构回复,便于我方直接执行:
|
|
364
|
+
|
|
365
|
+
```markdown
|
|
366
|
+
### 结论
|
|
367
|
+
- 方案 A 可以/不可以推进
|
|
368
|
+
- 若可以,建议首发的音色数:___ 个
|
|
369
|
+
|
|
370
|
+
### 逐音色判定
|
|
371
|
+
| 音色 | 判定 | 依据(引用条款原文) | 必要动作 |
|
|
372
|
+
|---|---|---|---|
|
|
373
|
+
| mochiko | 可发/不可发/待确认 | "..." | 移除/保留/联系权利人 |
|
|
374
|
+
|
|
375
|
+
### 对 Q1~Q5 的回答
|
|
376
|
+
|
|
377
|
+
### 我方还需补充的证据
|
|
378
|
+
```
|
package/lib/client.js
CHANGED
|
@@ -58,9 +58,32 @@ window.__ModuleLoader__.load({
|
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* 取「最近一条通知对应的会话」;消费即清,避免重复跳转。
|
|
63
|
+
*
|
|
64
|
+
* ⚠️ 返回的是**对象** `{ sessionId, at }`,不是裸字符串。
|
|
65
|
+
*
|
|
66
|
+
* 2026-10-18 外部审阅发现一个 P0 bug:这里原本 `return doc.sessionId`
|
|
67
|
+
* (字符串),但调用方写的是 `if (!doc || !doc.sessionId) return`。
|
|
68
|
+
* 字符串没有 `.sessionId` 属性 → 恒为 undefined → **直接 return**。
|
|
69
|
+
* 结果是会话跳转功能**从未生效过**,而且服务端信号已被 consume 清除,
|
|
70
|
+
* 连重试的机会都没有。
|
|
71
|
+
*
|
|
72
|
+
* 教训:这类"返回类型与调用方期望不符"的 bug,静态审阅一眼可见,
|
|
73
|
+
* 但没有任何单元测试覆盖到(因为两端各自都"看起来对")。
|
|
74
|
+
* 已加 C27 测试锁住返回形状。
|
|
75
|
+
*/
|
|
62
76
|
function consumeLastSession() {
|
|
63
|
-
|
|
77
|
+
// ⚠️ 必须是 POST + JSON:服务端把它当写操作(会清除信号),
|
|
78
|
+
// 而 http-guard 对写操作要求 JSON content-type —— 用 GET 会收到 403,
|
|
79
|
+
// 会话跳转随之失效(2026-10-18 实测回归,v0.4.25 修)。
|
|
80
|
+
return fetch(apiUrl('consume'), {
|
|
81
|
+
method: 'POST',
|
|
82
|
+
cache: 'no-store',
|
|
83
|
+
credentials: 'same-origin',
|
|
84
|
+
headers: { 'content-type': 'application/json' },
|
|
85
|
+
body: '{}',
|
|
86
|
+
})
|
|
64
87
|
.then(function (res) {
|
|
65
88
|
if (!res || !res.ok) return null
|
|
66
89
|
if (res.status === 204) return null
|
|
@@ -68,7 +91,10 @@ window.__ModuleLoader__.load({
|
|
|
68
91
|
})
|
|
69
92
|
.then(function (doc) {
|
|
70
93
|
if (!doc || typeof doc.sessionId !== 'string' || !doc.sessionId) return null
|
|
71
|
-
return
|
|
94
|
+
return {
|
|
95
|
+
sessionId: doc.sessionId,
|
|
96
|
+
at: Number(doc.at) || 0,
|
|
97
|
+
}
|
|
72
98
|
})
|
|
73
99
|
.catch(function () { return null })
|
|
74
100
|
}
|
|
@@ -270,10 +296,20 @@ window.__ModuleLoader__.load({
|
|
|
270
296
|
}
|
|
271
297
|
|
|
272
298
|
/** 音色候选(与 sounds/voice-lines 下的基础音色一致;可手输其他 key)。 */
|
|
299
|
+
// 可下载/可选的音色清单(**只列审核通过的**)。
|
|
300
|
+
//
|
|
301
|
+
// ⚠️ 2026-10-18:移除 kasukabe-tsumugi 与 mochiko ——
|
|
302
|
+
// · 春日部つむぎ:官方规约第 6 条禁止「二次配布」
|
|
303
|
+
// · もち子さん:官方规约禁止「音声素材を無償配布」
|
|
304
|
+
// 审核结论见 docs/audio-audit/README.md。
|
|
305
|
+
//
|
|
306
|
+
// 注意:这个列表只影响 GUI 下拉里的候选项。真正的分发拦截在
|
|
307
|
+
// release-build.ps1 的 $NeverShipVoicePrefixes(构建期硬阻断),
|
|
308
|
+
// 两处都要维护,但**构建期那道是安全网**。
|
|
273
309
|
var VOICE_KEYS = [
|
|
274
310
|
'zundamon-normal', 'zundamon-amama', 'ankomon', 'goki-nuigurumi',
|
|
275
|
-
'
|
|
276
|
-
'
|
|
311
|
+
'kyushu-sora', 'manbetsu-hanamaru-genki', 'meimei-meria',
|
|
312
|
+
'shikoku-metang', 'ameharu-hau', 'namiine-ritsu', 'shirakami-kotaro',
|
|
277
313
|
]
|
|
278
314
|
|
|
279
315
|
/** 事件开关定义(键 → 中文名)。 */
|
|
@@ -1409,10 +1445,16 @@ window.__ModuleLoader__.load({
|
|
|
1409
1445
|
*/
|
|
1410
1446
|
function jumpEnabled() {
|
|
1411
1447
|
return loadConfig().then(function (v) {
|
|
1412
|
-
|
|
1448
|
+
// ⚠️ 2026-10-18 外部审阅指出逻辑矛盾:loadConfig 失败返回 {},
|
|
1449
|
+
// 而 {}.jumpWhenBackground !== false 求值为 true —— 与"拿不到就不跳"正好相反。
|
|
1450
|
+
// 现在显式区分"读到了"与"没读到"。
|
|
1451
|
+
if (!v || typeof v !== "object" || Object.keys(v).length === 0) {
|
|
1452
|
+
return { jumpWhenBackground: false, jumpWhenForeground: false }
|
|
1453
|
+
}
|
|
1413
1454
|
return {
|
|
1414
|
-
|
|
1415
|
-
|
|
1455
|
+
// 只有明确读到 true 才跳;缺失或 null 都不跳
|
|
1456
|
+
jumpWhenBackground: v.jumpWhenBackground === true,
|
|
1457
|
+
jumpWhenForeground: v.jumpWhenForeground === true,
|
|
1416
1458
|
}
|
|
1417
1459
|
}).catch(function () {
|
|
1418
1460
|
return { jumpWhenBackground: false, jumpWhenForeground: false }
|