@dsh-gis/dsh-video-studio-skill 0.4.0 → 0.7.2
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 +93 -18
- package/docs/styles/demo-results.json +76 -0
- package/docs/styles/sheet-8-styles.png +0 -0
- package/docs/styles/sheet-ai.png +0 -0
- package/docs/styles/sheet-craft.png +0 -0
- package/docs/styles/sheet-night.png +0 -0
- package/index.js +20 -7
- package/package.json +13 -3
- package/schemas/film.schema.json +599 -0
- package/skills/video-studio/SKILL.md +252 -28
- package/skills/video-studio/assets/film.json +78 -24
- package/skills/video-studio/assets/scenes.py +1005 -42
- package/skills/video-studio/assets/web/engine.js +18 -1
- package/skills/video-studio/assets/web/film.js +29 -4
- package/skills/video-studio/assets/web/index.html +5 -0
- package/skills/video-studio/references/audio-variation.md +158 -0
- package/skills/video-studio/references/audio.md +96 -6
- package/skills/video-studio/references/change-impact.md +54 -0
- package/skills/video-studio/references/quality-gates.md +1 -1
- package/skills/video-studio/references/style-packs.md +178 -0
- package/skills/video-studio/references/web-engine.md +1 -1
- package/skills/video-studio/requirements.txt +13 -1
- package/skills/video-studio/scripts/filmcheck.py +725 -0
- package/skills/video-studio/scripts/filmkit.py +953 -76
- package/skills/video-studio/scripts/gates.py +509 -0
- package/skills/video-studio/scripts/qa_frames.py +109 -19
- package/skills/video-studio/scripts/render.py +942 -45
- package/skills/video-studio/scripts/scorekit.py +1887 -27
- package/skills/video-studio/scripts/selfcheck.py +648 -2
- package/skills/video-studio/scripts/sfxkit.py +132 -30
- package/skills/video-studio/scripts/stagewatch.py +405 -0
- package/skills/video-studio/scripts/stylekit.py +1012 -0
- package/skills/video-studio/scripts/voicekit.py +880 -0
- package/skills/video-studio/scripts/webengine.py +68 -14
- package/tools/audio_similarity.py +279 -0
- package/tools/ci_check.py +450 -0
- package/tools/estimate.py +657 -0
- package/tools/selftest_noscipy.py +70 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @dsh-gis/dsh-video-studio-skill
|
|
2
2
|
|
|
3
|
-
 
|
|
4
4
|
|
|
5
5
|
**DeepSeek Harness 技能插件:用代码从零生成中文视频。**
|
|
6
6
|
|
|
@@ -16,7 +16,26 @@ ffmpeg 编码 → 采样级混音 → **四层质检**(容器 / 信号 / 时
|
|
|
16
16
|
> **v0.4.0**:修掉 4 处"门禁看着干净、其实没在查"的静默问题(`--resume` 复用旧分块、
|
|
17
17
|
> `music.mode=off` 仍混入旧配乐、PIL 路线音画同步恒空、亮度静止判据误报 4 段),
|
|
18
18
|
> 补上仓库级体检(`tools/ci_check.py`)、CI、`requirements.txt`,并修掉管道中文乱码。
|
|
19
|
-
>
|
|
19
|
+
> **v0.5.0(风格包)**:解决"每部片都长一个样"。一个 `style` id 同时决定画风(8 套主题 ×
|
|
20
|
+
> 3 种版式)、配乐(8 套风格:调池/BPM 梯度/进行/动机/配器/鼓型)、旁白(9 个声线 × 6 档语气)
|
|
21
|
+
> 与节奏;`"style": "auto"` 按内容自动选,三级内容指纹保证"改错别字不换整首曲子"。
|
|
22
|
+
> 不写 `style` 字段 = v0.4 行为(配乐 PCM 逐样本一致,selfcheck 有断言)。
|
|
23
|
+
> **v0.6.0(交付可信化)**:解决"**质检结论只活在控制台里**"。新增门禁账本与机读交付报告
|
|
24
|
+
> `out/QC-REPORT.md`(gate matrix 分 **pass / fail / skipped 三档**——"没执行"不再冒充"通过")、
|
|
25
|
+
> 人工签核 `--stage accept`(绑内容指纹,改了剧本旧签核自动失效)、阶段新鲜度 `--stage explain`
|
|
26
|
+
> (改上游后哪些产物还是旧的、最小重跑什么)、开渲前成本预演 `tools/estimate.py`、
|
|
27
|
+
> `film.json` 契约校验 `filmcheck.py`(改成 `holds` 这种拼写错误不再静默失效)。
|
|
28
|
+
> 顺手修掉一个**已发布版本里的真 bug**:`--jobs >1` 并行渲染因主题色元组被 JSON 变成 list 而直接崩溃
|
|
29
|
+
> ——也就是 README 下面教的"长片分块并行"此前根本跑不通。
|
|
30
|
+
> 详见 [CHANGELOG.md](CHANGELOG.md)、SKILL.md §7.0 与 references/change-impact.md。
|
|
31
|
+
> **v0.7.0(声音也不再一片一样)**:内容指纹从 seed 推进到**结构层**——和弦替换、进行档位、动机偏移、
|
|
32
|
+
> 鼓型 ghost 都随内容变化;音效 seed 改内容派生并跟随配乐调性(`in_key`);段落边界前 2.2 s 的
|
|
33
|
+
> whoosh/riser 自动 -3 dB,避免与配乐过门撞车;duck 按风格加深到 3.0–5.5 dB。legacy 路径逐样本不变。
|
|
34
|
+
> **v0.7.1(旁白优先)**:配乐基线从 -1.5 降到 **-12 dB**,有人声处再按包络压配乐 6 dB / 音效 3 dB,
|
|
35
|
+
> 混音后按台词活跃区实测旁白/背景差,**不足 12 dB 自动补压背景**(`guard_snr_db`,最多 30 dB)。
|
|
36
|
+
> 实测(真实素材):旧混音 -4.2 dB → 新混音 12.0 dB,`audio_similarity --strict` D 组 12.9 dB;
|
|
37
|
+
> selfcheck 34 → 38 条,其中第 35–38 条专盯这条链路。
|
|
38
|
+
> 详见 [CHANGELOG.md](CHANGELOG.md) 与 SKILL.md §5.6 / §5.7、references/audio-variation.md。
|
|
20
39
|
|
|
21
40
|
## 安装
|
|
22
41
|
|
|
@@ -49,10 +68,38 @@ mv ~/.dsh/skills/video-studio ~/.dsh/backup/video-studio.bak-$(date +%Y%m%d)
|
|
|
49
68
|
<p align="center"><img src="docs/demo-pil-sheet.png" width="100%" alt="默认模板片联系表:开场 / 正文卡片 / 正文卡片 / 收尾"></p>
|
|
50
69
|
|
|
51
70
|
上面四帧是用仓库自带的 `assets/film.json` + `assets/scenes.py` 从零跑一遍 `python render.py` 的
|
|
52
|
-
`work/qa/sheet.png
|
|
71
|
+
`work/qa/sheet.png`,未经任何修图。配套实测(**作者机器** Windows 11 / OSGeo4W Python 3.12,
|
|
72
|
+
v0.6 时期口径;TTS 实测时长与 AAC 编码会让这些数字在小范围内浮动,换机请按 SKILL.md §14 重测):
|
|
53
73
|
**时长 30.10 s / 1920×1080 / 30 fps / h264+aac 48 kHz / -16.0 LUFS / 真峰 -1.2 dBTP / 黑帧 0 /
|
|
54
74
|
帧级深检:闪烁 0、空窗 0、画面静止 0**(音画同步在 PIL 路线上需要写 `visual_at` 才会真的查,见 SKILL.md §7)。
|
|
55
75
|
|
|
76
|
+
怎么复现:按 [SKILL.md §1](skills/video-studio/SKILL.md) 的五步上手,把自带模板拷到**空目录**里跑一遍即可
|
|
77
|
+
(`cp assets/film.json assets/scenes.py` + 拷 `scripts/*.py` → `python render.py`)。数字每次都会差一点:
|
|
78
|
+
TTS 实测时长、AAC 编码都会让真峰/响度/锐度浮动,**别 chasing 小数点**。本机(另一台)复测同模板得到的是
|
|
79
|
+
29.00 s / -16.5 LUFS / -1.4 dBTP / 锐度比 1.01(2026-11-10 另一台 Windows 机器复测)——
|
|
80
|
+
**不同机器、不同 TTS 结果,两组都对,别混着引用**。
|
|
81
|
+
|
|
82
|
+
## 效果:同一个模板,八种气质(v0.5)
|
|
83
|
+
|
|
84
|
+
同一份文字,只改 `"style"`(画风 / 配乐 / 旁白 / 节奏一起变):
|
|
85
|
+
|
|
86
|
+
<p align="center"><img src="docs/styles/sheet-8-styles.png" width="100%" alt="8 套风格对比:科技深蓝 / 杂志暖白 / 手绘纸感 / 活力撞色 / 极简黑白 / 电影青橙 / 暖灰薄荷 / 深黑鎏金"></p>
|
|
87
|
+
|
|
88
|
+
三份**不同题材**的短片(全流程真跑:TTS → 排轴 → 配乐 → 音效 → 混音 → 逐帧 → 编码 → 质检;数据见
|
|
89
|
+
`docs/styles/demo-results.json`,是 v0.5 时期的实测快照,片源脚本未随仓库分发,**不可直接复现**;
|
|
90
|
+
**别把这张表当成"现在跑出来就是这样"**——BPM/调性由内容指纹从风格梯度里选(v0.7 起指纹还参与配乐结构),
|
|
91
|
+
同一题材换一版正文就可能落到别的 BPM/调性,当前风格解析结果请以 `--stage style` 的打印为准):
|
|
92
|
+
|
|
93
|
+
| 题材 | 自动选中的风格 | 配乐 | 旁白声线 | 质检 |
|
|
94
|
+
|---|---|---|---|---|
|
|
95
|
+
| AI 大模型的三年 | tech-deep 科技深蓝 | 小调 116BPM / Em | 青年开场 → 男声正文 → 女声引用 | PASS(17.3s,-16.0 LUFS) |
|
|
96
|
+
| 手工木作的一天 | paper 手绘纸感 | 大调 88BPM / G | 女声 + 软糯女声正文 | PASS(19.9s) |
|
|
97
|
+
| 深夜学习指南 | lo-fi 暖灰薄荷 | 大调 84BPM / F | 温柔女声 + 女声开场 | PASS(20.1s) |
|
|
98
|
+
|
|
99
|
+
<p align="center"><img src="docs/styles/sheet-ai.png" width="32%" alt="AI 题材"><img src="docs/styles/sheet-craft.png" width="32%" alt="手作题材"><img src="docs/styles/sheet-night.png" width="32%" alt="深夜题材"></p>
|
|
100
|
+
|
|
101
|
+
三片的联系表(左→右为时间顺序)肉眼可见不是同一套风格:深蓝科技 / 牛皮纸手作 / 冷灰薄荷深夜。
|
|
102
|
+
|
|
56
103
|
## 用法
|
|
57
104
|
|
|
58
105
|
触发词:做一个视频 / 生成宣传片 / 把报告变成视频 / 做动画 / 配音配字幕 / 出成片 /
|
|
@@ -62,14 +109,18 @@ mv ~/.dsh/skills/video-studio ~/.dsh/backup/video-studio.bak-$(date +%Y%m%d)
|
|
|
62
109
|
|
|
63
110
|
```bash
|
|
64
111
|
mkdir -p myfilm && cd myfilm
|
|
65
|
-
cp <SKILL_DIR>/assets/film.json . #
|
|
112
|
+
cp <SKILL_DIR>/assets/film.json . # 剧本模板("style": "auto")
|
|
66
113
|
cp <SKILL_DIR>/assets/scenes.py . # 场景模板
|
|
67
|
-
cp <SKILL_DIR>/scripts/*.py . # filmkit/render/selfcheck + sfxkit/scorekit/qa_frames/webengine
|
|
114
|
+
cp <SKILL_DIR>/scripts/*.py . # filmkit/stylekit/voicekit/render/selfcheck + sfxkit/scorekit/qa_frames/webengine
|
|
68
115
|
cp -r <SKILL_DIR>/assets/web ./web # 只在走浏览器引擎时需要
|
|
69
116
|
|
|
70
|
-
python selfcheck.py #
|
|
117
|
+
python selfcheck.py # 43 条环境/回归断言(20 秒内,不联网)
|
|
118
|
+
python <REPO>/tools/estimate.py --script film.json # v0.6:开渲前先算耗时/磁盘/分块(仓库/包里的工具,
|
|
119
|
+
# 不在 skills/video-studio/ 内,quickstart 拷出来的目录没有它)
|
|
71
120
|
python render.py --stage stills --stills "l01:3,l02:5" # 母版预览(缺 tts/layout 会自动补跑)
|
|
72
121
|
python render.py --script film.json --scenes scenes.py --out out/film.mp4 --work work
|
|
122
|
+
cat out/QC-REPORT.md # v0.6:机器可读交付结论(pass/fail/skipped)
|
|
123
|
+
python render.py --stage accept --gate release # v0.6:人工签核(绑内容指纹)
|
|
73
124
|
```
|
|
74
125
|
|
|
75
126
|
分阶段(每步落盘、可单独重跑):
|
|
@@ -90,12 +141,21 @@ tts → layout → cues → score → sfx → audio → frames → mux → qa
|
|
|
90
141
|
|
|
91
142
|
| 想要 | 怎么做 |
|
|
92
143
|
|---|---|
|
|
93
|
-
| 让 PIL 路线的音画同步门禁真的生效 | cue 加 `"visual_at":
|
|
144
|
+
| 让 PIL 路线的音画同步门禁真的生效 | cue 加 `"visual_at": 绝对秒`;再把 `QA_REQUIRE_SYNC=1` 加进你自己的交付流水线(本仓库的 workflow 没设它) |
|
|
94
145
|
| 浏览器渲染要跨会话字节级可复现 | `--deterministic`(或 `WEBENGINE_DETERMINISTIC=1`),代价约 +22%/帧 |
|
|
95
146
|
|
|
96
|
-
`<SKILL_DIR>` 是 `skill` 工具加载时回报的 resourceBase 目录(`.../skills/video-studio
|
|
147
|
+
`<SKILL_DIR>` 是 `skill` 工具加载时回报的 resourceBase 目录(`.../skills/video-studio/`);
|
|
148
|
+
`<REPO>` 是包根(仓库根,或装好后 profile 里的 `node_modules/@dsh-gis/dsh-video-studio-skill/`),即 `<SKILL_DIR>` 往上两级——`tools/`、`schemas/` 都在 `<REPO>` 下,`cp` 到 `myfilm/` 后那里**没有** `tools/`。
|
|
149
|
+
|
|
150
|
+
分阶段(v0.2 起**每个 stage 只做自己的事**):`--stage style | tts | layout | cues | score | sfx | audio | frames | mux | qa | stills | accept | explain`。
|
|
97
151
|
|
|
98
|
-
|
|
152
|
+
**v0.6 的三个新开关**(都是"让结论可追责",不是新玩具):
|
|
153
|
+
|
|
154
|
+
| 想要 | 怎么做 |
|
|
155
|
+
|---|---|
|
|
156
|
+
| 交付前把"没执行"也算失败 | `--stage qa --strict-gates`(对齐 `QA_REQUIRE_SYNC` 语义) |
|
|
157
|
+
| 改完东西不知道要重跑什么 | `--stage explain`(机器判断过时阶段 + 给最小重跑命令),表见 [references/change-impact.md](skills/video-studio/references/change-impact.md) |
|
|
158
|
+
| 规整 `film.json` 避免静默失效 | `python skills/video-studio/scripts/filmcheck.py film.json`(`holds`→提示写成 `hold`) |
|
|
99
159
|
|
|
100
160
|
长片:`--stage frames --jobs 4`(按绝对帧号分块并行)+ `--resume`(中断只补缺块)。
|
|
101
161
|
|
|
@@ -111,6 +171,10 @@ tts → layout → cues → score → sfx → audio → frames → mux → qa
|
|
|
111
171
|
| **声音和画面对不上(v0.3)** | **提示点系统**:画面登记 cue → 音效按 cue 合成,改节奏不用重新对时间 |
|
|
112
172
|
| **声音单薄、只有"叮叮咚咚"(v0.3)** | `sfxkit` 物理建模音效 + `scorekit` 一张和弦表贯穿全片 |
|
|
113
173
|
| **一帧白闪/两秒空窗没人发现(v0.3)** | `qa_frames` 帧级深检:单帧闪烁、画面空窗、音画同步 |
|
|
174
|
+
| **"我查过了"无法复现(v0.6)** | `out/QC-REPORT.md` + `work/gates.json`:三档 gate matrix,"没执行"独立成 `skipped` |
|
|
175
|
+
| **"我签过了"变成空头支票(v0.6)** | 签核绑内容指纹:改剧本 / `scenes.py` / 引擎,旧签核自动失效 |
|
|
176
|
+
| **改一句台词不知道要重跑什么(v0.6)** | `work/manifest.json` 记每阶段输入/输出指纹,`--stage explain` 直接给最小重跑命令 |
|
|
177
|
+
| **`holds` 写成拼写错误却静默失效(v0.6)** | `schemas/film.schema.json` + `filmcheck.py`,并接进 `ci_check` 第 12 项 |
|
|
114
178
|
|
|
115
179
|
## 文件结构
|
|
116
180
|
|
|
@@ -120,25 +184,33 @@ cordis.patch.yml 组合包 patch(insert: video-studio)
|
|
|
120
184
|
icon.svg / locale/*.json 插件页展示元数据
|
|
121
185
|
skills/video-studio/
|
|
122
186
|
SKILL.md 主线:上手 / 八阶段 / 引擎选型 / 画质 / 声音 / 提示点 / 停留窗口 / 质检 / 故障速查
|
|
123
|
-
references/ pipeline · scene-authoring · audio · sfx-design · web-engine
|
|
124
|
-
quality-gates · pitfalls
|
|
187
|
+
references/ pipeline · scene-authoring · audio · audio-variation · sfx-design · web-engine
|
|
188
|
+
frame-qa · quality-gates · change-impact · style-packs · pitfalls
|
|
125
189
|
scripts/filmkit.py 生产内核(字体/排版/字幕/音频总线/CueBus/TTS/时间轴/编码/质检)
|
|
126
|
-
scripts/
|
|
127
|
-
scripts/
|
|
190
|
+
scripts/gates.py v0.6 门禁账本 / QC 报告渲染 / 人工签核(绑内容指纹)
|
|
191
|
+
scripts/stagewatch.py v0.6 阶段新鲜度(work/manifest.json + --stage explain)
|
|
192
|
+
scripts/filmcheck.py v0.6 film.json 契约校验(未知键/枚举/跨字段)
|
|
193
|
+
scripts/render.py 编排器(13 个 stage、pil|web 双引擎、分块并行、断点续跑、母版预览、门禁账本)
|
|
194
|
+
scripts/selfcheck.py 回归自检(43 条"曾真的坏过"的断言)
|
|
128
195
|
scripts/sfxkit.py 物理建模音效库(24 配方,scipy 可选)
|
|
129
196
|
scripts/scorekit.py 程序化配乐(和弦表 / 分段能量 / 吸气)
|
|
130
197
|
scripts/webengine.py 浏览器逐帧渲染(CDP 截图、分块并行、崩溃重开、cue 导出、文字质检)
|
|
131
198
|
scripts/qa_frames.py 帧级深检(单帧闪烁 / 画面空窗 / 画面静止 / 音画同步 / 亮度响度曲线)
|
|
132
199
|
requirements.txt Python 依赖(必需 / 强烈建议 / 可选三档,带注释)
|
|
133
|
-
assets/film.json 剧本模板(含
|
|
200
|
+
assets/film.json 剧本模板(含 bpm / music / sfx.cues / 逐句 hold;顶层 hold 可选,缺省用风格 pacing)
|
|
134
201
|
assets/scenes.py 场景模板(开场 / 正文卡片 / 收尾 + cues() 钩子)
|
|
135
202
|
assets/web/ 浏览器页面模板(原生 Canvas2D 确定性时间轴)
|
|
136
|
-
tools/ci_check.py
|
|
203
|
+
tools/ci_check.py 仓库级体检(12 项;语法/JSON/依赖白名单/打包卫生/文档引用/film 契约,不需 ffmpeg)
|
|
204
|
+
tools/estimate.py 开渲前成本预演(帧数/耗时/磁盘/分块建议,--json 可机读)
|
|
205
|
+
tools/audio_similarity.py 音频差异/相似度验收(--strict 阈值判定,改音频代码后必跑)
|
|
206
|
+
tools/selftest_noscipy.py 无 scipy 兜底路径自检(CI 用;屏蔽 scipy 后跑 sfxkit/scorekit 自检)
|
|
207
|
+
schemas/film.schema.json film.json 的契约(draft-07 子集)
|
|
137
208
|
.github/workflows/ci.yml CI:repo 体检(ubuntu+windows)+ 技能自检(ubuntu)
|
|
138
209
|
```
|
|
139
210
|
|
|
140
211
|
## 环境前提
|
|
141
212
|
|
|
213
|
+
**插件运行**:Node.js ≥ 20(`package.json` 的 `engines`;这是 DSH 加载插件用的运行时,不必另装)。
|
|
142
214
|
**必需**:ffmpeg + Python 的 numpy / Pillow / edge-tts。
|
|
143
215
|
**可选**:cv2(编码锐度比)、scipy(音效滤波加速,缺了走 FFT 卷积)、
|
|
144
216
|
playwright + Chromium/Edge(只在 `--engine web` 时需要)。
|
|
@@ -170,9 +242,12 @@ peer 范围 `@deepseek-ai/dsh-skill-filesystem >=0.1.0-rc.6 <0.3.0-0`,覆盖 D
|
|
|
170
242
|
## 仓库自检(给贡献者与 CI 用,不是给用户用的)
|
|
171
243
|
|
|
172
244
|
```bash
|
|
173
|
-
python tools/ci_check.py -v #
|
|
174
|
-
#
|
|
175
|
-
#
|
|
245
|
+
python tools/ci_check.py -v # 12 项:py 语法(含 tools/,SyntaxWarning 记失败)/ node --check /
|
|
246
|
+
# JSON + 版本号一致性(package.json vs README 徽章)/ 技能清单 /
|
|
247
|
+
# 依赖白名单 / npm pack 打包卫生 / 文档路径 + 正文相对链接 /
|
|
248
|
+
# Python 3.9 语法 / Markdown 围栏(状态机)/ CI workflow
|
|
249
|
+
# (裸冒号 + run 里的 python 脚本是否存在)/ 单文件体积 /
|
|
250
|
+
# film.json 契约(调 filmcheck.py,规则只留一份)
|
|
176
251
|
```
|
|
177
252
|
|
|
178
253
|
它**不需要 ffmpeg、字体或网络**,任何机器都能跑;它检查的是"这个仓库作为可分发包是否完整"。
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"generated": "2026-11-09",
|
|
3
|
+
"demos": [
|
|
4
|
+
{
|
|
5
|
+
"demo": "ai",
|
|
6
|
+
"title": "科技深蓝",
|
|
7
|
+
"style": "tech-deep",
|
|
8
|
+
"bpm": 116,
|
|
9
|
+
"key": "Em",
|
|
10
|
+
"mood": "steady",
|
|
11
|
+
"duration": 17.26,
|
|
12
|
+
"personas": [
|
|
13
|
+
"young_male",
|
|
14
|
+
"narrator_male",
|
|
15
|
+
"narrator_female"
|
|
16
|
+
],
|
|
17
|
+
"tones": [
|
|
18
|
+
"emphasis",
|
|
19
|
+
"body",
|
|
20
|
+
"quote",
|
|
21
|
+
"outro"
|
|
22
|
+
],
|
|
23
|
+
"layouts": [
|
|
24
|
+
"left-stack",
|
|
25
|
+
"split-right"
|
|
26
|
+
],
|
|
27
|
+
"spectral_centroid_hz": 5784
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"demo": "craft",
|
|
31
|
+
"title": "手绘纸感",
|
|
32
|
+
"style": "paper",
|
|
33
|
+
"bpm": 88,
|
|
34
|
+
"key": "G",
|
|
35
|
+
"mood": "hopeful",
|
|
36
|
+
"duration": 19.855,
|
|
37
|
+
"personas": [
|
|
38
|
+
"narrator_female",
|
|
39
|
+
"warm_female"
|
|
40
|
+
],
|
|
41
|
+
"tones": [
|
|
42
|
+
"hook",
|
|
43
|
+
"body",
|
|
44
|
+
"outro"
|
|
45
|
+
],
|
|
46
|
+
"layouts": [
|
|
47
|
+
"left-stack",
|
|
48
|
+
"center-stack"
|
|
49
|
+
],
|
|
50
|
+
"spectral_centroid_hz": 4899.4
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"demo": "night",
|
|
54
|
+
"title": "暖灰薄荷",
|
|
55
|
+
"style": "lo-fi",
|
|
56
|
+
"bpm": 84,
|
|
57
|
+
"key": "F",
|
|
58
|
+
"mood": "calm",
|
|
59
|
+
"duration": 20.108,
|
|
60
|
+
"personas": [
|
|
61
|
+
"warm_female",
|
|
62
|
+
"narrator_female"
|
|
63
|
+
],
|
|
64
|
+
"tones": [
|
|
65
|
+
"hook",
|
|
66
|
+
"body",
|
|
67
|
+
"outro"
|
|
68
|
+
],
|
|
69
|
+
"layouts": [
|
|
70
|
+
"left-stack",
|
|
71
|
+
"split-right"
|
|
72
|
+
],
|
|
73
|
+
"spectral_centroid_hz": 5573.8
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/index.js
CHANGED
|
@@ -31,11 +31,12 @@ export const inject = ["skills"];
|
|
|
31
31
|
/**
|
|
32
32
|
* 注册 bundled 技能根。
|
|
33
33
|
*
|
|
34
|
-
*
|
|
34
|
+
* 四件事任何一件不成立都只打日志、不抛错——插件本身没有"必须成功"的业务,
|
|
35
35
|
* 挂不上技能是降级,不是崩溃:
|
|
36
36
|
* 1. 找不到包内 SKILL.md(打包漏了文件 / 被裁剪)
|
|
37
37
|
* 2. 运行时没有 ctx.skills(profile 没装技能注册表)
|
|
38
38
|
* 3. 可选 peer 没装(只装了本插件)
|
|
39
|
+
* 4. provider 自己抛错(版本不匹配 / 目录无权限 / 注册表已占用)
|
|
39
40
|
*
|
|
40
41
|
* @param ctx - 携带 skills 服务的 Cordis 上下文。
|
|
41
42
|
*/
|
|
@@ -63,12 +64,24 @@ export async function apply(ctx) {
|
|
|
63
64
|
return;
|
|
64
65
|
}
|
|
65
66
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
// 第 4 件可能失败的事:provider 自己抛错(版本不匹配、目录无权限、注册表已占用……)。
|
|
68
|
+
// 这里必须兜住:插件行的加载失败会让整行从 profile 里消失,而"挂不上技能"本来只是个降级。
|
|
69
|
+
// (v0.7.1 之前没兜:provider 一抛错 apply 就 reject,而且一行日志都没有——stub 实测复现过。)
|
|
70
|
+
try {
|
|
71
|
+
applyFilesystemProvider(ctx, {
|
|
72
|
+
providerName: "video-studio",
|
|
73
|
+
includeDefaultRoots: false,
|
|
74
|
+
bundledSkillDir,
|
|
75
|
+
watch: false,
|
|
76
|
+
});
|
|
77
|
+
} catch (error) {
|
|
78
|
+
warn(
|
|
79
|
+
ctx,
|
|
80
|
+
`挂载 bundled 技能根失败(本次只是空行,不影响 profile 里其它插件):` +
|
|
81
|
+
`${error?.code ?? error?.message ?? error}` +
|
|
82
|
+
`;检查 ${PROVIDER_PKG} 的版本是否满足 peer 范围,以及 ${bundledSkillDir} 是否可读`
|
|
83
|
+
);
|
|
84
|
+
}
|
|
72
85
|
}
|
|
73
86
|
|
|
74
87
|
/**
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dsh-gis/dsh-video-studio-skill",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Video Studio skill plugin for DeepSeek Harness: code-generated Chinese videos
|
|
3
|
+
"version": "0.7.2",
|
|
4
|
+
"description": "Video Studio skill plugin for DeepSeek Harness: style-pack driven code-generated Chinese videos — one style id decides palette/typography/music style/voice persona/pacing, measured TTS timeline, deterministic PIL/browser rendering, programmatic SFX and score, cue-driven sound sync, ffmpeg encoding, sample-level mixing and multi-layer QA gates.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
7
7
|
"exports": {
|
|
@@ -26,7 +26,17 @@
|
|
|
26
26
|
"THIRD_PARTY_NOTICES.md",
|
|
27
27
|
"skills",
|
|
28
28
|
"!skills/**/__pycache__",
|
|
29
|
-
"!skills/**/*.pyc"
|
|
29
|
+
"!skills/**/*.pyc",
|
|
30
|
+
"docs/styles/sheet-8-styles.png",
|
|
31
|
+
"docs/styles/sheet-ai.png",
|
|
32
|
+
"docs/styles/sheet-craft.png",
|
|
33
|
+
"docs/styles/sheet-night.png",
|
|
34
|
+
"docs/styles/demo-results.json",
|
|
35
|
+
"schemas",
|
|
36
|
+
"tools/estimate.py",
|
|
37
|
+
"tools/ci_check.py",
|
|
38
|
+
"tools/audio_similarity.py",
|
|
39
|
+
"tools/selftest_noscipy.py"
|
|
30
40
|
],
|
|
31
41
|
"publishConfig": {
|
|
32
42
|
"access": "public"
|