dsh-notify-say 0.4.20 → 0.4.24
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 +6 -3
- package/THIRD-PARTY-NOTICES.md +99 -0
- package/lib/client.js +40 -7
- package/lib/config-route.js +248 -209
- package/lib/http-guard.js +212 -0
- package/lib/index.js +1822 -1768
- package/package.json +3 -2
- package/tools/notify-config.ps1 +472 -471
- package/sounds/cartoon-fart.mp3 +0 -0
- package/sounds/cartoon-toy-whistle.mp3 +0 -0
- package/sounds/casino-jackpot.mp3 +0 -0
- package/sounds/classic-winner-alarm.mp3 +0 -0
- package/sounds/crowd-laugh-applause.mp3 +0 -0
- package/sounds/funny-cartoon-melody.mp3 +0 -0
- package/sounds/funny-clown-horns.mp3 +0 -0
- package/sounds/rooster-crowing.mp3 +0 -0
- package/sounds/sad-trombone.mp3 +0 -0
- package/sounds/winning-extra-bonus.mp3 +0 -0
package/README.md
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
| 特性 | 说明 |
|
|
28
28
|
|---|---|
|
|
29
|
-
| **语音播报** | 本地 wav,不联网、不调用云端 TTS
|
|
29
|
+
| **语音播报** | 本地 wav,不联网、不调用云端 TTS。发布版附 1 个音色,其余可按需下载 |
|
|
30
30
|
| **空闲门** | 有在飞工作时不误报"完成",全部结束才播一次 |
|
|
31
31
|
| **五类事件** | 完成 / 出错 / 被拦截 / 待批准 / 要提问,各自独立开关 |
|
|
32
32
|
| **设置页 GUI** | 走官方 `Config` schema,DSH 设置页自动生成表单 |
|
|
@@ -101,7 +101,8 @@ cd <插件目录>\tools
|
|
|
101
101
|
|
|
102
102
|
### 语音包管理
|
|
103
103
|
|
|
104
|
-
|
|
104
|
+
核心包只带**一个日语音色**(ずんだもん),体积约 2.8 MB。
|
|
105
|
+
完整多音色包体积较大(十余个音色约 40 MB),故不随包发布 —— 计划通过单独下载提供(尚未实现)。
|
|
105
106
|
|
|
106
107
|
```powershell
|
|
107
108
|
.\notify-config.ps1 -ListPacks # 看已装哪些音色、各占多少
|
|
@@ -173,4 +174,6 @@ npm run test:route # 需要 --import loader 的 6 条接线测试
|
|
|
173
174
|
|
|
174
175
|
## 许可
|
|
175
176
|
|
|
176
|
-
MIT
|
|
177
|
+
代码以 MIT 发布。
|
|
178
|
+
**语音文件不适用 MIT**,由 VOICEVOX 生成,各音色有其自身使用条款,
|
|
179
|
+
详见 [`THIRD-PARTY-NOTICES.md`](THIRD-PARTY-NOTICES.md)。
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# 第三方素材与致谢
|
|
2
|
+
|
|
3
|
+
本项目**没有运行时依赖**(`package.json` 中 `dependencies` 为空,不含 `node_modules`)。
|
|
4
|
+
但随包分发的语音与音效素材来自以下项目,特此说明并致谢。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 一、语音合成 — VOICEVOX
|
|
9
|
+
|
|
10
|
+
`sounds/voice-lines/` 下的全部 WAV 语音,以及 `sounds/master-voice.wav`,
|
|
11
|
+
均由 **VOICEVOX** 在本地合成。
|
|
12
|
+
|
|
13
|
+
- 项目主页:<https://voicevox.hiroshiba.jp/>
|
|
14
|
+
- 引擎仓库:<https://github.com/VOICEVOX/voicevox_engine>
|
|
15
|
+
- 本插件**不包含** VOICEVOX 引擎本身,只包含用它输出的音频文件
|
|
16
|
+
|
|
17
|
+
### 音色署名
|
|
18
|
+
|
|
19
|
+
核心包(`sounds/voice-lines/`)附带的音色为 **ずんだもん**(Zundamon):
|
|
20
|
+
|
|
21
|
+
> VOICEVOX:ずんだもん
|
|
22
|
+
|
|
23
|
+
### 使用条款要点
|
|
24
|
+
|
|
25
|
+
VOICEVOX 软件本体免费(含商用)。用它合成的音频可以自由使用、发布、商用,
|
|
26
|
+
但**每个角色音色有各自的利用规约**,需遵守对应条款。主要包括:
|
|
27
|
+
|
|
28
|
+
- 建议标注音色来源(本项目已在 README 与本文件中标注)
|
|
29
|
+
- 不得用于诽谤中伤、政治宣传、宗教活动等用途
|
|
30
|
+
- 各音色的具体条款以其官方发布为准
|
|
31
|
+
|
|
32
|
+
完整音色列表与各自条款:<https://voicevox.hiroshiba.jp/>
|
|
33
|
+
|
|
34
|
+
> **如果你要再分发本项目的语音文件**(例如打包自己的语音包),
|
|
35
|
+
> 请自行确认所涉音色的最新利用规约。本项目的 `LICENSE`(MIT)
|
|
36
|
+
> **不覆盖**这些音频素材。
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 二、音效素材 — 已全部移除(原 Mixkit)
|
|
41
|
+
|
|
42
|
+
**2026-10-18:移除了此前随包分发的 10 个 Mixkit mp3 音效。**
|
|
43
|
+
|
|
44
|
+
### 移除原因
|
|
45
|
+
|
|
46
|
+
[Mixkit Sound Effects Free License](https://mixkit.co/license/modal/sfxFree/) 明确禁止:
|
|
47
|
+
|
|
48
|
+
> You can't **redistribute the Item on its own, as stock, in a tool or
|
|
49
|
+
> template, or with source files**.
|
|
50
|
+
|
|
51
|
+
本插件通过 npm / GitHub 公开分发包含这些 mp3 的安装包,属于该条款禁止的
|
|
52
|
+
「再分发素材本身 / 随源文件分发」情形。
|
|
53
|
+
|
|
54
|
+
### 影响
|
|
55
|
+
|
|
56
|
+
这些文件是**兜底池**成员:正常流程走「语音包 → master-voice.wav → mp3 池」,
|
|
57
|
+
前两者都存在,所以移除**对实际体验没有影响**。
|
|
58
|
+
|
|
59
|
+
### 如果你想要音效
|
|
60
|
+
|
|
61
|
+
`sounds/` 目录支持直接放入 `.mp3` / `.wav`,插件会自动作为兜底音效使用。
|
|
62
|
+
请自行确保所用素材的许可允许你的使用方式。
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 二之二、未随包分发的音色(合规说明)
|
|
67
|
+
|
|
68
|
+
以下音色的 WAV 由开发者本地生成,但**不进入发布包**:
|
|
69
|
+
|
|
70
|
+
| 音色 | 原因 |
|
|
71
|
+
|---|---|
|
|
72
|
+
| **もち子さん**(mochiko) | [官方利用规约](https://vtubermochio.wixsite.com/mochizora/)明确禁止
|
|
73
|
+
「無償配布、有償販売」利用其输出合成音频制作的音声素材。本插件免费分发,正落在该禁令内。 |
|
|
74
|
+
| 个人声音样本 | 作者本人的声音,仅本地使用,不对外分发。 |
|
|
75
|
+
|
|
76
|
+
其余音色的发布状态见仓库 `docs/语音包分发方案-待审阅.md`。
|
|
77
|
+
|
|
78
|
+
## 三、代码参考
|
|
79
|
+
|
|
80
|
+
本项目的热重载机制(`lib/dev-reload.js`)参考了本机另一插件的实现思路。
|
|
81
|
+
那是作者本人的代码,不属于第三方;相关差异与取舍已在模块头注释中说明。
|
|
82
|
+
|
|
83
|
+
其余代码为原创。
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 四、运行环境
|
|
88
|
+
|
|
89
|
+
本项目运行在 **DeepSeek Harness (DSH) Desktop** 之上,依赖其插件 API。
|
|
90
|
+
DSH 本身的许可与本项目无关,请参见其官方发布。
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 致谢
|
|
95
|
+
|
|
96
|
+
感谢 **VOICEVOX** 项目与各音色作者,让本地、免费、离线的人声合成成为可能;
|
|
97
|
+
感谢 **Mixkit** 提供可自由使用的音效素材。
|
|
98
|
+
|
|
99
|
+
没有这些开源与免费资源,这个插件只能发出单调的系统提示音。
|
package/lib/client.js
CHANGED
|
@@ -58,7 +58,21 @@ 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
|
return fetch(apiUrl('consume'), { cache: 'no-store', credentials: 'same-origin' })
|
|
64
78
|
.then(function (res) {
|
|
@@ -68,7 +82,10 @@ window.__ModuleLoader__.load({
|
|
|
68
82
|
})
|
|
69
83
|
.then(function (doc) {
|
|
70
84
|
if (!doc || typeof doc.sessionId !== 'string' || !doc.sessionId) return null
|
|
71
|
-
return
|
|
85
|
+
return {
|
|
86
|
+
sessionId: doc.sessionId,
|
|
87
|
+
at: Number(doc.at) || 0,
|
|
88
|
+
}
|
|
72
89
|
})
|
|
73
90
|
.catch(function () { return null })
|
|
74
91
|
}
|
|
@@ -270,10 +287,20 @@ window.__ModuleLoader__.load({
|
|
|
270
287
|
}
|
|
271
288
|
|
|
272
289
|
/** 音色候选(与 sounds/voice-lines 下的基础音色一致;可手输其他 key)。 */
|
|
290
|
+
// 可下载/可选的音色清单(**只列审核通过的**)。
|
|
291
|
+
//
|
|
292
|
+
// ⚠️ 2026-10-18:移除 kasukabe-tsumugi 与 mochiko ——
|
|
293
|
+
// · 春日部つむぎ:官方规约第 6 条禁止「二次配布」
|
|
294
|
+
// · もち子さん:官方规约禁止「音声素材を無償配布」
|
|
295
|
+
// 审核结论见 docs/audio-audit/README.md。
|
|
296
|
+
//
|
|
297
|
+
// 注意:这个列表只影响 GUI 下拉里的候选项。真正的分发拦截在
|
|
298
|
+
// release-build.ps1 的 $NeverShipVoicePrefixes(构建期硬阻断),
|
|
299
|
+
// 两处都要维护,但**构建期那道是安全网**。
|
|
273
300
|
var VOICE_KEYS = [
|
|
274
301
|
'zundamon-normal', 'zundamon-amama', 'ankomon', 'goki-nuigurumi',
|
|
275
|
-
'
|
|
276
|
-
'
|
|
302
|
+
'kyushu-sora', 'manbetsu-hanamaru-genki', 'meimei-meria',
|
|
303
|
+
'shikoku-metang', 'ameharu-hau', 'namiine-ritsu', 'shirakami-kotaro',
|
|
277
304
|
]
|
|
278
305
|
|
|
279
306
|
/** 事件开关定义(键 → 中文名)。 */
|
|
@@ -1409,10 +1436,16 @@ window.__ModuleLoader__.load({
|
|
|
1409
1436
|
*/
|
|
1410
1437
|
function jumpEnabled() {
|
|
1411
1438
|
return loadConfig().then(function (v) {
|
|
1412
|
-
|
|
1439
|
+
// ⚠️ 2026-10-18 外部审阅指出逻辑矛盾:loadConfig 失败返回 {},
|
|
1440
|
+
// 而 {}.jumpWhenBackground !== false 求值为 true —— 与"拿不到就不跳"正好相反。
|
|
1441
|
+
// 现在显式区分"读到了"与"没读到"。
|
|
1442
|
+
if (!v || typeof v !== "object" || Object.keys(v).length === 0) {
|
|
1443
|
+
return { jumpWhenBackground: false, jumpWhenForeground: false }
|
|
1444
|
+
}
|
|
1413
1445
|
return {
|
|
1414
|
-
|
|
1415
|
-
|
|
1446
|
+
// 只有明确读到 true 才跳;缺失或 null 都不跳
|
|
1447
|
+
jumpWhenBackground: v.jumpWhenBackground === true,
|
|
1448
|
+
jumpWhenForeground: v.jumpWhenForeground === true,
|
|
1416
1449
|
}
|
|
1417
1450
|
}).catch(function () {
|
|
1418
1451
|
return { jumpWhenBackground: false, jumpWhenForeground: false }
|