@dsh-gis/dsh-video-studio-skill 0.4.0 → 0.6.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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @dsh-gis/dsh-video-studio-skill
2
2
 
3
- ![version](https://img.shields.io/badge/version-0.4.0-blue) ![license](https://img.shields.io/badge/license-MIT-green)
3
+ ![version](https://img.shields.io/badge/version-0.6.0-blue) ![license](https://img.shields.io/badge/license-MIT-green)
4
4
 
5
5
  **DeepSeek Harness 技能插件:用代码从零生成中文视频。**
6
6
 
@@ -16,7 +16,18 @@ 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
- > 详见 [CHANGELOG.md](CHANGELOG.md) 与 SKILL.md §13。
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。
20
31
 
21
32
  ## 安装
22
33
 
@@ -53,6 +64,24 @@ mv ~/.dsh/skills/video-studio ~/.dsh/backup/video-studio.bak-$(date +%Y%m%d)
53
64
  **时长 30.10 s / 1920×1080 / 30 fps / h264+aac 48 kHz / -16.0 LUFS / 真峰 -1.2 dBTP / 黑帧 0 /
54
65
  帧级深检:闪烁 0、空窗 0、画面静止 0**(音画同步在 PIL 路线上需要写 `visual_at` 才会真的查,见 SKILL.md §7)。
55
66
 
67
+ ## 效果:同一个模板,八种气质(v0.5)
68
+
69
+ 同一份文字,只改 `"style"`(画风 / 配乐 / 旁白 / 节奏一起变):
70
+
71
+ <p align="center"><img src="docs/styles/sheet-8-styles.png" width="100%" alt="8 套风格对比:科技深蓝 / 杂志暖白 / 手绘纸感 / 活力撞色 / 极简黑白 / 电影青橙 / 暖灰薄荷 / 深黑鎏金"></p>
72
+
73
+ 三份**不同题材**的短片(全流程真跑:TTS → 排轴 → 配乐 → 音效 → 混音 → 逐帧 → 编码 → 质检):
74
+
75
+ | 题材 | 自动选中的风格 | 配乐 | 旁白声线 | 质检 |
76
+ |---|---|---|---|---|
77
+ | AI 大模型的三年 | tech-deep 科技深蓝 | 小调 116BPM / Em | 青年开场 → 男声正文 → 女声引用 | PASS(17.3s,-16.0 LUFS) |
78
+ | 手工木作的一天 | paper 手绘纸感 | 大调 84BPM / C | 女声 + 软糯女声正文 | PASS(19.9s) |
79
+ | 深夜学习指南 | lo-fi 暖灰薄荷 | 大调 84BPM / G | 温柔女声 + 女声开场 | PASS(20.1s) |
80
+
81
+ <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>
82
+
83
+ 三片的联系表(左→右为时间顺序)肉眼可见不是同一套风格:深蓝科技 / 牛皮纸手作 / 冷灰薄荷深夜。
84
+
56
85
  ## 用法
57
86
 
58
87
  触发词:做一个视频 / 生成宣传片 / 把报告变成视频 / 做动画 / 配音配字幕 / 出成片 /
@@ -62,14 +91,17 @@ mv ~/.dsh/skills/video-studio ~/.dsh/backup/video-studio.bak-$(date +%Y%m%d)
62
91
 
63
92
  ```bash
64
93
  mkdir -p myfilm && cd myfilm
65
- cp <SKILL_DIR>/assets/film.json . # 剧本模板
94
+ cp <SKILL_DIR>/assets/film.json . # 剧本模板("style": "auto")
66
95
  cp <SKILL_DIR>/assets/scenes.py . # 场景模板
67
- cp <SKILL_DIR>/scripts/*.py . # filmkit/render/selfcheck + sfxkit/scorekit/qa_frames/webengine
96
+ cp <SKILL_DIR>/scripts/*.py . # filmkit/stylekit/voicekit/render/selfcheck + sfxkit/scorekit/qa_frames/webengine
68
97
  cp -r <SKILL_DIR>/assets/web ./web # 只在走浏览器引擎时需要
69
98
 
70
- python selfcheck.py # 24 条环境/回归断言(20 秒,不联网)
99
+ python selfcheck.py # 32 条环境/回归断言(20 秒,不联网)
100
+ python <REPO>/tools/estimate.py --script film.json # v0.6:开渲前先算耗时/磁盘/分块
71
101
  python render.py --stage stills --stills "l01:3,l02:5" # 母版预览(缺 tts/layout 会自动补跑)
72
102
  python render.py --script film.json --scenes scenes.py --out out/film.mp4 --work work
103
+ cat out/QC-REPORT.md # v0.6:机器可读交付结论(pass/fail/skipped)
104
+ python render.py --stage accept --gate release # v0.6:人工签核(绑内容指纹)
73
105
  ```
74
106
 
75
107
  分阶段(每步落盘、可单独重跑):
@@ -95,7 +127,15 @@ tts → layout → cues → score → sfx → audio → frames → mux → qa
95
127
 
96
128
  `<SKILL_DIR>` 是 `skill` 工具加载时回报的 resourceBase 目录(`.../skills/video-studio/`)。
97
129
 
98
- 分阶段(v0.2 起**每个 stage 只做自己的事**;完整 10 个 stage 见上):`--stage tts | layout | cues | score | sfx | audio | frames | mux | qa | stills`。
130
+ 分阶段(v0.2 起**每个 stage 只做自己的事**):`--stage style | tts | layout | cues | score | sfx | audio | frames | mux | qa | stills | accept | explain`。
131
+
132
+ **v0.6 的三个新开关**(都是"让结论可追责",不是新玩具):
133
+
134
+ | 想要 | 怎么做 |
135
+ |---|---|
136
+ | 交付前把"没执行"也算失败 | `--stage qa --strict-gates`(对齐 `QA_REQUIRE_SYNC` 语义) |
137
+ | 改完东西不知道要重跑什么 | `--stage explain`(机器判断过时阶段 + 给最小重跑命令),表见 [references/change-impact.md](skills/video-studio/references/change-impact.md) |
138
+ | 规整 `film.json` 避免静默失效 | `python skills/video-studio/scripts/filmcheck.py film.json`(`holds`→提示写成 `hold`) |
99
139
 
100
140
  长片:`--stage frames --jobs 4`(按绝对帧号分块并行)+ `--resume`(中断只补缺块)。
101
141
 
@@ -111,6 +151,10 @@ tts → layout → cues → score → sfx → audio → frames → mux → qa
111
151
  | **声音和画面对不上(v0.3)** | **提示点系统**:画面登记 cue → 音效按 cue 合成,改节奏不用重新对时间 |
112
152
  | **声音单薄、只有"叮叮咚咚"(v0.3)** | `sfxkit` 物理建模音效 + `scorekit` 一张和弦表贯穿全片 |
113
153
  | **一帧白闪/两秒空窗没人发现(v0.3)** | `qa_frames` 帧级深检:单帧闪烁、画面空窗、音画同步 |
154
+ | **"我查过了"无法复现(v0.6)** | `out/QC-REPORT.md` + `work/gates.json`:三档 gate matrix,"没执行"独立成 `skipped` |
155
+ | **"我签过了"变成空头支票(v0.6)** | 签核绑内容指纹:改剧本 / `scenes.py` / 引擎,旧签核自动失效 |
156
+ | **改一句台词不知道要重跑什么(v0.6)** | `work/manifest.json` 记每阶段输入/输出指纹,`--stage explain` 直接给最小重跑命令 |
157
+ | **`holds` 写成拼写错误却静默失效(v0.6)** | `schemas/film.schema.json` + `filmcheck.py`,并接进 `ci_check` 第 12 项 |
114
158
 
115
159
  ## 文件结构
116
160
 
@@ -121,10 +165,13 @@ icon.svg / locale/*.json 插件页展示元数据
121
165
  skills/video-studio/
122
166
  SKILL.md 主线:上手 / 八阶段 / 引擎选型 / 画质 / 声音 / 提示点 / 停留窗口 / 质检 / 故障速查
123
167
  references/ pipeline · scene-authoring · audio · sfx-design · web-engine · frame-qa
124
- quality-gates · pitfalls
168
+ quality-gates · change-impact · style-packs · pitfalls
125
169
  scripts/filmkit.py 生产内核(字体/排版/字幕/音频总线/CueBus/TTS/时间轴/编码/质检)
126
- scripts/render.py 编排器(10 个独立 stage、pil|web 双引擎、分块并行、断点续跑、母版预览)
127
- scripts/selfcheck.py 回归自检(24 条"曾真的坏过"的断言)
170
+ scripts/gates.py v0.6 门禁账本 / QC 报告渲染 / 人工签核(绑内容指纹)
171
+ scripts/stagewatch.py v0.6 阶段新鲜度(work/manifest.json + --stage explain)
172
+ scripts/filmcheck.py v0.6 film.json 契约校验(未知键/枚举/跨字段)
173
+ scripts/render.py 编排器(13 个 stage、pil|web 双引擎、分块并行、断点续跑、母版预览、门禁账本)
174
+ scripts/selfcheck.py 回归自检(32 条"曾真的坏过"的断言)
128
175
  scripts/sfxkit.py 物理建模音效库(24 配方,scipy 可选)
129
176
  scripts/scorekit.py 程序化配乐(和弦表 / 分段能量 / 吸气)
130
177
  scripts/webengine.py 浏览器逐帧渲染(CDP 截图、分块并行、崩溃重开、cue 导出、文字质检)
@@ -133,7 +180,9 @@ skills/video-studio/
133
180
  assets/film.json 剧本模板(含 hold / bpm / music / sfx.cues)
134
181
  assets/scenes.py 场景模板(开场 / 正文卡片 / 收尾 + cues() 钩子)
135
182
  assets/web/ 浏览器页面模板(原生 Canvas2D 确定性时间轴)
136
- tools/ci_check.py 仓库级体检(语法/JSON/依赖白名单/打包卫生/文档引用,不需 ffmpeg)
183
+ tools/ci_check.py 仓库级体检(12 项;语法/JSON/依赖白名单/打包卫生/文档引用/film 契约,不需 ffmpeg)
184
+ tools/estimate.py 开渲前成本预演(帧数/耗时/磁盘/分块建议,--json 可机读)
185
+ schemas/film.schema.json film.json 的契约(draft-07 子集)
137
186
  .github/workflows/ci.yml CI:repo 体检(ubuntu+windows)+ 技能自检(ubuntu)
138
187
  ```
139
188
 
@@ -170,9 +219,10 @@ peer 范围 `@deepseek-ai/dsh-skill-filesystem >=0.1.0-rc.6 <0.3.0-0`,覆盖 D
170
219
  ## 仓库自检(给贡献者与 CI 用,不是给用户用的)
171
220
 
172
221
  ```bash
173
- python tools/ci_check.py -v # 11 项:py 语法 / node --check / JSON / 技能清单 / 依赖白名单 /
222
+ python tools/ci_check.py -v # 12 项:py 语法 / node --check / JSON / 技能清单 / 依赖白名单 /
174
223
  # npm pack 打包卫生 / 文档路径引用 / Python 3.9 语法 /
175
- # Markdown 围栏平衡 / CI workflow 语法 / 单文件体积
224
+ # Markdown 围栏平衡 / CI workflow 语法 / 单文件体积 /
225
+ # film.json 契约(调 filmcheck.py,规则只留一份)
176
226
  ```
177
227
 
178
228
  它**不需要 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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dsh-gis/dsh-video-studio-skill",
3
- "version": "0.4.0",
4
- "description": "Video Studio skill plugin for DeepSeek Harness: code-generated Chinese videos with measured TTS timeline, deterministic PIL/browser frame rendering, programmatic SFX and score, cue-driven sound sync, ffmpeg encoding, sample-level mixing and multi-layer QA gates.",
3
+ "version": "0.6.0",
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,15 @@
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"
30
38
  ],
31
39
  "publishConfig": {
32
40
  "access": "public"