@dsh-gis/dsh-video-studio-skill 0.7.2 → 0.8.1
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/CHANGELOG.md +951 -0
- package/README.md +51 -8
- package/THIRD_PARTY_NOTICES.md +1 -0
- package/index.js +4 -1
- package/package.json +5 -3
- package/schemas/film.schema.json +162 -2
- package/skills/video-studio/SKILL.md +211 -11
- package/skills/video-studio/assets/golden_frames.json +65 -0
- package/skills/video-studio/assets/web/engine.js +63 -2
- package/skills/video-studio/assets/web/film.js +224 -101
- package/skills/video-studio/assets/web/index.html +4 -2
- package/skills/video-studio/assets/web/qa_text.js +36 -8
- package/skills/video-studio/references/audio-variation.md +4 -3
- package/skills/video-studio/references/audio.md +2 -2
- package/skills/video-studio/references/change-impact.md +1 -1
- package/skills/video-studio/references/quality-gates.md +25 -3
- package/skills/video-studio/references/style-packs.md +7 -3
- package/skills/video-studio/references/v08-quality.md +256 -0
- package/skills/video-studio/references/web-engine.md +19 -2
- package/skills/video-studio/references/word-timeline.md +147 -0
- package/skills/video-studio/requirements.txt +14 -0
- package/skills/video-studio/scripts/filmcheck.py +121 -0
- package/skills/video-studio/scripts/filmkit.py +521 -38
- package/skills/video-studio/scripts/gates.py +88 -4
- package/skills/video-studio/scripts/preflight.py +774 -0
- package/skills/video-studio/scripts/qa_frames.py +49 -8
- package/skills/video-studio/scripts/qaasr.py +1563 -0
- package/skills/video-studio/scripts/qavmaf.py +1442 -0
- package/skills/video-studio/scripts/render.py +719 -32
- package/skills/video-studio/scripts/scorekit.py +16 -30
- package/skills/video-studio/scripts/selfcheck.py +274 -0
- package/skills/video-studio/scripts/sfxkit.py +130 -14
- package/skills/video-studio/scripts/stagewatch.py +19 -6
- package/skills/video-studio/scripts/stylekit.py +43 -12
- package/skills/video-studio/scripts/voicekit.py +15 -7
- package/skills/video-studio/scripts/webengine.py +1119 -72
- package/tools/ci_check.py +171 -31
- package/tools/estimate.py +130 -19
- package/tools/golden_frames.py +664 -0
package/README.md
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# @dsh-gis/dsh-video-studio-skill
|
|
2
2
|
|
|
3
|
-
 
|
|
4
4
|
|
|
5
5
|
**DeepSeek Harness 技能插件:用代码从零生成中文视频。**
|
|
6
6
|
|
|
7
7
|
写剧本 → edge-tts 旁白 → **实测时长**排时间轴 → **提示点**驱动配乐与音效 → PIL 或浏览器逐帧渲染 →
|
|
8
|
-
ffmpeg 编码 → 采样级混音 → **四层质检**(容器 / 信号 / 时间 /
|
|
8
|
+
ffmpeg 编码 → 采样级混音 → **四层质检**(容器 / 信号 / 时间 / 页面)+ **v0.8 的四个新闸**
|
|
9
|
+
(渲前资源预检 `G0` / 词级时间戳 `G10` / 全片 VMAF `G11` / ASR 回读 `G12`)。
|
|
9
10
|
零素材、可复现、可断点续跑、可脚本化验收;装成插件后,整片生产流程随技能一起进入每个会话。
|
|
10
11
|
|
|
11
12
|
> 源自 `dsh-v` 资产包的 `02-技能包-video-studio`(817 个 DSH 会话的考古分析 + 5 套现存工程逆向 + 本机实测)。
|
|
@@ -36,6 +37,27 @@ ffmpeg 编码 → 采样级混音 → **四层质检**(容器 / 信号 / 时
|
|
|
36
37
|
> 实测(真实素材):旧混音 -4.2 dB → 新混音 12.0 dB,`audio_similarity --strict` D 组 12.9 dB;
|
|
37
38
|
> selfcheck 34 → 38 条,其中第 35–38 条专盯这条链路。
|
|
38
39
|
> 详见 [CHANGELOG.md](CHANGELOG.md) 与 SKILL.md §5.6 / §5.7、references/audio-variation.md。
|
|
40
|
+
> **v0.8.0(把"看得见"变成"抓得住")**:四个方向——① **词级时间轴**:edge-tts 的 WordBoundary 事件落
|
|
41
|
+
> `work/words.json`(4 句 / 64 词 / 末词偏差 0.09 s),字幕改按词折行,cue 可写词锚点 `"l03:w2+0.1"`;
|
|
42
|
+
> ② **四道新门禁**:渲前资源预检 `G0`(缺字形/坏音频在渲第一帧前 fail,< 1 s)、词级时间戳 `G10`、
|
|
43
|
+
> 全片 VMAF/SSIM `G11`(参考帧由场景函数**实时重渲**,不是成片抽帧;29 s 片 VMAF 97.22 / 14.2 s)、ASR 回读 `G12`
|
|
44
|
+
> (成片音轨转文字对账,0.72 以下才 fail,8.7 s/片);③ **画幅/帧率参数化**(只做 16:9 横屏,
|
|
45
|
+
> 内部恒 1080p、编码时下采样,720p 已实测全门通过)、**批量** `--batch`(≤100 条、开跑前全量预检、
|
|
46
|
+
> 单条失败不阻断)、**预览** `--preview N`(前 N 秒出 mp4+gif)、**运行版本化** `--run-id`(`work/runs/<runId>/`);
|
|
47
|
+
> ④ web 引擎跟随风格包(`window.__STYLE__` 注入,`style=None` 时逐字节等于 v0.7)+ 金帧像素回归
|
|
48
|
+
> `tools/golden_frames.py`。**代价要说清**:29 s 模板片全链从约 28 s 涨到 **47.3 s**,其中 `qa` **23.9 s**
|
|
49
|
+
> 已经**超过渲染本身**(`frames` 12.5 s);`estimate` 预演也从 28.4 s 变成 **58.8–108.2 s**(vmaf 31–50 s 是瓶颈)。
|
|
50
|
+
> v0.8 之后"出片时间"不再只是渲染时间。selfcheck 43 → **51 条**。
|
|
51
|
+
> 详见 [CHANGELOG.md](CHANGELOG.md) 与 SKILL.md §6.1 / §7.5、references/word-timeline.md、references/v08-quality.md。
|
|
52
|
+
> **v0.8.1(全项目深审,无新功能)**:把 14 个模块 / 5 个前端文件 / 12 篇 references / 仓库工具链
|
|
53
|
+
> 全部过一遍,修掉 **60+ 处**「看着没问题、其实没在查」。举几个真会伤到交付的:
|
|
54
|
+
> ① **VMAF 参考帧与成片的字幕折行口径不一致**(渲染传 `words`、参考帧没传)——近静态画面
|
|
55
|
+
> 从 **99.95 掉到 8.55**,同源好片被判 fail;② `--stage style/stills/frames/mux` 的门禁 fail
|
|
56
|
+
> **没进退出码**(stdout 打 [FAIL]、进程仍 exit 0);③ `webengine` 在 `style=None` + 720p 时
|
|
57
|
+
> **静默输出 1080p 原画的左上角裁切**(逐像素相同、标题/HUD 全丢、exit 0);
|
|
58
|
+
> ④ `visual.layout` 与 `qa.vmaf.sample_step` 写了**完全没人读**;⑤ `selfcheck` 第 51 条把金帧
|
|
59
|
+
> 的 skipped 当 PASS(**这条门禁从没真的比过一帧**);⑥ `ci_check` 把"跳过(没装 node)"记成 PASS。
|
|
60
|
+
> 详见 [CHANGELOG.md](CHANGELOG.md) 的 0.8.1 段(含行为变化表与升级须知)。
|
|
39
61
|
|
|
40
62
|
## 安装
|
|
41
63
|
|
|
@@ -112,11 +134,14 @@ mkdir -p myfilm && cd myfilm
|
|
|
112
134
|
cp <SKILL_DIR>/assets/film.json . # 剧本模板("style": "auto")
|
|
113
135
|
cp <SKILL_DIR>/assets/scenes.py . # 场景模板
|
|
114
136
|
cp <SKILL_DIR>/scripts/*.py . # filmkit/stylekit/voicekit/render/selfcheck + sfxkit/scorekit/qa_frames/webengine
|
|
137
|
+
# v0.8 还含 preflight/qaasr/qavmaf(可选:缺了对应门禁记 skipped)
|
|
115
138
|
cp -r <SKILL_DIR>/assets/web ./web # 只在走浏览器引擎时需要
|
|
116
139
|
|
|
117
|
-
python selfcheck.py #
|
|
140
|
+
python selfcheck.py # 51 条环境/回归断言(20 秒内,不联网)
|
|
118
141
|
python <REPO>/tools/estimate.py --script film.json # v0.6:开渲前先算耗时/磁盘/分块(仓库/包里的工具,
|
|
119
142
|
# 不在 skills/video-studio/ 内,quickstart 拷出来的目录没有它)
|
|
143
|
+
# v0.8:已含 preflight/vmaf/asr 三段;29 s 模板片
|
|
144
|
+
# 预演 total 28.4 s -> 37.5-83.0 s(区间上界,实测 47.3 s)
|
|
120
145
|
python render.py --stage stills --stills "l01:3,l02:5" # 母版预览(缺 tts/layout 会自动补跑)
|
|
121
146
|
python render.py --script film.json --scenes scenes.py --out out/film.mp4 --work work
|
|
122
147
|
cat out/QC-REPORT.md # v0.6:机器可读交付结论(pass/fail/skipped)
|
|
@@ -157,6 +182,15 @@ tts → layout → cues → score → sfx → audio → frames → mux → qa
|
|
|
157
182
|
| 改完东西不知道要重跑什么 | `--stage explain`(机器判断过时阶段 + 给最小重跑命令),表见 [references/change-impact.md](skills/video-studio/references/change-impact.md) |
|
|
158
183
|
| 规整 `film.json` 避免静默失效 | `python skills/video-studio/scripts/filmcheck.py film.json`(`holds`→提示写成 `hold`) |
|
|
159
184
|
|
|
185
|
+
**v0.8 的四个新开关**(前三个会改变门禁结果,第四个只是看片更快):
|
|
186
|
+
|
|
187
|
+
| 想要 | 怎么做 |
|
|
188
|
+
|---|---|
|
|
189
|
+
| 交付 720p / 换帧率 | `film.json` 写 `"video": {"width":1280,"height":720,"fps":24}`(只做 16:9 横屏、只能下采样;720p 已实测全门通过) |
|
|
190
|
+
| 批量出片 | `python render.py --batch films.json`(≤100 条、开跑前全量预检、单条失败不阻断、末尾 `batch-report.json`) |
|
|
191
|
+
| 只渲前 N 秒给人看 | `--preview 15`(出 `out/preview/*.mp4` + `.gif`,不写交付账本) |
|
|
192
|
+
| 让 QA 快一点 | `--vmaf sample`(每 5 帧取 1,实测 8.0 s vs 全片 14.2 s,VMAF 只差 0.34)或 `--vmaf off`(G11 记 skipped) |
|
|
193
|
+
|
|
160
194
|
长片:`--stage frames --jobs 4`(按绝对帧号分块并行)+ `--resume`(中断只补缺块)。
|
|
161
195
|
|
|
162
196
|
## 这个技能解决什么
|
|
@@ -186,12 +220,17 @@ skills/video-studio/
|
|
|
186
220
|
SKILL.md 主线:上手 / 八阶段 / 引擎选型 / 画质 / 声音 / 提示点 / 停留窗口 / 质检 / 故障速查
|
|
187
221
|
references/ pipeline · scene-authoring · audio · audio-variation · sfx-design · web-engine
|
|
188
222
|
frame-qa · quality-gates · change-impact · style-packs · pitfalls
|
|
223
|
+
word-timeline(v0.8)· v08-quality(v0.8)
|
|
189
224
|
scripts/filmkit.py 生产内核(字体/排版/字幕/音频总线/CueBus/TTS/时间轴/编码/质检)
|
|
190
225
|
scripts/gates.py v0.6 门禁账本 / QC 报告渲染 / 人工签核(绑内容指纹)
|
|
191
226
|
scripts/stagewatch.py v0.6 阶段新鲜度(work/manifest.json + --stage explain)
|
|
192
227
|
scripts/filmcheck.py v0.6 film.json 契约校验(未知键/枚举/跨字段)
|
|
193
|
-
scripts/render.py 编排器(13 个 stage、pil|web
|
|
194
|
-
|
|
228
|
+
scripts/render.py 编排器(13 个 stage、pil|web 双引擎、分块并行、断点续跑、母版预览、门禁账本;
|
|
229
|
+
v0.8 增 --batch / --preview / --run-id / --vmaf / --no-preflight)
|
|
230
|
+
scripts/preflight.py v0.8 渲染前资源预检(字形 / TTS 音频 / 字体 / web 入口页,门禁 G0)
|
|
231
|
+
scripts/qavmaf.py v0.8 全片 VMAF/SSIM(参考帧由场景函数实时重渲,门禁 G11)
|
|
232
|
+
scripts/qaasr.py v0.8 ASR 回读(成片音轨转文字对账,门禁 G12)
|
|
233
|
+
scripts/selfcheck.py 回归自检(51 条"曾真的坏过"的断言)
|
|
195
234
|
scripts/sfxkit.py 物理建模音效库(24 配方,scipy 可选)
|
|
196
235
|
scripts/scorekit.py 程序化配乐(和弦表 / 分段能量 / 吸气)
|
|
197
236
|
scripts/webengine.py 浏览器逐帧渲染(CDP 截图、分块并行、崩溃重开、cue 导出、文字质检)
|
|
@@ -199,9 +238,11 @@ skills/video-studio/
|
|
|
199
238
|
requirements.txt Python 依赖(必需 / 强烈建议 / 可选三档,带注释)
|
|
200
239
|
assets/film.json 剧本模板(含 bpm / music / sfx.cues / 逐句 hold;顶层 hold 可选,缺省用风格 pacing)
|
|
201
240
|
assets/scenes.py 场景模板(开场 / 正文卡片 / 收尾 + cues() 钩子)
|
|
202
|
-
assets/
|
|
241
|
+
assets/golden_frames.json v0.8 金帧基线(3 帧 sha256 + 字体/环境指纹,改绘制代码后重录)
|
|
242
|
+
assets/web/ 浏览器页面模板(原生 Canvas2D 确定性时间轴;v0.8 读 window.__STYLE__)
|
|
203
243
|
tools/ci_check.py 仓库级体检(12 项;语法/JSON/依赖白名单/打包卫生/文档引用/film 契约,不需 ffmpeg)
|
|
204
|
-
tools/estimate.py 开渲前成本预演(帧数/耗时/磁盘/分块建议,--json
|
|
244
|
+
tools/estimate.py 开渲前成本预演(帧数/耗时/磁盘/分块建议,--json 可机读;v0.8 含 preflight/vmaf/asr)
|
|
245
|
+
tools/golden_frames.py v0.8 金帧像素回归(--write 重录 / --check 校验;同环境像素变了 = fail)
|
|
205
246
|
tools/audio_similarity.py 音频差异/相似度验收(--strict 阈值判定,改音频代码后必跑)
|
|
206
247
|
tools/selftest_noscipy.py 无 scipy 兜底路径自检(CI 用;屏蔽 scipy 后跑 sfxkit/scorekit 自检)
|
|
207
248
|
schemas/film.schema.json film.json 的契约(draft-07 子集)
|
|
@@ -213,7 +254,9 @@ schemas/film.schema.json film.json 的契约(draft-07 子集)
|
|
|
213
254
|
**插件运行**:Node.js ≥ 20(`package.json` 的 `engines`;这是 DSH 加载插件用的运行时,不必另装)。
|
|
214
255
|
**必需**:ffmpeg + Python 的 numpy / Pillow / edge-tts。
|
|
215
256
|
**可选**:cv2(编码锐度比)、scipy(音效滤波加速,缺了走 FFT 卷积)、
|
|
216
|
-
playwright + Chromium/Edge(只在 `--engine web`
|
|
257
|
+
playwright + Chromium/Edge(只在 `--engine web` 时需要)、
|
|
258
|
+
faster-whisper(v0.8 的 ASR 回读门禁 G12;没装会降级到 ffmpeg whisper 滤镜,仍不可用则记 skipped)。
|
|
259
|
+
v0.8 的 G11(全片 VMAF)不需要新依赖,但要求 ffmpeg 构建**带 libvmaf**(9.0.2 full_build 有)。
|
|
217
260
|
不需要 moviepy / pydub / soundfile / librosa / manim——本技能一行都不 import 它们。
|
|
218
261
|
|
|
219
262
|
依赖清单有机器可读的一份,别再手抄:
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
| opencv-python(cv2) | 编码锐度比(Laplacian 方差) | Apache-2.0 | 可选(缺了跳过锐度门禁) |
|
|
31
31
|
| scipy | sfxkit 的时间域滤波加速 | BSD-3-Clause | 可选(缺了走 FFT 卷积兜底) |
|
|
32
32
|
| playwright | web 引擎驱动 Chromium/Edge | Apache-2.0 | 可选(只在 `--engine web` 时需要) |
|
|
33
|
+
| faster-whisper | ASR 回读门禁(G12)把成片音轨转回文字 | MIT(模型权重另有许可,随模型分发) | 可选(缺了降级到 ffmpeg whisper 滤镜 / skipped) |
|
|
33
34
|
| Chromium / Microsoft Edge | web 引擎的渲染内核 | BSD-3-Clause / 微软条款 | 可选 |
|
|
34
35
|
|
|
35
36
|
**字体**:PIL 引擎使用系统自带中文字体(Windows 的 `msyh.ttc`/`msyhbd.ttc` 等),
|
package/index.js
CHANGED
|
@@ -68,7 +68,10 @@ export async function apply(ctx) {
|
|
|
68
68
|
// 这里必须兜住:插件行的加载失败会让整行从 profile 里消失,而"挂不上技能"本来只是个降级。
|
|
69
69
|
// (v0.7.1 之前没兜:provider 一抛错 apply 就 reject,而且一行日志都没有——stub 实测复现过。)
|
|
70
70
|
try {
|
|
71
|
-
|
|
71
|
+
// 必须 await:provider 的 apply 是 Cordis 插件函数,允许返回 Promise。
|
|
72
|
+
// 不 await 时这里的 try/catch 只能拦住同步 throw,异步 reject 会变成
|
|
73
|
+
// unhandledRejection(Node >=15 默认让进程退出),"挂不上技能只是降级"就变成崩进程。
|
|
74
|
+
await applyFilesystemProvider(ctx, {
|
|
72
75
|
providerName: "video-studio",
|
|
73
76
|
includeDefaultRoots: false,
|
|
74
77
|
bundledSkillDir,
|
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: 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.",
|
|
3
|
+
"version": "0.8.1",
|
|
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 with word-level boundaries, deterministic PIL/browser rendering (16:9 landscape, 720p/1080p), programmatic SFX and score, cue-driven sound sync, ffmpeg encoding, sample-level mixing, batch production and multi-layer QA gates (preflight, full-film VMAF/SSIM, ASR readback).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
7
7
|
"exports": {
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"locale/*.json",
|
|
25
25
|
"docs/demo-pil-sheet.png",
|
|
26
26
|
"THIRD_PARTY_NOTICES.md",
|
|
27
|
+
"CHANGELOG.md",
|
|
27
28
|
"skills",
|
|
28
29
|
"!skills/**/__pycache__",
|
|
29
30
|
"!skills/**/*.pyc",
|
|
@@ -36,7 +37,8 @@
|
|
|
36
37
|
"tools/estimate.py",
|
|
37
38
|
"tools/ci_check.py",
|
|
38
39
|
"tools/audio_similarity.py",
|
|
39
|
-
"tools/selftest_noscipy.py"
|
|
40
|
+
"tools/selftest_noscipy.py",
|
|
41
|
+
"tools/golden_frames.py"
|
|
40
42
|
],
|
|
41
43
|
"publishConfig": {
|
|
42
44
|
"access": "public"
|
package/schemas/film.schema.json
CHANGED
|
@@ -76,12 +76,16 @@
|
|
|
76
76
|
"rate_range": {
|
|
77
77
|
"type": "array",
|
|
78
78
|
"description": "语速夹取区间(百分数,例如 [-15, 12])",
|
|
79
|
-
"items": {
|
|
79
|
+
"items": {
|
|
80
|
+
"type": "number"
|
|
81
|
+
}
|
|
80
82
|
},
|
|
81
83
|
"cps_band": {
|
|
82
84
|
"type": "array",
|
|
83
85
|
"description": "可接受的每秒字数区间(默认 [3.6, 5.6])",
|
|
84
|
-
"items": {
|
|
86
|
+
"items": {
|
|
87
|
+
"type": "number"
|
|
88
|
+
}
|
|
85
89
|
}
|
|
86
90
|
}
|
|
87
91
|
},
|
|
@@ -593,6 +597,162 @@
|
|
|
593
597
|
"description": "页面分块秒数(webengine 切块用,默认 30)"
|
|
594
598
|
}
|
|
595
599
|
}
|
|
600
|
+
},
|
|
601
|
+
"words": {
|
|
602
|
+
"type": "boolean",
|
|
603
|
+
"description": "v0.8 词级时间戳开关(默认 true)。true 时 --stage tts 会额外收 edge-tts 的 WordBoundary 事件落 work/words.json,字幕按词边界折行、cue 可用词锚点 l03:w2、QA 走 G10 门禁;false = 退回整句字幕(不影响出片)。"
|
|
604
|
+
},
|
|
605
|
+
"tts": {
|
|
606
|
+
"type": "object",
|
|
607
|
+
"additionalProperties": true,
|
|
608
|
+
"description": "v0.8 TTS 后端选择(接口化,默认 edge;其它后端需先 filmkit.register_tts_backend 注册)。",
|
|
609
|
+
"properties": {
|
|
610
|
+
"backend": {
|
|
611
|
+
"type": "string",
|
|
612
|
+
"description": "后端名,缺省 edge"
|
|
613
|
+
},
|
|
614
|
+
"voice": {
|
|
615
|
+
"type": [
|
|
616
|
+
"string",
|
|
617
|
+
"object"
|
|
618
|
+
],
|
|
619
|
+
"description": "覆盖顶层 voice"
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
},
|
|
623
|
+
"video": {
|
|
624
|
+
"type": "object",
|
|
625
|
+
"additionalProperties": true,
|
|
626
|
+
"description": "v0.8 画幅/帧率(**只支持 16:9 横屏**)。内部构图恒为 1920x1080,输出只能更小(编码时 lanczos 下采样);竖屏 / 非 16:9 / 上采样 / 非法 fps 会被 filmkit.video_plan 直接报错。",
|
|
627
|
+
"properties": {
|
|
628
|
+
"width": {
|
|
629
|
+
"type": "integer",
|
|
630
|
+
"enum": [
|
|
631
|
+
1920,
|
|
632
|
+
1280,
|
|
633
|
+
960,
|
|
634
|
+
2560
|
|
635
|
+
],
|
|
636
|
+
"description": "输出宽(16:9 横屏)"
|
|
637
|
+
},
|
|
638
|
+
"height": {
|
|
639
|
+
"type": "integer",
|
|
640
|
+
"enum": [
|
|
641
|
+
1080,
|
|
642
|
+
720,
|
|
643
|
+
540,
|
|
644
|
+
1440
|
|
645
|
+
],
|
|
646
|
+
"description": "输出高(16:9 横屏)"
|
|
647
|
+
},
|
|
648
|
+
"fps": {
|
|
649
|
+
"type": "integer",
|
|
650
|
+
"enum": [
|
|
651
|
+
24,
|
|
652
|
+
25,
|
|
653
|
+
30,
|
|
654
|
+
50,
|
|
655
|
+
60
|
|
656
|
+
],
|
|
657
|
+
"description": "帧率,缺省 30"
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
},
|
|
661
|
+
"qa": {
|
|
662
|
+
"type": "object",
|
|
663
|
+
"additionalProperties": true,
|
|
664
|
+
"description": "v0.8 质检门禁参数:全片 VMAF/SSIM(G11)与 ASR 回读(G12)。",
|
|
665
|
+
"properties": {
|
|
666
|
+
"vmaf": {
|
|
667
|
+
"type": "object",
|
|
668
|
+
"additionalProperties": true,
|
|
669
|
+
"description": "全片 VMAF/SSIM 门禁(参考帧由场景函数实时渲染,不是成片抽帧)。注意:本对象里的 enabled 与 qa.require_vmaf 是**惰性键**(v0.8 起草时留下,代码无读取点),真正生效的开关是 mode=off / --vmaf off;filmcheck.py 对惰性键会报 WARN。",
|
|
670
|
+
"properties": {
|
|
671
|
+
"enabled": {
|
|
672
|
+
"type": "boolean",
|
|
673
|
+
"description": "惰性键:写它不生效(要跳过 G11 请写 mode=\"off\" 或命令行 --vmaf off)"
|
|
674
|
+
},
|
|
675
|
+
"mode": {
|
|
676
|
+
"type": "string",
|
|
677
|
+
"enum": [
|
|
678
|
+
"full",
|
|
679
|
+
"sample",
|
|
680
|
+
"off"
|
|
681
|
+
],
|
|
682
|
+
"description": "full=逐帧(默认,约 1.2x 实时);sample=每 N 帧取 1;off=不跑"
|
|
683
|
+
},
|
|
684
|
+
"pass": {
|
|
685
|
+
"type": "number",
|
|
686
|
+
"minimum": 0,
|
|
687
|
+
"maximum": 100,
|
|
688
|
+
"description": "VMAF 低于此值 -> fail(默认 92,权威定义在 qavmaf.py 的 VMAF_PASS;标定依据见 references/v08-quality.md)"
|
|
689
|
+
},
|
|
690
|
+
"warn": {
|
|
691
|
+
"type": "number",
|
|
692
|
+
"minimum": 0,
|
|
693
|
+
"maximum": 100,
|
|
694
|
+
"description": "介于 pass 与 warn 之间 -> pass+warning(默认 96,权威定义在 qavmaf.py 的 VMAF_WARN)"
|
|
695
|
+
},
|
|
696
|
+
"sample_step": {
|
|
697
|
+
"type": "integer",
|
|
698
|
+
"minimum": 1,
|
|
699
|
+
"description": "mode=sample 时的抽样步长"
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
},
|
|
703
|
+
"ssim": {
|
|
704
|
+
"type": "object",
|
|
705
|
+
"additionalProperties": true,
|
|
706
|
+
"description": "SSIM 阈值(诊断项,不单独阻断;默认 pass=0.95 / warn=0.98,权威定义在 qavmaf.py)",
|
|
707
|
+
"properties": {
|
|
708
|
+
"enabled": {
|
|
709
|
+
"type": "boolean",
|
|
710
|
+
"description": "惰性键:写它不生效(SSIM 本来就只是诊断项,不单独阻断)"
|
|
711
|
+
},
|
|
712
|
+
"pass": {
|
|
713
|
+
"type": "number",
|
|
714
|
+
"minimum": 0,
|
|
715
|
+
"maximum": 1
|
|
716
|
+
},
|
|
717
|
+
"warn": {
|
|
718
|
+
"type": "number",
|
|
719
|
+
"minimum": 0,
|
|
720
|
+
"maximum": 1
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
},
|
|
724
|
+
"require_vmaf": {
|
|
725
|
+
"type": "boolean",
|
|
726
|
+
"description": "惰性键:写它不生效(要强制 G11 不许记 skipped,请用 --strict-gates)"
|
|
727
|
+
},
|
|
728
|
+
"asr": {
|
|
729
|
+
"type": "object",
|
|
730
|
+
"additionalProperties": true,
|
|
731
|
+
"description": "ASR 回读门禁(把成片音轨转回文字与剧本对账)",
|
|
732
|
+
"properties": {
|
|
733
|
+
"enabled": {
|
|
734
|
+
"type": "boolean",
|
|
735
|
+
"description": "false = 本次不做回读(记 skipped)"
|
|
736
|
+
},
|
|
737
|
+
"model": {
|
|
738
|
+
"type": "string",
|
|
739
|
+
"description": "faster-whisper 模型名,缺省 small"
|
|
740
|
+
},
|
|
741
|
+
"recall_pass": {
|
|
742
|
+
"type": "number",
|
|
743
|
+
"minimum": 0,
|
|
744
|
+
"maximum": 1,
|
|
745
|
+
"description": "召回率 >= 此值算干净(默认 0.85)"
|
|
746
|
+
},
|
|
747
|
+
"recall_warn": {
|
|
748
|
+
"type": "number",
|
|
749
|
+
"minimum": 0,
|
|
750
|
+
"maximum": 1,
|
|
751
|
+
"description": "低于此值 -> fail(默认 0.72)"
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
}
|
|
596
756
|
}
|
|
597
757
|
},
|
|
598
758
|
"additionalProperties": true
|