@dsh-gis/dsh-video-studio-skill 1.0.2 → 1.0.4

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 (51) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +84 -108
  3. package/THIRD_PARTY_NOTICES.md +2 -2
  4. package/package.json +1 -1
  5. package/schemas/design.schema.json +5 -5
  6. package/schemas/film.schema.json +31 -31
  7. package/skills/video-studio/SKILL.md +168 -268
  8. package/skills/video-studio/assets/film.json +2 -3
  9. package/skills/video-studio/assets/golden_frames.json +11 -11
  10. package/skills/video-studio/assets/scenes.py +92 -49
  11. package/skills/video-studio/references/{style-packs.md → appearance.md} +17 -15
  12. package/skills/video-studio/references/audio-variation.md +73 -96
  13. package/skills/video-studio/references/audio.md +40 -44
  14. package/skills/video-studio/references/change-impact.md +2 -2
  15. package/skills/video-studio/references/{v08-quality.md → delivery-gates.md} +9 -11
  16. package/skills/video-studio/references/frame-qa.md +47 -15
  17. package/skills/video-studio/references/pipeline.md +4 -4
  18. package/skills/video-studio/references/pitfalls.md +22 -3
  19. package/skills/video-studio/references/proposal.md +19 -36
  20. package/skills/video-studio/references/quality-gates.md +11 -11
  21. package/skills/video-studio/references/scene-authoring.md +2 -2
  22. package/skills/video-studio/references/scene-grammar.md +17 -24
  23. package/skills/video-studio/references/sfx-design.md +7 -5
  24. package/skills/video-studio/references/web-engine.md +7 -7
  25. package/skills/video-studio/references/word-timeline.md +7 -7
  26. package/skills/video-studio/requirements.txt +9 -13
  27. package/skills/video-studio/scripts/designkit.py +84 -89
  28. package/skills/video-studio/scripts/filmcheck.py +19 -19
  29. package/skills/video-studio/scripts/filmkit.py +2949 -2948
  30. package/skills/video-studio/scripts/gates.py +4 -4
  31. package/skills/video-studio/scripts/grammar.py +10 -10
  32. package/skills/video-studio/scripts/musicgen.py +3 -4
  33. package/skills/video-studio/scripts/preflight.py +5 -5
  34. package/skills/video-studio/scripts/previewkit.py +11 -12
  35. package/skills/video-studio/scripts/propose.py +11 -11
  36. package/skills/video-studio/scripts/qa_frames.py +34 -35
  37. package/skills/video-studio/scripts/qaasr.py +26 -7
  38. package/skills/video-studio/scripts/qavmaf.py +19 -19
  39. package/skills/video-studio/scripts/render.py +137 -141
  40. package/skills/video-studio/scripts/scorekit.py +21 -23
  41. package/skills/video-studio/scripts/selfcheck.py +208 -135
  42. package/skills/video-studio/scripts/sfxkit.py +27 -26
  43. package/skills/video-studio/scripts/stagewatch.py +4 -4
  44. package/skills/video-studio/scripts/stylekit.py +77 -282
  45. package/skills/video-studio/scripts/voicekit.py +43 -44
  46. package/skills/video-studio/scripts/webengine.py +62 -64
  47. package/tools/audio_similarity.py +12 -12
  48. package/tools/ci_check.py +16 -16
  49. package/tools/estimate.py +24 -25
  50. package/tools/golden_frames.py +17 -18
  51. package/tools/silhouette_qa.py +13 -14
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "style": {
25
25
  "type": "string",
26
- "description": "**已废弃(v1.0.1)**:不再有内置风格表,这个键不决定任何外观,写了也不生效(保留只为了让老剧本继续通过契约校验)。外观的唯一来源是 work/design.json(propose.py --confirm 冻结,渲染前由 designkit.design_to_plan 解析);没有设计就渲染会明确报错,而不是回落到某个默认风格。这里**故意不放 enum**:v1.0.1 起没有任何合法风格 id 可列,列一份清单只会误导 IDE 补全。"
26
+ "description": "**已废弃**:技能里没有内置风格表,这个键不决定任何外观,写了也不生效(保留只为了让老剧本继续通过契约校验)。外观的唯一来源是 work/design.json(propose.py --confirm 冻结,渲染前由 designkit.design_to_plan 解析);没有设计就渲染会明确报错,而不是回落到某个默认风格。这里**故意不放 enum**:没有任何合法风格 id 可列,列一份清单只会误导 IDE 补全。"
27
27
  },
28
28
  "engine": {
29
29
  "type": "string",
@@ -38,7 +38,7 @@
38
38
  "string",
39
39
  "object"
40
40
  ],
41
- "description": "字符串 = edge-tts voice id(如 zh-CN-YunxiNeural,legacy 单声线路径);对象 = v0.5 声线策略(map 按 kind 映射 persona、auto、jitter、max_distinct、rate_range、cps_band),此时忽略 rate/pitch 的单值覆盖语义",
41
+ "description": "字符串 = edge-tts voice id(如 zh-CN-YunxiNeural,legacy 单声线路径);对象 = 声线策略(map 按 kind 映射音色、auto、jitter、max_distinct、rate_range、cps_band),此时忽略 rate/pitch 的单值覆盖语义",
42
42
  "properties": {
43
43
  "map": {
44
44
  "type": "object",
@@ -243,7 +243,7 @@
243
243
  "chart",
244
244
  "outro"
245
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 键,改那边要同步这里"
246
+ "description": "视觉场景类型(可选):决定这段画面长成什么构图——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
247
  },
248
248
  "quote": {
249
249
  "type": "string",
@@ -402,12 +402,12 @@
402
402
  "lead": {
403
403
  "type": "number",
404
404
  "minimum": 0,
405
- "description": "全局句前留白(秒)。缺省取风格 pacing(v0.5 body 基准 0.62)"
405
+ "description": "全局句前留白(秒)。缺省取设计的 pacing(body 基准 0.62)"
406
406
  },
407
407
  "tail": {
408
408
  "type": "number",
409
409
  "minimum": 0,
410
- "description": "全局句后留白(秒)。缺省取风格 pacing(v0.5 body 基准 0.92)"
410
+ "description": "全局句后留白(秒)。缺省取设计的 pacing(body 基准 0.92)"
411
411
  },
412
412
  "min_dur": {
413
413
  "type": "number",
@@ -464,7 +464,7 @@
464
464
  },
465
465
  "whoosh": {
466
466
  "type": "boolean",
467
- "description": "v0.2 兼容:没有 cues.json 时每段开头一声 whoosh(默认 true)"
467
+ "description": "兼容行为:没有 cues.json 时每段开头一声 whoosh(默认 true)"
468
468
  },
469
469
  "whoosh_amp": {
470
470
  "type": "number",
@@ -510,7 +510,7 @@
510
510
  "visual": {
511
511
  "type": "object",
512
512
  "additionalProperties": true,
513
- "description": "视觉覆盖(v0.5):一般不用写,风格包已经决定;要锁主题/版式时才用",
513
+ "description": "视觉覆盖:一般不用写,设计已经决定;要锁主题/版式时才用",
514
514
  "properties": {
515
515
  "theme": {
516
516
  "type": "string",
@@ -529,7 +529,7 @@
529
529
  "music": {
530
530
  "type": "object",
531
531
  "additionalProperties": true,
532
- "description": "配乐:musicgen 按参数现场编排 / v0.2 和弦床 / 外部 wav / 关掉。不写 mode 时走兼容链(有 bpm 就生成,没有就沿用)。v1.0.1 起没有配乐风格表,不要指望选一个 id 得到一种现成配乐",
532
+ "description": "配乐:musicgen 按参数现场编排 / 和弦床 / 外部 wav / 关掉。不写 mode 时走兼容链(有 bpm 就生成,没有就沿用)。没有配乐风格表,不要指望选一个 id 得到一种现成配乐",
533
533
  "properties": {
534
534
  "enabled": {
535
535
  "type": "boolean",
@@ -543,11 +543,11 @@
543
543
  "file",
544
544
  "off"
545
545
  ],
546
- "description": "score = musicgen 参数化编排(bpm/key/scale/mood/sections 全可写);bed = v0.2 和弦床;file = 用外部 work/music.wav;off = 不要配乐(不读也不删 music.wav)"
546
+ "description": "score = musicgen 参数化编排(bpm/key/scale/mood/sections 全可写);bed = 和弦床;file = 用外部 work/music.wav;off = 不要配乐(不读也不删 music.wav)"
547
547
  },
548
548
  "style": {
549
549
  "type": "string",
550
- "description": "已废弃:v1.0.1 删除了配乐风格表,写风格 id 没有意义(保留字段只为老剧本校验不失败)"
550
+ "description": "已废弃:删除了配乐风格表,写风格 id 没有意义(保留字段只为老剧本校验不失败)"
551
551
  },
552
552
  "mood": {
553
553
  "type": "string",
@@ -576,59 +576,59 @@
576
576
  },
577
577
  "gain_db": {
578
578
  "type": "number",
579
- "description": "配乐总线增益 dB(v0.7.1 默认 -12:视频以旁白为主,背景必须明显低于人声;旧版 -1.5 会让背景与台词几乎等高)"
579
+ "description": "配乐总线增益 dB(默认 -12:视频以旁白为主,背景必须明显低于人声;-1.5 会让背景与台词几乎等高)"
580
580
  },
581
581
  "duck_db": {
582
582
  "type": "number",
583
- "description": "音效响起时配乐让位深度 dB(v0.7 默认按风格 3.0–5.5)"
583
+ "description": "音效响起时配乐让位深度 dB(默认按设计 3.0–5.5)"
584
584
  },
585
585
  "voice_duck_db": {
586
586
  "type": "number",
587
- "description": "v0.7.1:旁白说话时配乐额外让位深度 dB(默认 6;0 = 关闭旁白侧链)"
587
+ "description": "旁白说话时配乐额外让位深度 dB(默认 6;0 = 关闭旁白侧链)"
588
588
  },
589
589
  "voice_duck_sfx_db": {
590
590
  "type": "number",
591
- "description": "v0.7.1:旁白说话时音效额外让位深度 dB(默认 3;0 = 关闭)"
591
+ "description": "旁白说话时音效额外让位深度 dB(默认 3;0 = 关闭)"
592
592
  },
593
593
  "voice_thresh_db": {
594
594
  "type": "number",
595
- "description": "v0.7.1:语音活跃度阈值 dBFS(默认 -42;低于它算静音间隙,背景恢复)"
595
+ "description": "语音活跃度阈值 dBFS(默认 -42;低于它算静音间隙,背景恢复)"
596
596
  },
597
597
  "voice_floor_db": {
598
598
  "type": "number",
599
- "description": "v0.7.1:语音包络的地板 dBFS(默认 -60;与阈值之间做 0~1 映射)"
599
+ "description": "语音包络的地板 dBFS(默认 -60;与阈值之间做 0~1 映射)"
600
600
  },
601
601
  "guard_snr_db": {
602
602
  "type": "number",
603
- "description": "v0.7.1:旁白清晰度兜底(默认 12)。混音后实测人声活跃区的人声/背景响度差,不足就整体再压背景;0 = 关闭"
603
+ "description": "旁白清晰度兜底(默认 12)。混音后实测人声活跃区的人声/背景响度差,不足就整体再压背景;0 = 关闭"
604
604
  },
605
605
  "guard_cap_db": {
606
606
  "type": "number",
607
- "description": "v0.7.1:SNR 兜底最多补压多少 dB(默认 30,防止把背景压成忽有忽无;补压 >18 dB 会提示检查素材电平)"
607
+ "description": "SNR 兜底最多补压多少 dB(默认 30,防止把背景压成忽有忽无;补压 >18 dB 会提示检查素材电平)"
608
608
  },
609
609
  "seg": {
610
610
  "type": "number",
611
611
  "minimum": 0,
612
- "description": "v0.2 和弦床的段长秒数(默认 4.0)"
612
+ "description": "和弦床的段长秒数(默认 4.0)"
613
613
  },
614
614
  "amp": {
615
615
  "type": "number",
616
616
  "minimum": 0,
617
- "description": "v0.2 和弦床幅度(默认 0.055)"
617
+ "description": "和弦床幅度(默认 0.055)"
618
618
  },
619
619
  "gain": {
620
620
  "type": "number",
621
621
  "minimum": 0,
622
- "description": "v0.2 和弦床增益(默认 0.9)"
622
+ "description": "和弦床增益(默认 0.9)"
623
623
  },
624
624
  "xfade": {
625
625
  "type": "number",
626
626
  "minimum": 0,
627
- "description": "v0.2 和弦床交叉淡化秒数(默认 1.2)"
627
+ "description": "和弦床交叉淡化秒数(默认 1.2)"
628
628
  },
629
629
  "chords": {
630
630
  "type": "array",
631
- "description": "v0.2 兼容:和弦频率表 [[220, 261.63, 329.63], ...];只有 mode=bed/兼容链用得到",
631
+ "description": "兼容行为:和弦频率表 [[220, 261.63, 329.63], ...];只有 mode=bed/兼容链用得到",
632
632
  "items": {
633
633
  "type": "array",
634
634
  "items": {
@@ -670,11 +670,11 @@
670
670
  },
671
671
  "content_seed": {
672
672
  "type": "boolean",
673
- "description": "v0.7:true(默认)= 每条 cue 的 seed 由 style/content_fp 派生(不同影片同一位置也不同);false = 回到 v0.6 的 seed_base+i 位置派生(老片逐样本兼容)"
673
+ "description": "true(默认)= 每条 cue 的 seed 由 style/content_fp 派生(不同影片同一位置也不同);false = 按 seed_base+i 的位置派生(只跟 cue 顺序,逐样本稳定)"
674
674
  },
675
675
  "duck_transitions": {
676
676
  "type": "boolean",
677
- "description": "v0.7:true(默认)= 段落边界前 2.2s 内的 whoosh/riser/reverse_swell 自动 -3 dB,避免与配乐过门在同一频段撞车;false = 不处理"
677
+ "description": "true(默认)= 段落边界前 2.2s 内的 whoosh/riser/reverse_swell 自动 -3 dB,避免与配乐过门在同一频段撞车;false = 不处理"
678
678
  },
679
679
  "cues": {
680
680
  "type": "array",
@@ -756,12 +756,12 @@
756
756
  },
757
757
  "words": {
758
758
  "type": "boolean",
759
- "description": "v0.8 词级时间戳开关(默认 true)。true 时 --stage tts 会额外收 edge-tts 的 WordBoundary 事件落 work/words.json,字幕按词边界折行、cue 可用词锚点 l03:w2、QA 走 G10 门禁;false = 退回整句字幕(不影响出片)。"
759
+ "description": "词级时间戳开关(默认 true)。true 时 --stage tts 会额外收 edge-tts 的 WordBoundary 事件落 work/words.json,字幕按词边界折行、cue 可用词锚点 l03:w2、QA 走 G10 门禁;false = 退回整句字幕(不影响出片)。"
760
760
  },
761
761
  "tts": {
762
762
  "type": "object",
763
763
  "additionalProperties": true,
764
- "description": "v0.8 TTS 后端选择(接口化,默认 edge;其它后端需先 filmkit.register_tts_backend 注册)。",
764
+ "description": "TTS 后端选择(接口化,默认 edge;其它后端需先 filmkit.register_tts_backend 注册)。",
765
765
  "properties": {
766
766
  "backend": {
767
767
  "type": "string",
@@ -779,7 +779,7 @@
779
779
  "video": {
780
780
  "type": "object",
781
781
  "additionalProperties": true,
782
- "description": "v0.8 画幅/帧率(**只支持 16:9 横屏**)。内部构图恒为 1920x1080,输出只能更小(编码时 lanczos 下采样);竖屏 / 非 16:9 / 上采样 / 非法 fps 会被 filmkit.video_plan 直接报错。",
782
+ "description": "画幅/帧率(**只支持 16:9 横屏**)。内部构图恒为 1920x1080,输出只能更小(编码时 lanczos 下采样);竖屏 / 非 16:9 / 上采样 / 非法 fps 会被 filmkit.video_plan 直接报错。",
783
783
  "properties": {
784
784
  "width": {
785
785
  "type": "integer",
@@ -817,12 +817,12 @@
817
817
  "qa": {
818
818
  "type": "object",
819
819
  "additionalProperties": true,
820
- "description": "v0.8 质检门禁参数:全片 VMAF/SSIM(G11)与 ASR 回读(G12)。",
820
+ "description": "质检门禁参数:全片 VMAF/SSIM(G11)与 ASR 回读(G12)。",
821
821
  "properties": {
822
822
  "vmaf": {
823
823
  "type": "object",
824
824
  "additionalProperties": true,
825
- "description": "全片 VMAF/SSIM 门禁(参考帧由场景函数实时渲染,不是成片抽帧)。注意:本对象里的 enabled 与 qa.require_vmaf 是**惰性键**(v0.8 起草时留下,代码无读取点),真正生效的开关是 mode=off / --vmaf off;filmcheck.py 对惰性键会报 WARN。",
825
+ "description": "全片 VMAF/SSIM 门禁(参考帧由场景函数实时渲染,不是成片抽帧)。注意:本对象里的 enabled 与 qa.require_vmaf 是**惰性键**(代码无读取点),真正生效的开关是 mode=off / --vmaf off;filmcheck.py 对惰性键会报 WARN。",
826
826
  "properties": {
827
827
  "enabled": {
828
828
  "type": "boolean",
@@ -841,7 +841,7 @@
841
841
  "type": "number",
842
842
  "minimum": 0,
843
843
  "maximum": 100,
844
- "description": "VMAF 低于此值 -> fail(默认 92,权威定义在 qavmaf.py 的 VMAF_PASS;标定依据见 references/v08-quality.md)"
844
+ "description": "VMAF 低于此值 -> fail(默认 92,权威定义在 qavmaf.py 的 VMAF_PASS;标定依据见 references/delivery-gates.md)"
845
845
  },
846
846
  "warn": {
847
847
  "type": "number",