dsh-notify-say 0.4.28 → 0.4.30
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/THIRD-PARTY-NOTICES.md +8 -1
- package/dsh-notify.ps1 +58 -11
- package/lib/index.js +1852 -1822
- package/lib/voice-pack-store.js +290 -0
- package/package.json +2 -3
- package/test/docs-consistency.test.mjs +187 -0
- package/test/voice-pack-store.test.mjs +208 -0
- package/docs/audio-audit/README.md +0 -164
- package/docs/audio-audit/fetch-snapshots.ps1 +0 -76
- package/docs/audio-audit/snapshots/ameharu-hau.txt +0 -89
- package/docs/audio-audit/snapshots/goki-nuigurumi.txt +0 -73
- package/docs/audio-audit/snapshots/kasukabe-tsumugi.txt +0 -197
- package/docs/audio-audit/snapshots/manbetsu-hanamaru.txt +0 -27
- package/docs/audio-audit/snapshots/meimei-meria.txt +0 -84
- package/docs/audio-audit/snapshots/mochiko.txt +0 -27
- package/docs/audio-audit/snapshots/namiine-ritsu.txt +0 -76
- package/docs/audio-audit/snapshots/shirakami-kotaro.txt +0 -158
- package/docs/audio-audit/snapshots/sss-anonymous-common.txt +0 -142
- package/docs/audio-audit/snapshots/sss-zundamon.txt +0 -142
- package/docs/audio-audit/snapshots/voicevox-software.txt +0 -41
- package/docs/audio-audit/snapshots/voicevox-vvm-terms.txt +0 -385
- package/docs/audio-audit/snapshots/yurei-chan.txt +0 -112
- package/docs//345/276/205/345/201/232/346/270/205/345/215/225.md +0 -218
- 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 +0 -378
package/THIRD-PARTY-NOTICES.md
CHANGED
|
@@ -29,7 +29,14 @@ VOICEVOX 软件本体免费(含商用)。用它合成的音频可以自由
|
|
|
29
29
|
- 不得用于诽谤中伤、政治宣传、宗教活动等用途
|
|
30
30
|
- 各音色的具体条款以其官方发布为准
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
**官方条款原文**(用户应能自行核对,不要只信本文件的转述):
|
|
33
|
+
|
|
34
|
+
- VOICEVOX 软件利用规约:<https://voicevox.hiroshiba.jp/term/>
|
|
35
|
+
- ずんずんプロジェクト音源利用规约(ずんだもん等):
|
|
36
|
+
<https://zunko.jp/con_ongen_kiyaku.html>
|
|
37
|
+
- 完整音色列表与各自条款:<https://voicevox.hiroshiba.jp/>
|
|
38
|
+
- 官方音源总条款(含各角色摘要):
|
|
39
|
+
<https://github.com/VOICEVOX/voicevox_vvm/blob/main/TERMS.txt>
|
|
33
40
|
|
|
34
41
|
> **如果你要再分发本项目的语音文件**(例如打包自己的语音包),
|
|
35
42
|
> 请自行确认所涉音色的最新利用规约。本项目的 `LICENSE`(MIT)
|
package/dsh-notify.ps1
CHANGED
|
@@ -47,6 +47,11 @@ param(
|
|
|
47
47
|
# v0.4.4:直接播放用户指定的音频文件(绝对路径)。
|
|
48
48
|
# 有这个参数时**跳过整个选音链**——用户明确要放这个文件,不该被兜底逻辑换掉。
|
|
49
49
|
[string]$CustomFile = '',
|
|
50
|
+
# v0.4.29:语音包根目录(分号/逗号分隔,前面的优先)。
|
|
51
|
+
# 不传 = 只用插件目录(向后兼容)。Node 侧会传「用户目录;插件目录」。
|
|
52
|
+
[string]$VoiceRoot = '',
|
|
53
|
+
# 用户语音包根目录(可写),仅用于诊断日志。
|
|
54
|
+
[string]$UserVoiceRoot = '',
|
|
50
55
|
# v0.4.16:数字增益倍数(1.0 = 原样;2.0 = 放大一倍)。
|
|
51
56
|
#
|
|
52
57
|
# 为什么需要:实测本包 247 个语音包峰值中位仅 **40.4%**
|
|
@@ -68,7 +73,22 @@ $script:lastSound = ''
|
|
|
68
73
|
$script:playFile = ''
|
|
69
74
|
|
|
70
75
|
$SoundDir = Join-Path $PSScriptRoot 'sounds'
|
|
71
|
-
|
|
76
|
+
# ── 语音包根目录(v0.4.29:多候选,前面的优先)─────────────────
|
|
77
|
+
#
|
|
78
|
+
# 旧实现硬编码 <插件根>\sounds\voice-lines。但下载的音色必须放用户目录
|
|
79
|
+
# (插件目录不可写、且 npm 更新会覆盖),所以由 Node 侧算好候选路径传进来。
|
|
80
|
+
$script:voiceRoots = @()
|
|
81
|
+
if ($VoiceRoot) {
|
|
82
|
+
foreach ($p in ($VoiceRoot -split '[;,]')) {
|
|
83
|
+
$t = $p.Trim()
|
|
84
|
+
if ($t) { $script:voiceRoots += $t }
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if ($script:voiceRoots.Count -eq 0) {
|
|
88
|
+
$script:voiceRoots = @(Join-Path $SoundDir 'voice-lines')
|
|
89
|
+
}
|
|
90
|
+
# $voiceDir 保留为“主语音目录”(第一个候选),供日志与旧单目录兜底使用
|
|
91
|
+
$voiceDir = $script:voiceRoots[0]
|
|
72
92
|
|
|
73
93
|
# 数字增益工具(v0.4.16)。找不到就跳过增益,绝不影响播放。
|
|
74
94
|
$gainLib = Join-Path $PSScriptRoot 'lib\wav-gain.ps1'
|
|
@@ -114,8 +134,9 @@ if ($SystemSound) {
|
|
|
114
134
|
# kind=chime:不选语句,只走系统蜂鸣。
|
|
115
135
|
# done → voiceLines 根目录;question/approval/fail → voiceLines\<kind>\ 子池。
|
|
116
136
|
# 命名用 ~ 作变体分隔符(音色 key 允许 [\w-],用 - 会前缀碰撞,旧实测教训)。
|
|
117
|
-
|
|
118
|
-
|
|
137
|
+
# 池名(0.4.29 起跨根查找只需要池名,不拼绝对路径)
|
|
138
|
+
$voicePool = ''
|
|
139
|
+
if ($Kind -in 'question', 'approval', 'fail') { $voicePool = $Kind }
|
|
119
140
|
|
|
120
141
|
# ⚠️ fail 池为空时的语义护栏(2026-10-17):
|
|
121
142
|
# 旧逻辑的兜底链会把"池里没选到"一路回落到 $voiceDir(= done 池)甚至 master-voice.wav
|
|
@@ -130,6 +151,32 @@ function Pick-RandomWav([string]$dir, [string]$pattern) {
|
|
|
130
151
|
return ($files | Get-Random).FullName
|
|
131
152
|
}
|
|
132
153
|
|
|
154
|
+
# 在**全部候选根**的指定池里随机取一个 wav。
|
|
155
|
+
#
|
|
156
|
+
# 语义与 Pick-RandomWav 一致,只是从“单目录”变成“跨根”(前面的根优先,但都参与)。
|
|
157
|
+
# 旧函数保留:master-voice 与梗音效池仍用单目录。
|
|
158
|
+
function Pick-RandomWavFromRoots([string]$Pool, [string]$Pattern) {
|
|
159
|
+
$all = @()
|
|
160
|
+
foreach ($root in $script:voiceRoots) {
|
|
161
|
+
$dir = if ($Pool) { Join-Path $root $Pool } else { $root }
|
|
162
|
+
if (-not (Test-Path -LiteralPath $dir)) { continue }
|
|
163
|
+
$files = @(Get-ChildItem -LiteralPath $dir -File -Filter $Pattern -ErrorAction SilentlyContinue)
|
|
164
|
+
foreach ($f in $files) { $all += $f }
|
|
165
|
+
}
|
|
166
|
+
if ($all.Count -eq 0) { return '' }
|
|
167
|
+
return ($all | Get-Random).FullName
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
# 在全部候选根里找某个精确文件名(前面的根优先)。
|
|
171
|
+
function Find-InVoiceRootsExact([string]$Pool, [string]$FileName) {
|
|
172
|
+
foreach ($root in $script:voiceRoots) {
|
|
173
|
+
$dir = if ($Pool) { Join-Path $root $Pool } else { $root }
|
|
174
|
+
$p = Join-Path $dir $FileName
|
|
175
|
+
if (Test-Path -LiteralPath $p -PathType Leaf) { return $p }
|
|
176
|
+
}
|
|
177
|
+
return ''
|
|
178
|
+
}
|
|
179
|
+
|
|
133
180
|
$picked = ''
|
|
134
181
|
# 自定义音频的上限(v0.4.8)。
|
|
135
182
|
#
|
|
@@ -185,25 +232,25 @@ if ($Kind -ne 'chime' -and -not $script:sysToneName -and -not $picked) {
|
|
|
185
232
|
if ($Mode -eq 'random') { $wantVoice = '' }
|
|
186
233
|
if ($wantVoice -and $wantVoice -notmatch '^\w[\w-]*$') { $wantVoice = '' }
|
|
187
234
|
if ($wantVoice) {
|
|
188
|
-
$picked = Pick-
|
|
235
|
+
$picked = Pick-RandomWavFromRoots $voicePool ($wantVoice + '~*.wav')
|
|
189
236
|
if (-not $picked) {
|
|
190
|
-
$pf =
|
|
191
|
-
if (
|
|
237
|
+
$pf = Find-InVoiceRootsExact $voicePool ($wantVoice + '.wav')
|
|
238
|
+
if ($pf) { $picked = $pf }
|
|
192
239
|
}
|
|
193
240
|
# fail/chime 的池内兜底(2026-10-17,独立复核 I-1 提出后补):
|
|
194
241
|
# fail 池只覆盖 16 个基础音色,而 done 池有 103 个 key(含 -kansai-N / -extra-N 变体)。
|
|
195
242
|
# 用户在 tools\set-voice.ps1 里切到未覆盖的 key 时,若这里直接放弃 → 失败时整句台词消失、
|
|
196
243
|
# 只剩蜂鸣。语义上"换个音色说同样的道歉话"远好于"没有台词",故在**同一子池内**退一步随机取。
|
|
197
244
|
# 注意:这是**池内**回落,绝不越到 done 池(越池由下方 $noDoneFallback 拦截)。
|
|
198
|
-
if (-not $picked -and $noDoneFallback) { $picked = Pick-
|
|
245
|
+
if (-not $picked -and $noDoneFallback) { $picked = Pick-RandomWavFromRoots $voicePool '*.wav' }
|
|
199
246
|
# done 池根目录的 <voice>.wav 只对 done 有意义;fail 池缺该音色时不该去 done 池找
|
|
200
247
|
if (-not $picked -and -not $noDoneFallback) {
|
|
201
|
-
$pf =
|
|
202
|
-
if (
|
|
248
|
+
$pf = Find-InVoiceRootsExact '' ($wantVoice + '.wav')
|
|
249
|
+
if ($pf) { $picked = $pf }
|
|
203
250
|
}
|
|
204
251
|
} else {
|
|
205
|
-
$picked = Pick-
|
|
206
|
-
if (-not $picked -and -not $noDoneFallback) { $picked = Pick-
|
|
252
|
+
$picked = Pick-RandomWavFromRoots $voicePool '*.wav'
|
|
253
|
+
if (-not $picked -and -not $noDoneFallback) { $picked = Pick-RandomWavFromRoots '' '*.wav' }
|
|
207
254
|
}
|
|
208
255
|
# master-voice.wav 说的是"任務完了",对 fail 同样语义相反 → 跳过
|
|
209
256
|
if (-not $picked -and -not $noDoneFallback) {
|