@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
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# 风格包(Style Packs):让每部片的画风 / 配乐 / 旁白都不一样
|
|
2
|
+
|
|
3
|
+
> v0.5.0 新增。读这一篇之前先读 SKILL.md 的 §5.6。
|
|
4
|
+
> 一句话:**一个 style id 同时决定画风、配乐、旁白声音和节奏**,不能三样各自乱配。
|
|
5
|
+
|
|
6
|
+
## 0. 为什么需要它(v0.4 的病)
|
|
7
|
+
|
|
8
|
+
v0.4 及以前,所有"身份参数"都是模块级常量:
|
|
9
|
+
|
|
10
|
+
| 层 | 被写死的地方 | 结果 |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| 画风 | assets/scenes.py 的 THEME 字典 + 3 个绘制函数 | 每部片都是深蓝底 + 橙强调 |
|
|
13
|
+
| 配乐 | scorekit 的 4 个小调 + 3 套和弦进行 + 固定动机 | 每部片都是 Dm / 120BPM 那一套 |
|
|
14
|
+
| 旁白 | render.py 的单个 voice/rate/pitch | 每部片都是同一个声音、同一语速 |
|
|
15
|
+
| 流程 | SKILL.md 教的是 "cp 模板 -> 改 lines[].text" | 模型自然只会改文案 |
|
|
16
|
+
|
|
17
|
+
结果就是:**内容换了,气质没换**。用户的原话是"背景音乐风格都差不多、旁白声音都差不多、整体画风也差不多"。
|
|
18
|
+
|
|
19
|
+
## 1. 三层结构
|
|
20
|
+
|
|
21
|
+
film.json style: "auto" | "tech-deep" | ... | "legacy"
|
|
22
|
+
|
|
|
23
|
+
v
|
|
24
|
+
stylekit.resolve_script_style(script) <- 纯函数,确定性
|
|
25
|
+
| +- 关键词打分(title/chapter/text/items)
|
|
26
|
+
| +- 三级内容指纹(full / tempo / style)
|
|
27
|
+
| +- 显式覆盖(visual.theme / music.style / voice.map / pacing)
|
|
28
|
+
v
|
|
29
|
+
work/style.json <- 审计产物:能看到"为什么是这套风格"
|
|
30
|
+
| +- style / theme_id / chapter_layout
|
|
31
|
+
| +- music{bpm,key,mood,seed_effective}
|
|
32
|
+
| +- voice{map,policy}
|
|
33
|
+
| +- pacing{lead,tail,min_dur,item_stagger}
|
|
34
|
+
v
|
|
35
|
+
画面(scenes.py 读主题) 配乐(scorekit 读风格) 旁白(voicekit 读 persona/tone)
|
|
36
|
+
|
|
37
|
+
## 2. 8 套内置风格
|
|
38
|
+
|
|
39
|
+
| id | 中文 | 画风 | 配乐 | 旁白 | 适合内容 |
|
|
40
|
+
|---|---|---|---|---|---|
|
|
41
|
+
| tech-deep | 科技深蓝 | 深蓝渐变 + 橙 | 小调 100–124 / 琶音 + 铃声 | 男声叙述 + 青年开场 | AI、工程、数据、科普 |
|
|
42
|
+
| magazine | 杂志暖白 | 米白 + 朱红,衬线体 | 大调 88–100 / 电钢 | 女声叙述 + 权威男声引用 | 报告、复盘、研究 |
|
|
43
|
+
| paper | 手绘纸感 | 牛皮纸 + 靛青,楷体 | 大调 84–92 / 马林巴 | 软糯女声 + 男声引用 | 手工、自然、历史 |
|
|
44
|
+
| vivid | 活力撞色 | 深紫 + 柠檬黄,大字 | 大调 120–132 / 短促和弦 | 活泼女声开场 | 活动、营销、上新 |
|
|
45
|
+
| mono | 极简黑白 | 纯白 + 黑,超宽字距 | 极简 60–68 / 钢片琴 | 沉稳男声 + 女声引用 | 观点、演讲、思辨 |
|
|
46
|
+
| cinema | 电影青橙 | 近黑 + 青橙,扫描线 | 小调 76–84 / 弦乐铺底 | 纪录片男声 + 女声引用 | 纪录、叙事、城市 |
|
|
47
|
+
| lo-fi | 暖灰薄荷 | 暖灰 + 薄荷绿 | 大调 72–84 / 电钢 + 轻鼓 | 温柔女声 | 日常、学习、专注 |
|
|
48
|
+
| epic | 深黑鎏金 | 近黑 + 金,衬线体 | 小调 88–96 / 铜管 + 人声铺 | 有力男声 + 男声开场 | 史诗、宣传、高潮 |
|
|
49
|
+
|
|
50
|
+
外加 legacy:不写 style 字段时的兼容档,画风/配乐/旁白全部等于 v0.4(配乐逐样本一致)。
|
|
51
|
+
|
|
52
|
+
查表:
|
|
53
|
+
|
|
54
|
+
python stylekit.py --list # 8 套风格 + 主题 + 对比度
|
|
55
|
+
python stylekit.py --show cinema # 单套风格的全部字段
|
|
56
|
+
python stylekit.py --lint # 主题对比度门禁(CI 会跑)
|
|
57
|
+
|
|
58
|
+
## 3. film.json 怎么配
|
|
59
|
+
|
|
60
|
+
最小配置(推荐,几乎不用写):
|
|
61
|
+
|
|
62
|
+
{"style": "auto"}
|
|
63
|
+
|
|
64
|
+
自动模式:命中题材关键词就锁定对应风格;零命中时按内容指纹稳定落桶
|
|
65
|
+
(同一份稿子永远同一个风格,不同稿子大概率不同)。
|
|
66
|
+
|
|
67
|
+
想锁定:
|
|
68
|
+
|
|
69
|
+
{"style": "cinema"}
|
|
70
|
+
|
|
71
|
+
想只改某一块(其余跟着风格走):
|
|
72
|
+
|
|
73
|
+
{
|
|
74
|
+
"style": "magazine",
|
|
75
|
+
"visual": {
|
|
76
|
+
"theme": "paper",
|
|
77
|
+
"layout": "split-right",
|
|
78
|
+
"theme_overrides": {"vignette": 0.18, "grain": 8.0}
|
|
79
|
+
},
|
|
80
|
+
"music": {
|
|
81
|
+
"style": "lo-fi",
|
|
82
|
+
"bpm": "auto", "key": "auto", "mood": "calm",
|
|
83
|
+
"seed": 7, "seed_from_content": true
|
|
84
|
+
},
|
|
85
|
+
"voice": {
|
|
86
|
+
"map": {"hook": "bright_female", "body": "narrator_female"},
|
|
87
|
+
"jitter": 0.35,
|
|
88
|
+
"max_distinct": 3
|
|
89
|
+
},
|
|
90
|
+
"pacing": {"lead": 0.6, "tail": 0.9, "item_stagger": 0.3}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
逐句覆盖(最高优先级):
|
|
94
|
+
|
|
95
|
+
{"id": "l03", "kind": "body", "text": "他说:「这不可能」",
|
|
96
|
+
"voice": "authority_male", "tone": "quote", "lead": 0.8}
|
|
97
|
+
|
|
98
|
+
### 字段速查
|
|
99
|
+
|
|
100
|
+
| 字段 | 默认 | 说明 |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| style | 无(= legacy) | 风格 id / "auto" / "legacy" |
|
|
103
|
+
| visual.theme | — | 等价于锁 style;与 style 1:1 |
|
|
104
|
+
| visual.layout | 风格默认 | left-stack / center-stack / split-right |
|
|
105
|
+
| visual.theme_overrides | — | 深合并覆盖主题单字段 |
|
|
106
|
+
| music.style | 跟随 style | 只换配乐风格 |
|
|
107
|
+
| music.bpm | "auto" | 数字或 "auto"(按风格梯度 + 指纹) |
|
|
108
|
+
| music.key | "auto" | 调名或 "auto"(按风格调池 + 指纹) |
|
|
109
|
+
| music.mood | 风格默认 | calm/reflective/hopeful/steady/driving/tense/uplifting |
|
|
110
|
+
| music.seed_from_content | 非 legacy 时 true | 音色细节由内容指纹派生 |
|
|
111
|
+
| voice.map | 风格默认 | kind -> persona 名 |
|
|
112
|
+
| voice.jitter | 0.35 | 语速/音高微扰,0 = 关 |
|
|
113
|
+
| voice.max_distinct | 3 | 全片最多几把声音 |
|
|
114
|
+
| pacing.* | 风格默认 | 语前留白/语后留白/最短段长/条目落位步长 |
|
|
115
|
+
| lines[].voice/tone/rate/pitch/volume/lead/tail | — | 逐句覆盖(最高优先级) |
|
|
116
|
+
|
|
117
|
+
## 4. 三级指纹:改错别字不会换整首曲子
|
|
118
|
+
|
|
119
|
+
| 指纹 | 由什么算 | 决定 |
|
|
120
|
+
|---|---|---|
|
|
121
|
+
| full | 标题 + 全部台词 | 音色细节(seed 派生) |
|
|
122
|
+
| tempo | 标题 + kind 序列 + 体量桶 | BPM 与调性 |
|
|
123
|
+
| style | 标题(配合关键词评分破平) | 风格 id |
|
|
124
|
+
|
|
125
|
+
所以:改一个错别字 -> full 变(音色纹理微变),tempo/style 不变(还是同一首曲子、同一个调);
|
|
126
|
+
换一部片 -> 三个都变。要完全锁死就写 music.seed + music.seed_from_content: false。
|
|
127
|
+
|
|
128
|
+
## 5. 片内变化:整体是一套,但每段有呼吸
|
|
129
|
+
|
|
130
|
+
**锁三件事**(全片一致,否则会"花"):
|
|
131
|
+
|
|
132
|
+
1. 明暗族(全深色 or 全浅色)
|
|
133
|
+
2. accent 色相
|
|
134
|
+
3. 字体族与字号阶梯
|
|
135
|
+
|
|
136
|
+
**其余可以按章节变**:
|
|
137
|
+
|
|
138
|
+
- 版式骨架轮换(同一 chapter 内不变):left-stack / center-stack / split-right
|
|
139
|
+
- 背景明度微移、纹理强度、accent 出现的面积
|
|
140
|
+
- 配乐:逐小节能量弧线、配器进出(1 小节渐入渐出)、主奏轮换、动机变形
|
|
141
|
+
- 旁白:hook/body/quote/outro 的语气档(语速、音高、停顿)
|
|
142
|
+
|
|
143
|
+
**禁止**:同一部片里跨明暗族换主题(深蓝段直接切暖白段)。实测这会精确触发
|
|
144
|
+
qa_frames 的单帧闪烁门禁(阈值 6.0 灰度,整屏换底可达 100+ 级),而且观众看着像"换了一部片"。
|
|
145
|
+
真需要强对比,把它做成两个片子,或登记成带 visual_at 的视觉事件。
|
|
146
|
+
|
|
147
|
+
## 6. 门禁:主题必须过对比度体检
|
|
148
|
+
|
|
149
|
+
stylekit.theme_lint(theme) 在 --stage style 就拦,不用等渲完 300 帧:
|
|
150
|
+
|
|
151
|
+
| 角色 | 对背景的最低对比度 | 理由 |
|
|
152
|
+
|---|---|---|
|
|
153
|
+
| ink(正文/标题) | 7.0 | WCAG AAA 正文线 |
|
|
154
|
+
| muted(副标) | 4.5 | WCAG AA |
|
|
155
|
+
| dim(HUD 小字) | 3.0 | 装饰级 |
|
|
156
|
+
| accent / accent2 | 4.5 | 强调色常当文字用 |
|
|
157
|
+
| good / bad | 3.0(对卡片底) | 只承载图形,靠位置+颜色双编码 |
|
|
158
|
+
| bg 与 bg2 亮度差 | >= 0.002 | 防纯色底 |
|
|
159
|
+
|
|
160
|
+
加第 9 套风格时:先写 _theme(...),再跑 python stylekit.py --lint,过了再进 STYLES。
|
|
161
|
+
|
|
162
|
+
## 7. 加一套自己的风格(5 步)
|
|
163
|
+
|
|
164
|
+
1. stylekit.THEMES["my-style"] = _theme(...)(配色 + 材质 + 排版 + 版式 + 动态 + HUD)
|
|
165
|
+
2. stylekit.STYLES["my-style"] = {...}(theme / layouts / music{bpm_ladder,keys,mood} / voice / pacing)
|
|
166
|
+
3. STYLE_IDS 元组末尾追加(只追加不改顺序,否则指纹映射会漂)
|
|
167
|
+
4. python stylekit.py --lint 全绿;配乐侧在 scorekit.MUSIC_STYLES 里加同名条目
|
|
168
|
+
5. 用 3 段样片跑 --stage stills 亲眼看(铁律 6:能出图 != 没问题)
|
|
169
|
+
|
|
170
|
+
## 8. 常见误用
|
|
171
|
+
|
|
172
|
+
| 现象 | 原因 | 修法 |
|
|
173
|
+
|---|---|---|
|
|
174
|
+
| 画面换了、配乐还是老的 | 只改了 visual.theme 没改 music.style | 直接改 style,或两个都写 |
|
|
175
|
+
| 同一部片前后像两部片 | 段界跨了明暗族 | 用同族主题;或拆成两部 |
|
|
176
|
+
| 改台词后配乐变了 | 改了标题或 kind 结构 -> tempo 指纹变 | 写死 music.key/music.bpm,或 seed_from_content:false |
|
|
177
|
+
| 旁白听感像广播剧 | max_distinct 太大 / 相邻句频繁换人 | 降到 2,靠 tone 而不是换人做变化 |
|
|
178
|
+
| 字幕在浅色主题上看不清 | 用了 v0.4 的黑底白字 | 传 theme= 给 draw_subtitle(render.py 已自动传) |
|
|
@@ -121,7 +121,7 @@ assets/web/film.js 是 12 秒 / 3 个场景的完整模板:
|
|
|
121
121
|
|---|---|
|
|
122
122
|
| 1920x1080 PNG 截图 + 页面绘制 | 约 70–120 ms/帧(2 workers 时 70–85 ms/帧均摊) |
|
|
123
123
|
| 12 秒 / 360 帧 / 2 workers / chunk 3s | 28.0 s 出片(约 78 ms/帧均摊) |
|
|
124
|
-
| 自检(24
|
|
124
|
+
| 自检(24 项,含真实无头浏览器与跨会话确定性验证) | 约 15 s |
|
|
125
125
|
|
|
126
126
|
调参顺序:先降 workers(1–2 个足够,多了内存涨),再降 chunk_s(块小重渲代价低),
|
|
127
127
|
最后才动 crf/preset(crf 17 / preset slow 是质量档;预览可用 crf 20 / preset veryfast)。
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
#
|
|
3
3
|
# pip install -r requirements.txt # 必需 + 强烈建议(可选项默认注释,按需打开)
|
|
4
4
|
#
|
|
5
|
-
# 分三档,与 SKILL.md §
|
|
5
|
+
# 分三档,与 README「环境前提」(必需 / 可选两段)对应;SKILL.md §10 的脚本表写了每个文件依赖谁。
|
|
6
|
+
# 强烈建议档在这里单独列出(README 把它并进"可选"一句话里,档位以本文件为准)。
|
|
6
7
|
|
|
7
8
|
# ---- 必需:缺任何一条,主体流程跑不起来 ----
|
|
8
9
|
numpy>=1.24
|
|
@@ -23,7 +24,18 @@ opencv-python-headless>=4.8
|
|
|
23
24
|
# 装完还要下载浏览器:python -m playwright install chromium
|
|
24
25
|
# playwright>=1.40
|
|
25
26
|
|
|
27
|
+
# ---- v0.6.0 新增文件:都是纯标准库,**不需要**任何 pip 包 ----
|
|
28
|
+
# scripts/gates.py 门禁账本 / QC 报告 / 人工签核(必需:render.py 直接 import)
|
|
29
|
+
# scripts/stagewatch.py 阶段新鲜度(必需:同上)
|
|
30
|
+
# scripts/filmcheck.py film.json 契约校验(可选:ci_check 第 12 项会调)
|
|
31
|
+
# tools/estimate.py 开渲前成本预演(可选)
|
|
32
|
+
# 若你从旧版本升级,记得把 gates.py / stagewatch.py 一起拷到工作目录,
|
|
33
|
+
# 否则 render.py 会 ModuleNotFoundError。
|
|
34
|
+
|
|
26
35
|
# ---- 不需要 ----
|
|
27
36
|
# moviepy / pydub / soundfile / librosa / manim:本技能一行都不 import。
|
|
28
37
|
# ffmpeg 不是 pip 包:系统 PATH 里要有(含 libx264 / aac / loudnorm),
|
|
29
38
|
# 或用环境变量 FILMKIT_FFMPEG 指向可执行文件。
|
|
39
|
+
# v0.6.0 起探测是 fail-closed 的:每个候选真跑 `-version`,跑不起来的会被跳过
|
|
40
|
+
# (防的是"存在但缺 xfade 的旧版 ffmpeg 被静默选中")。`FILMKIT_FFMPEG_STRICT=1`
|
|
41
|
+
# 可把"找不到可用 ffmpeg"从回退裸命令改成直接报错。
|