video-assemble
@worldwonderer · 收录于 1 周前
Assemble a final recap video: mux narration audio over the source video, duck the original audio under the narration, render subtitles (SRT/ASS, optionally burned in), and loudness- normalize. Use as the last stage of the video-recap bundle. Consumes the source video + tts_meta.json (+ narration placement); produces recap_<name>.mp4 + subtitles.srt/.ass. 触发词: 视频合成, 混音, 字幕, 压字幕, assemble video, mux, ducking, subtitles, 成片.
适合你,如果需要在视频上叠加旁白并生成字幕
/ 下载安装
用别的 agent?下载 .zip 解压,把文件夹放进它的技能目录
Claude Code
~/.claude/skills/(项目级 .claude/skills/)Codex CLI
~/.codex/skills/Cursor自动读取上面两处目录
其他工具见其文档的「skills」目录;两个下载是同一份文件,只是名字不同
/ 通过 npx 安装 校验哈希
npx oh-my-skill add worldwonderer/video-recap-skills/video-assemble/ 通过 bash 安装
curl -fsSL https://oh-my-skill.com/install.sh | bash -s -- worldwonderer/video-recap-skills/video-assemble/ 已经装过?验证本机副本,不用重装
npx oh-my-skill verify worldwonderer/video-recap-skills/video-assemble安装目标可用 --agent / --scope 或 --to 明确指定;省略时只会在唯一已存在的 agent 目录上自动选择,零命中或多命中会停止并提示。content_hash 缺失或不一致均拒装。
377GitHub stars
~1.2K最小装载
~18.4K含声明引用
~31.3K文本包总量
镜像托管
怎么用
技能原文 SKILL.md
What this does
- Mixes the narration audio segments onto the source video at their placed times.
- Ducks the original audio under narration (fixed / sidechain / zone modes).
- Renders subtitles from the narration placement →
subtitles.srt(+subtitles.asswhen burning, which is on by default;--no-burn-subtitlesto disable). - Optional final loudness normalization to a target LUFS.
Input contract
<video>— the source video (the original, oredited_source.mp4in cut mode).work_dir/tts_meta.json—{segments: [...]}from video-voiceover (each segment carriesaudio_path, timing,pause_after_ms, andoverlaps_speech/placement used for ducking + subtitles).
Running the scripts below — thescripts/…paths are relative to this skill's own directory (the folder containing thisSKILL.md). Claude Code runs commands from there, so they work as written. If your harness runs commands from the project root instead (opencode / Codex / OpenClaw commonly do), prefix this skill's absolute directory — e.g.<skill-dir>/scripts/…, using the directory your harness reports when it loads the skill. The scripts self-locate from their own path, so once started by the correct path they resolve their sibling skills and assets regardless of the working directory.
Run
python3 scripts/assemble.py <video> --work-dir <work_dir> \ [--recap-stem <name>] [--output-dir <dir>] [--no-burn-subtitles] [--source-video <orig.mp4>] [--export-jianying [--jianying-out <dir>]]
Output contract
recap_<stem>.mp4— the final recap video (written to--output-dirorwork_dir's parent). It is the stable output alias, overwritten in place on every run so iterating on the narration refreshes the same file.work_dir/output.mp4— the in-place render.subtitles.srt— narration subtitles;subtitles.asswhen burning subtitles (on by default).timeline.json— backend-neutral multi-track model (video / original-audio / narration / BGM / subtitle tracks with ducking automation). Always written.assembly_manifest.json— a slim render record: the input/source paths, the cut-mode source fingerprint (proving a stale ambientSOURCE_VIDEOdid not leak into a full-mode export), the render settings, and the final output path.- 剪映 draft folder (
recap_<stem>/draft_content.json+draft_info.json+draft_meta_info.json) — only with--export-jianying.
Notes
- Audio is mixed as tracks (like a cut-software timeline): the original audio, an optional BGM bed, and the narration.
- Optional 剪映/JianYing export:
--export-jianying(orEXPORT_JIANYING=1) turnstimeline.jsoninto an editable 剪映 draft — original clips, separate audio tracks, and volume keyframes for the ducking. Fully decoupled and lazy-imported: the ffmpeg render never depends on it, and 剪映 need not be installed. In cut mode pass--source-video <orig>so the draft references the real clips. Point--jianying-outat 剪映's drafts root to open it in-app. If a draft folder with the same name already has files, export writes a numbered sibling instead of overwriting it. Media is bundled into the draft folder by default (--jianying-no-bundle-mediato reference in place) — this is required on macOS, where 剪映 is sandboxed and cannot read external paths. Note: the draft references the un-burned original, so the source's hardcoded subtitles are visible there (mask them in 剪映 if needed). - Subtitle look:
SUBTITLE_FONT_SIZE,SUBTITLE_MARGIN_V,SUBTITLE_MAX_CHARS, etc. - Ducking / loudness: the original swells to
IDLE_ORIG_VOLUMEin the gaps and ducks toSPEECH_DUCKING_VOLUMEunder narration (DUCK_FADE_SECONDSsmooths the transition); alsoDUCKING_MODE,ZONE_DUCKING_VOLUME,FINAL_LOUDNORM,TARGET_LUFS. - BGM (optional): set
BGM_PATHto any audio file; it loops to length and ducks under narration (BGM_VOLUME/BGM_DUCKING_VOLUME). - Burning subtitles requires an ffmpeg with
subtitles/libass support; assemble (and the recap orchestrator) preflight this and fail fast with a clear message if it is missing. - During original-audio blocks (the narration gaps), the original dialogue is also burned as subtitles so the band is never blank while the original speaks — wrapped in
「」to set it apart from narration (SUBTITLE_ORIGINAL_IN_GAPS, default on). Preferred source is the agent-calibratedoriginal_subtitles.json(OUTPUT-time[{start,end,text}]); without it, a conservative auto-ASR mapping is used (cut mode remaps ASR source→output via the clip plan, assigns each line to the one gap it lands in, and skips lines too dense to read).
What this skill does NOT do
- Does NOT generate narration or synthesize TTS.
- Does NOT re-transcribe or alter timing decisions — it consumes placement from tts_meta.json.
- Burning subtitles is on by default (
--no-burn-subtitlesto turn it off); when on, it re-encodes the video to draw the subtitle band.
按 MIT 许可原样转载,未经改动 · 在 GitHub 查看 →
评论
登录即可评论;带「已验证安装」的,是发布者名下有本店的安装或持有记录。
…