Install any skill in seconds. Free to start, no credit card required.
Get Started Free →合成视频解说最终成片:把旁白音频铺到源视频上,按旁白窗口压低原声,生成 SRT / ASS 字幕并可烧录, 最后做响度标准化。作为最终合成阶段使用。输入源视频、tts_meta.json 与旁白位置; 输出 recap 成片和字幕。触发词:视频合成、混音、字幕、压字幕、assemble video、mux、ducking、subtitles、成片。
.claude/skills/worldwonderer-video-assemble/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | -48% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -28% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 117% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -10% | 0% |
本技能负责最终合成:
subtitles.srt;默认同时生成并烧录 subtitles.ass,--no-burn-subtitles 可关闭。合成阶段只实现创作决定,不凭空制造决定。Agent 在写旁白位置前,已在 visual_audio_board.json 为每个 beat 指定 audio_owner:
original_dialogueaction_soundambience / musicsilencenarration因此,旁白间隙是主动选择,不是必须填满的空白。不要为了“更满”而加入通用 BGM、压住必须听见的台词或消除有意义的沉默。
当前渲染器不解析 visual_audio_board.json;Agent 通过旁白时间、overlaps_speech、原声留白与现有混音参数落实这些决定。
<video>:源视频;cut 模式下为 edited_source.mp4。work_dir/tts_meta.json:配音阶段写出的 {segments: [...]}。每段包含 audio_path、时间、pause_after_ms、overlaps_speech 和用于混音/字幕的位置。下面的 scripts/... 均相对于本技能目录。若执行器从仓库根目录启动,请给脚本路径加上本技能的绝对目录。脚本不从其他技能目录读取文件;外部输入仅限命令显式传入的视频、参数与 work_dir 产物。
bashpython3 scripts/assemble.py <video> --work-dir <work_dir> \ [--recap-stem <name>] [--output-dir <dir>] [--no-burn-subtitles] \ [--subtitle-y-top <inclusive-y> --subtitle-y-bot <exclusive-y>] \ [--source-video <orig.mp4>] [--export-jianying [--jianying-out <dir>]]
recap_<stem>.mp4:稳定的最终输出别名;每次运行覆盖更新。work_dir/output.mp4:工作目录内成片。subtitles.srt:旁白字幕;烧录时另有 subtitles.ass。timeline.json:后端无关的多轨模型,包含视频、原声、旁白、BGM、字幕和 ducking 自动化。_placed_*.wav:实际写入主混音的完整逐段旁白 PCM;时间线与剪映只引用这些文件。assembly_manifest.json:输入来源、cut 来源指纹、渲染设置与最终输出路径。assembly_qc.json:旁白完整性、原声句末交接、时间线素材时长与交付质量的发布门禁。--export-jianying 时生成,包含 draft_content.json、draft_info.json 与 draft_meta_info.json。no_safe_fit。每段 _placed_*.wav必须与序列化后的时间线区间等长或更短,否则 timeline_audio_mismatch 阻断。
pause_start,只在实测停顿内渐强,于 source_restore_at 回满;无后续锚点时保持压低到时间线末端,而不是放出半句。
--export-jianying / EXPORT_JIANYING=1 可把 timeline.json 导出为可编辑草稿。cut 模式应传 --source-video <orig>,让草稿引用真实原片区间。Resources/local/{video,audio,image},保持草稿可搬迁;--jianying-no-bundle-media 只适合原路径始终可访问的情况。SUBTITLE_FONT_SIZE、SUBTITLE_MARGIN_V、SUBTITLE_MAX_CHARS 等控制。SUBTITLE_Y_TOP/BOT 把 ASS 基线放到测得的原片字幕区域,坐标为半开 [top, bot);显式遮罩策略下默认 SUBTITLE_MASK_OPACITY=0.6,SOURCE_SUBTITLE_MASK_TIMING=narration。IDLE_ORIG_VOLUME,旁白下压到 SPEECH_DUCKING_VOLUME;DUCK_FADE_SECONDS 控制过渡。还可配置 DUCKING_MODE、ZONE_DUCKING_VOLUME、FINAL_LOUDNORM 与 TARGET_LUFS。BGM_PATH 指定 BGM;它会循环到成片长度,并按 BGM_VOLUME / BGM_DUCKING_VOLUME 混音。不要在没有创作依据时设置通用 BGM。subtitles / libass 的 ffmpeg;合成阶段会预检并在缺失时明确失败。original_subtitles.json;否则保守映射 ASR。只有遮罩覆盖留白或用户字幕明确要求替换时才烧录原声对白,并用 「」 与旁白区分。| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 27,427 | 6,174 | -77% | 1 | 1 | 0% | 5,056 | 1,936 | -62% | 0 | 0 | — |
case-02 | fail→pass | 32,135 | 8,902 | -72% | 1 | 1 | 0% | 5,935 | 3,090 | -48% | 0 | 0 | — |
case-03 | fail→pass | 24,443 | 8,704 | -64% | 1 | 1 | 0% | 4,129 | 2,989 | -28% | 0 | 0 | — |
case-04 | fail→pass | 5,630 | 1,979 | -65% | 1 | 1 | 0% | 842 | 1,828 | +117% | 0 | 0 | — |
case-05 | fail→pass | 12,581 | 3,281 | -74% | 1 | 1 | 0% | 1,896 | 2,098 | +11% | 0 | 0 | — |
case-06 | fail→pass | 14,881 | 3,749 | -75% | 1 | 1 | 0% | 2,459 | 2,209 | -10% | 0 | 0 | — |
case-07 | fail→pass | 16,684 | 5,200 | -69% | 1 | 1 | 0% | 2,493 | 2,437 | -2% | 0 | 0 | — |
case-08 | fail→pass | 12,064 | 3,434 | -72% | 1 | 1 | 0% | 1,796 | 2,102 | +17% | 0 | 0 | — |
case-09 | fail→pass | 17,689 | 5,855 | -67% | 1 | 1 | 0% | 2,310 | 2,418 | +5% | 0 | 0 | — |
case-10 | pass→pass | 11,706 | 4,498 | -62% | 1 | 1 | 0% | 1,723 | 2,235 | +30% | 0 | 0 | — |
case-11 | pass→pass | 14,854 | 4,010 | -73% | 1 | 1 | 0% | 1,991 | 2,152 | +8% | 0 | 0 | — |
case-12 | pass→pass | 14,570 | 4,027 | -72% | 1 | 1 | 0% | 2,014 | 2,184 | +8% | 0 | 0 | — |
case-13 | fail→pass | 13,733 | 2,369 | -83% | 1 | 1 | 0% | 2,008 | 1,858 | -7% | 0 | 0 | — |
case-14 | fail→fail | 12,956 | 2,382 | -82% | 1 | 1 | 0% | 1,966 | 1,901 | -3% | 0 | 0 | — |
case-15 | pass→pass | 15,294 | 4,256 | -72% | 1 | 1 | 0% | 2,118 | 2,216 | +5% | 0 | 0 | — |
case-16 | fail→pass | 19,767 | 11,113 | -44% | 1 | 1 | 0% | 2,991 | 3,330 | +11% | 0 | 0 | — |
case-17 | fail→pass | 11,248 | 3,804 | -66% | 1 | 1 | 0% | 1,575 | 2,183 | +39% | 0 | 0 | — |
case-18 | pass→pass | 17,058 | 4,878 | -71% | 1 | 1 | 0% | 2,446 | 2,239 | -8% | 0 | 0 | — |
case-19 | fail→pass | 17,172 | 2,764 | -84% | 1 | 1 | 0% | 2,480 | 1,981 | -20% | 0 | 0 | — |
case-20 | fail→pass | 14,754 | 4,835 | -67% | 1 | 1 | 0% | 2,611 | 2,210 | -15% | 0 | 0 | — |
case-21 | fail→pass | 13,947 | 8,597 | -38% | 1 | 1 | 0% | 1,931 | 2,832 | +47% | 0 | 0 | — |
case-22 | fail→pass | 8,863 | 5,408 | -39% | 1 | 1 | 0% | 1,199 | 2,363 | +97% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +68 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.