@dsh-gis/dsh-video-studio-skill 0.8.1 → 1.0.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +582 -0
  2. package/README.md +287 -304
  3. package/THIRD_PARTY_NOTICES.md +1 -1
  4. package/package.json +11 -10
  5. package/schemas/design.schema.json +722 -0
  6. package/schemas/film.schema.json +171 -15
  7. package/schemas/proposal.schema.json +133 -0
  8. package/skills/video-studio/SKILL.md +1316 -1066
  9. package/skills/video-studio/assets/design_fixture.json +141 -0
  10. package/skills/video-studio/assets/film.json +1 -2
  11. package/skills/video-studio/assets/golden_frames.json +12 -9
  12. package/skills/video-studio/assets/scenes.py +2207 -1190
  13. package/skills/video-studio/assets/voice_loudness.json +16 -0
  14. package/skills/video-studio/references/audio-variation.md +15 -11
  15. package/skills/video-studio/references/audio.md +36 -34
  16. package/skills/video-studio/references/change-impact.md +3 -3
  17. package/skills/video-studio/references/frame-qa.md +2 -2
  18. package/skills/video-studio/references/proposal.md +177 -0
  19. package/skills/video-studio/references/quality-gates.md +2 -2
  20. package/skills/video-studio/references/scene-grammar.md +311 -0
  21. package/skills/video-studio/references/sfx-design.md +1 -1
  22. package/skills/video-studio/references/style-packs.md +107 -168
  23. package/skills/video-studio/references/v08-quality.md +8 -8
  24. package/skills/video-studio/references/web-engine.md +1 -1
  25. package/skills/video-studio/references/word-timeline.md +2 -2
  26. package/skills/video-studio/scripts/designkit.py +2120 -0
  27. package/skills/video-studio/scripts/filmcheck.py +104 -33
  28. package/skills/video-studio/scripts/filmkit.py +153 -78
  29. package/skills/video-studio/scripts/grammar.py +619 -0
  30. package/skills/video-studio/scripts/musicgen.py +2043 -0
  31. package/skills/video-studio/scripts/preflight.py +10 -3
  32. package/skills/video-studio/scripts/previewkit.py +849 -0
  33. package/skills/video-studio/scripts/propose.py +825 -0
  34. package/skills/video-studio/scripts/qa_frames.py +45 -10
  35. package/skills/video-studio/scripts/qavmaf.py +77 -11
  36. package/skills/video-studio/scripts/render.py +505 -142
  37. package/skills/video-studio/scripts/scorekit.py +50 -1748
  38. package/skills/video-studio/scripts/selfcheck.py +851 -115
  39. package/skills/video-studio/scripts/stagewatch.py +21 -5
  40. package/skills/video-studio/scripts/stylekit.py +293 -570
  41. package/skills/video-studio/scripts/voicekit.py +502 -380
  42. package/skills/video-studio/scripts/webengine.py +15 -14
  43. package/tools/audio_similarity.py +57 -30
  44. package/tools/ci_check.py +9 -1
  45. package/tools/estimate.py +14 -8
  46. package/tools/golden_frames.py +56 -11
  47. package/tools/silhouette_qa.py +1263 -0
  48. package/docs/demo-pil-sheet.png +0 -0
  49. package/docs/styles/demo-results.json +0 -76
  50. package/docs/styles/sheet-8-styles.png +0 -0
  51. package/docs/styles/sheet-ai.png +0 -0
  52. package/docs/styles/sheet-craft.png +0 -0
  53. package/docs/styles/sheet-night.png +0 -0
  54. package/skills/video-studio/assets/score_demo.json +0 -307
@@ -80,7 +80,7 @@ python preflight.py --script film.json --work work --engine pil --json
80
80
 
81
81
  ### 2.3 阈值 92 / 96 是怎么来的(**只有一份权威定义**)
82
82
 
83
- 判据来自 qavmaf 作者对**同一部模板片**(参考帧含字幕与片头片尾淡入淡出)的三组实测:
83
+ 判据来自 qavmaf 作者对**同一部示例片**(参考帧含字幕与片头片尾淡入淡出)的三组实测:
84
84
  crf17 → **97.24**(pass)、crf30 → **95.74**(pass + warning)、二次编码 + 缩放坏片 → **29.45**(fail)。
85
85
 
86
86
  **阈值只有一份**:权威定义是 `qavmaf.py` 的 `VMAF_PASS=92.0` / `VMAF_WARN=96.0`
@@ -124,7 +124,7 @@ qavmaf 会在报告里打 warning 提醒这一点,但**不因此改判**——
124
124
 
125
125
  | 项 | 实测 |
126
126
  |---|---|
127
- | 29.011 s 模板片全片(870 帧,1080p 交付) | **14.2 s**(同机负载高时同一份代码测到过 28.8 s,见下"成本口径") |
127
+ | 29.011 s 示例片全片(870 帧,1080p 交付) | **14.2 s**(同机负载高时同一份代码测到过 28.8 s,见下"成本口径") |
128
128
  | 720p@24 交付(696 帧) | **7.2 s**(帧数少 + libvmaf 比较分辨率低) |
129
129
  | 分项吞吐 | 参考帧渲染受 ffmpeg 消费速度限制;libvmaf threads=min(8, CPU) 时约 124–160 帧/秒(threads=0 只有约 20 帧/秒) |
130
130
  | 抽样模式 | `--vmaf sample`(每 5 帧取 1)实测 8.0 s 跑完 184 帧,VMAF 与全片差 0.34 分 |
@@ -136,7 +136,7 @@ qavmaf 会在报告里打 warning 提醒这一点,但**不因此改判**——
136
136
  所以这里只写"这一跑"的数,不写承诺。纯 libvmaf 比较(参考帧已就绪)约 1.2× 实时——
137
137
  **别把"纯比较的 1.2×"当成端到端成本**。
138
138
 
139
- **v0.8 之后 qa 比渲染还贵**:29 s 模板片 `--stage all --cost` 实测总 **47.3 s**,
139
+ **v0.8 之后 qa 比渲染还贵**:29 s 示例片 `--stage all --cost` 实测总 **47.3 s**,
140
140
  其中 `frames` 12.5 s、`qa` 23.9 s(VMAF 14.2 + ASR 8.7 + 其余);v0.7 的全链约 28 s。
141
141
  决策影响:**批量出片的瓶颈从渲染转到质检**——想压回渲染量级就 `--vmaf off` 或 `--vmaf sample`。
142
142
 
@@ -188,13 +188,13 @@ v0.7 及以前的质检只看"容器 / 响度 / 帧 / 音画同步",都建立
188
188
 
189
189
  ### 3.4 为什么默认线是 0.85 而不是 0.95
190
190
 
191
- 实测(29 s 模板片,含 "DeepSeek 4.1 Flash / DeepSeek Harness" 这类中英混排专名):
191
+ 实测(29 s 示例片,含 "DeepSeek 4.1 Flash / DeepSeek Harness" 这类中英混排专名):
192
192
 
193
193
  | 场景 | 召回 |
194
194
  |---|---|
195
- | 干净模板片 1080p(4 段全对上、缺句 0) | **0.803** |
196
- | 干净模板片 720p@24(同剧本) | **0.853** |
197
- | 干净模板片(另一轮) | **0.811 – 0.828** |
195
+ | 干净示例片 1080p(4 段全对上、缺句 0) | **0.803** |
196
+ | 干净示例片 720p@24(同剧本) | **0.853** |
197
+ | 干净示例片(另一轮) | **0.811 – 0.828** |
198
198
  | 丢句反证:把 l03 从音轨剪掉、timeline 仍写 3 句 | **0.677**(`missing_lines=["l03"]`、gate=fail、exit 1) |
199
199
 
200
200
  0.803–0.853 不是流水线坏了,是 ASR 对中英混排专名的正常误差——实测把 "DeepSeek 4.1 Flash"
@@ -203,7 +203,7 @@ v0.7 及以前的质检只看"容器 / 响度 / 帧 / 音画同步",都建立
203
203
 
204
204
  - **< 0.72 才说明"整句丢了 / 音轨跟剧本不是一套"**——这是真正要阻断的;
205
205
  - 0.72–0.85 给 warning:仍然出片,但提示可能是缓存串了;
206
- - **≥ 0.95 会把干净的模板片判成 fail**,所以不能拿短测试片的 0.985(19.87 s 纯中文素材,
206
+ - **≥ 0.95 会把干净的示例片判成 fail**,所以不能拿短测试片的 0.985(19.87 s 纯中文素材,
207
207
  没有专名)当默认线。
208
208
 
209
209
  ### 3.5 实测耗时
@@ -164,7 +164,7 @@ PNG 截图比 JPEG q94 慢但无压缩伪影,本模块按契约固定 PNG。
164
164
 
165
165
  ## 10. 和别的模块怎么接
166
166
 
167
- - **配乐 / 音效**:webengine.py cues 输出 work/cues.json(§4.2),scorekit/sfxkit 按 t 对齐;
167
+ - **配乐 / 音效**:webengine.py cues 输出 work/cues.json(§4.2),musicgen / sfxkit 按 t 对齐;
168
168
  页面 cue 的 type 用 sfxkit 配方名(ui_blip / whoosh / impact / data_chirp ...)。
169
169
  - **音画同步质检**:页面 S.event 登记的视觉事件进 work/cues.json 的 events,qa_frames.sync_check 用。
170
170
  - **合成成片**:webengine 只出无声画面;配音/配乐/混音由 filmkit 音频总线和 render.py 的 mux 阶段负责。
@@ -97,13 +97,13 @@ G10 会因此记 `skipped` 或 `fail`(看是全部为空还是个别句为空
97
97
  ### 4.1 词间有 0.1–0.3 s 的空隙
98
98
 
99
99
  edge-tts 的 WordBoundary 只覆盖"发音区间",相邻词之间的停顿**不在任何事件里**。
100
- 所以 `covered = Σ dur` 永远小于句长。模板片实测 4 句 64 词,覆盖率约 0.7 量级。
100
+ 所以 `covered = Σ dur` 永远小于句长。示例片实测 4 句 64 词,覆盖率约 0.7 量级。
101
101
  **判据不能写 `covered == dur`**——G10 的覆盖率下限是 **45%**(低于它才是"明显少了")。
102
102
 
103
103
  ### 4.2 句尾静音不在事件里(约 0.5 s)
104
104
 
105
105
  排轴用的是**整句实测时长**,不是词时长求和。G10 只检查"末词终点离句尾不超过 **0.40 s**"
106
- (模板片实测 0.09 s)。这条超过 0.40 s,通常不是"片子坏了",而是词事件本身整体错位了。
106
+ (示例片实测 0.09 s)。这条超过 0.40 s,通常不是"片子坏了",而是词事件本身整体错位了。
107
107
 
108
108
  ### 4.3 裁剪会让词整体提前(`words_shift`)
109
109