@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
@@ -23,18 +23,7 @@
23
23
  },
24
24
  "style": {
25
25
  "type": "string",
26
- "enum": [
27
- "auto",
28
- "tech-deep",
29
- "magazine",
30
- "paper",
31
- "vivid",
32
- "mono",
33
- "cinema",
34
- "lo-fi",
35
- "epic"
36
- ],
37
- "description": "风格包 id:一套决定画风+配乐+旁白+节奏。“auto”= 按内容自动选;不写这个键 = v0.4 legacy 行为(逐样本兼容)。枚举真值来自 stylekit.STYLES,新增风格时先改那边再改这里"
26
+ "description": "**已废弃(v1.0.1)**:不再有内置风格表,这个键不决定任何外观,写了也不生效(保留只为了让老剧本继续通过契约校验)。外观的唯一来源是 work/design.json(propose.py --confirm 冻结,渲染前由 designkit.design_to_plan 解析);没有设计就渲染会明确报错,而不是回落到某个默认风格。这里**故意不放 enum**:v1.0.1 起没有任何合法风格 id 可列,列一份清单只会误导 IDE 补全。"
38
27
  },
39
28
  "engine": {
40
29
  "type": "string",
@@ -239,6 +228,173 @@
239
228
  "voice": {
240
229
  "type": "string",
241
230
  "description": "显式 edge-tts voice id(覆盖 persona 底子)"
231
+ },
232
+ "type": {
233
+ "type": "string",
234
+ "enum": [
235
+ "hero",
236
+ "statement",
237
+ "list",
238
+ "stat",
239
+ "compare",
240
+ "process",
241
+ "quote",
242
+ "chapter",
243
+ "chart",
244
+ "outro"
245
+ ],
246
+ "description": "视觉场景类型(v0.9,可选):决定这段画面长成什么构图——hero 封面 / statement 金句 / list 要点列表 / stat 数字卡 / compare 左右对比 / process 流程轴 / quote 引语 / chapter 章节卡 / chart 数据条 / outro 收尾。与 kind **正交**:kind 管声线、语气、配乐能量,type 只管构图,所以没有新增 kind 值;不写 = 由 grammar.py 按内容自动推导(写错值 filmcheck.py 会报 error)。枚举真值来自 grammar.SCENE_TYPES 与 assets/scenes.py 的 _DRAWERS 键,改那边要同步这里"
247
+ },
248
+ "quote": {
249
+ "type": "string",
250
+ "description": "引语原文(type=quote 时用):打在屏幕上的引文。它和 text 是两件事——text 是 TTS 念的那句,quote 是画面上那句话本身"
251
+ },
252
+ "by": {
253
+ "type": "string",
254
+ "description": "引语出处/作者(type=quote 时用),如“—— 某本书 · 某作者”;与 quote 配套,缺省不画署名"
255
+ },
256
+ "stats": {
257
+ "type": "array",
258
+ "description": "数字卡原料(type=stat):每项 {value, unit, label, note}。value 必填(数字或字符串,字符串用于“>3x”“1/2”这类写法);unit 是单位后缀,label 是指标名,note 是小字补充",
259
+ "items": {
260
+ "type": "object",
261
+ "required": [
262
+ "value"
263
+ ],
264
+ "additionalProperties": true,
265
+ "properties": {
266
+ "value": {
267
+ "type": [
268
+ "number",
269
+ "string"
270
+ ],
271
+ "description": "数字主体(必填):数字,或“>3x”“1/2”这类字符串写法"
272
+ },
273
+ "unit": {
274
+ "type": "string",
275
+ "description": "单位/后缀,如“秒”“%”“fps”"
276
+ },
277
+ "label": {
278
+ "type": "string",
279
+ "description": "指标名,如“帧率”"
280
+ },
281
+ "note": {
282
+ "type": "string",
283
+ "description": "补充说明(小字),可省略"
284
+ }
285
+ }
286
+ }
287
+ },
288
+ "series": {
289
+ "type": "array",
290
+ "description": "数据条原料(type=chart):每项 {label, value, unit}。label 是条形名(必填),value 是条长(必填,数字或数值字符串)",
291
+ "items": {
292
+ "type": "object",
293
+ "required": [
294
+ "label",
295
+ "value"
296
+ ],
297
+ "additionalProperties": true,
298
+ "properties": {
299
+ "label": {
300
+ "type": "string",
301
+ "description": "条形名(必填)"
302
+ },
303
+ "value": {
304
+ "type": [
305
+ "number",
306
+ "string"
307
+ ],
308
+ "description": "条长(必填):数字或数值字符串(“0.8”“80%”由绘制器解析)"
309
+ },
310
+ "unit": {
311
+ "type": "string",
312
+ "description": "单位/后缀,如“GB”“%”"
313
+ }
314
+ }
315
+ }
316
+ },
317
+ "steps": {
318
+ "type": "array",
319
+ "description": "流程轴原料(type=process):每项 {label, note},数组顺序即节点顺序",
320
+ "items": {
321
+ "type": "object",
322
+ "required": [
323
+ "label"
324
+ ],
325
+ "additionalProperties": true,
326
+ "properties": {
327
+ "label": {
328
+ "type": "string",
329
+ "description": "节点名(必填)"
330
+ },
331
+ "note": {
332
+ "type": "string",
333
+ "description": "节点补充说明(小字),可省略"
334
+ }
335
+ }
336
+ }
337
+ },
338
+ "sides": {
339
+ "type": "object",
340
+ "additionalProperties": true,
341
+ "description": "左右对比原料(type=compare):{left, right},每侧 {head, items[]};items 里每项可写字符串,也可写对象 {text}(两种都认:短条目直接写字符串更省事)",
342
+ "properties": {
343
+ "left": {
344
+ "type": "object",
345
+ "additionalProperties": true,
346
+ "description": "左侧",
347
+ "properties": {
348
+ "head": {
349
+ "type": "string",
350
+ "description": "左侧小标题"
351
+ },
352
+ "items": {
353
+ "type": "array",
354
+ "description": "左侧条目:字符串或对象 {text} 两种写法都行",
355
+ "items": {
356
+ "type": [
357
+ "string",
358
+ "object"
359
+ ],
360
+ "properties": {
361
+ "text": {
362
+ "type": "string",
363
+ "description": "条目文字(写对象时用它;写字符串时字符串本身就是文字)"
364
+ }
365
+ }
366
+ }
367
+ }
368
+ }
369
+ },
370
+ "right": {
371
+ "type": "object",
372
+ "additionalProperties": true,
373
+ "description": "右侧",
374
+ "properties": {
375
+ "head": {
376
+ "type": "string",
377
+ "description": "右侧小标题"
378
+ },
379
+ "items": {
380
+ "type": "array",
381
+ "description": "右侧条目:字符串或对象 {text} 两种写法都行",
382
+ "items": {
383
+ "type": [
384
+ "string",
385
+ "object"
386
+ ],
387
+ "properties": {
388
+ "text": {
389
+ "type": "string",
390
+ "description": "条目文字(写对象时用它;写字符串时字符串本身就是文字)"
391
+ }
392
+ }
393
+ }
394
+ }
395
+ }
396
+ }
397
+ }
242
398
  }
243
399
  }
244
400
  }
@@ -373,7 +529,7 @@
373
529
  "music": {
374
530
  "type": "object",
375
531
  "additionalProperties": true,
376
- "description": "配乐:scorekit 程序化生成 / v0.2 和弦床 / 外部 wav / 关掉。不写 mode 时走 v0.2 兼容链(有 bpm 就生成,没有就沿用)",
532
+ "description": "配乐:musicgen 按参数现场编排 / v0.2 和弦床 / 外部 wav / 关掉。不写 mode 时走兼容链(有 bpm 就生成,没有就沿用)。v1.0.1 起没有配乐风格表,不要指望选一个 id 得到一种现成配乐",
377
533
  "properties": {
378
534
  "enabled": {
379
535
  "type": "boolean",
@@ -387,11 +543,11 @@
387
543
  "file",
388
544
  "off"
389
545
  ],
390
- "description": "score = scorekit 程序化配乐;bed = v0.2 和弦床;file = 用外部 work/music.wav;off = 不要配乐(不读也不删 music.wav)"
546
+ "description": "score = musicgen 参数化编排(bpm/key/scale/mood/sections 全可写);bed = v0.2 和弦床;file = 用外部 work/music.wav;off = 不要配乐(不读也不删 music.wav)"
391
547
  },
392
548
  "style": {
393
549
  "type": "string",
394
- "description": "\"auto\" 或风格 id:配乐风格(缺省跟随全片 style)"
550
+ "description": "已废弃:v1.0.1 删除了配乐风格表,写风格 id 没有意义(保留字段只为老剧本校验不失败)"
395
551
  },
396
552
  "mood": {
397
553
  "type": "string",
@@ -0,0 +1,133 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://github.com/znlgis/dsh-video-studio-skill/schemas/proposal.schema.json",
4
+ "title": "video-studio proposal(v1.0 提案)",
5
+ "description": "work/proposal.json:一次提案的 N 个候选 + 用户确认状态。status=confirmed 才允许出片。",
6
+ "type": "object",
7
+ "required": [
8
+ "schema",
9
+ "rev",
10
+ "status",
11
+ "candidates"
12
+ ],
13
+ "additionalProperties": true,
14
+ "properties": {
15
+ "schema": {
16
+ "type": "integer",
17
+ "const": 1
18
+ },
19
+ "rev": {
20
+ "type": "integer",
21
+ "minimum": 1
22
+ },
23
+ "parentRev": {
24
+ "type": [
25
+ "integer",
26
+ "null"
27
+ ]
28
+ },
29
+ "at": {
30
+ "type": "string"
31
+ },
32
+ "status": {
33
+ "type": "string",
34
+ "enum": [
35
+ "draft",
36
+ "confirmed",
37
+ "rejected"
38
+ ]
39
+ },
40
+ "chosen": {
41
+ "type": [
42
+ "string",
43
+ "null"
44
+ ],
45
+ "description": "confirmed 时必填的候选 id"
46
+ },
47
+ "confirmedAt": {
48
+ "type": "string"
49
+ },
50
+ "confirmedBy": {
51
+ "type": "string"
52
+ },
53
+ "confirmNote": {
54
+ "type": "string"
55
+ },
56
+ "designHash": {
57
+ "type": "string",
58
+ "description": "确认时 design.json 的指纹(用于判 stale)"
59
+ },
60
+ "brief": {
61
+ "type": "object"
62
+ },
63
+ "feedback": {
64
+ "type": "string"
65
+ },
66
+ "seed": {},
67
+ "wall_s": {
68
+ "type": "number"
69
+ },
70
+ "candidates": {
71
+ "type": "array",
72
+ "minItems": 2,
73
+ "items": {
74
+ "type": "object",
75
+ "required": [
76
+ "id",
77
+ "design",
78
+ "design_fp"
79
+ ],
80
+ "properties": {
81
+ "id": {
82
+ "type": "string",
83
+ "pattern": "^[A-H][0-9]*$"
84
+ },
85
+ "label": {
86
+ "type": "string"
87
+ },
88
+ "pitch": {
89
+ "type": "string"
90
+ },
91
+ "design": {
92
+ "type": "object"
93
+ },
94
+ "design_fp": {
95
+ "type": "string"
96
+ },
97
+ "preview": {
98
+ "type": "object"
99
+ },
100
+ "cost": {
101
+ "type": "object"
102
+ },
103
+ "diversity": {
104
+ "type": [
105
+ "object",
106
+ "null"
107
+ ]
108
+ }
109
+ }
110
+ }
111
+ }
112
+ },
113
+ "allOf": [
114
+ {
115
+ "if": {
116
+ "properties": {
117
+ "status": {
118
+ "const": "confirmed"
119
+ }
120
+ },
121
+ "required": [
122
+ "status"
123
+ ]
124
+ },
125
+ "then": {
126
+ "required": [
127
+ "chosen",
128
+ "designHash"
129
+ ]
130
+ }
131
+ }
132
+ ]
133
+ }