Skip to content
Back to skills

Video Compose

ASecurity

图文成片——脚本→分镜卡片图→TTS配音→ffmpeg 拼装成带字幕的竖版/横版视频(口播、知识分享、带货讲解)

  • 262 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 26, 2026
ai-agentsgoshell

Security analysis

A100/100

Scanned September 27, 2026

npx -y skills add CatCatUncle/openworkbuddy --skill video-compose --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Video Compose?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Video Compose
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/catcatuncle-video-compose/badge)](https://www.skillsdirectory.com/skills/catcatuncle-video-compose)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: video-compose
description: 图文成片——脚本→分镜卡片图→TTS配音→ffmpeg 拼装成带字幕的竖版/横版视频(口播、知识分享、带货讲解)
---

# 图文成片技能(脚本 → 视频)

## 适用场景
「把这篇文章做成视频」「做一条口播/知识分享视频」。产出 = 一条 mp4(分镜卡片轮播 + 配音 + 字幕)+ 发布文案。走的是「图文成片」路线(信息密度高、成本为零、可控性强),不是 AI 生成实拍画面——需要实拍感画面时才用 generate_video 生成个别镜头素材。

## 前置检查(先做,缺了就早说)
1. `run_shell` 执行 `ffmpeg -version`:没装就直接告诉用户 `brew install ffmpeg`(mac)/ `winget install ffmpeg`(win),并先把分镜图做完,配音和拼装留到装好后再跑(按句配音要靠 ffmpeg 量每句时长,没装它会直接报错、不花钱)。
2. 语音合成(text_to_speech)没配渠道时:照常出片但改为「无声+大字幕」样式,并明说配音跳过的原因。
3. **分镜超过 6 段就先让用户把额度调上去**:一段要走出图、拼片两步(配音一次调用整批出),6 段也有十几步,而单独用本技能时默认上限是 25 步 / 30 分钟(走 promo-video 配方时,开头表单一交上限就按配方放宽了,跳过这一条)。撞上限断在最后一步 concat 之前是最亏的一种断法——图和配音的钱都花了,片子一秒都没有。开工前先说一句:去「设置 → 智能体 → 执行上限」,把「最大执行步数」调到 60、「任务最大运行时间」调到 60 分钟;不想守着的话把「自动续跑轮数」设成 1~2,撞上限会自己接着做完(每一轮都真计费)。

## 流程
1. **脚本**:把内容改写成口播稿,切成 6~12 个分镜段落,每段 1~3 句话(一段 = 一个画面)。开头 3 秒必须是钩子。
2. **分镜卡**:每段一张卡片图,方法同 xhs-cards 技能(HTML → html_to_image)。竖版 1080x1920(`body{width:1080px;height:1920px}`),横版 1920x1080。每张卡放该段的核心句(大字)+ 关键词/数据,不要整段照抄。
   - **动画路线**(要动效、工具里有 render_motion 时):每段写成一个 HTML,元素用 `data-start`/`data-duration` 控制出场;先做完第 3、4 步拿到每段秒数,再一次 `render_motion` 传 `html_files`(按分镜顺序)+ `durations`,直接出一条无声 mp4,不花钱。交付前用 look_at_image 看它落的封面 PNG。有 compose_video 时可以省掉这一步:每段 HTML 直接写进时间轴 `{"visual":{"file":"s1.html","kind":"html"}}`,它按配音长度逐段渲。手工拼时第 5 步的 shots.txt 换成这条 mp4 当画面轨:`ffmpeg -y -i 动画.mp4 -i 旁白.wav -c:v copy -c:a aac -shortest final.mp4`。
3. **配音**:一次 `text_to_speech`,传 `segments`(每个分镜一项,按顺序)和 `filename: "旁白.wav"`。逐句合成、按解码后的采样量好每句时长,一次出整轨 `旁白.wav`、句级字幕 `旁白.srt`、时长清单 `旁白.json`。改了哪句就原样再调一次,只有那一句重新花钱。
4. **定时长**:读 `旁白.json`:第 N 个分镜时长 = `segments[N-1].slot_ms`/1000 秒(这一句 + 句后停顿)。不要再逐段跑 ffprobe——mp3 容器时长每段差几十毫秒,累加下来字幕对不上嘴。
5. **拼装**(工具里有 compose_video 时走它,本机 ffmpeg,不花钱):写 `timeline.json` 放在分镜旁边,先传 `dry_run: true` 看会出几条、多长、有什么警告,没问题再正式跑。最小写法:
   `{"title":"片名","aspects":["9:16","16:9"],"segments":[{"visual":"shot_01.png","voice":{"sentences":[{"text":"这一句","file":"旁白.json 里对应那项的 file"}]}}]}`
   - 第 N 个分镜的 `voice.sentences` 照抄 `旁白.json` 里 `segments[N-1]` 的 text / file。每段画面时长跟着配音走,不用自己填秒数;没配音的段写 `"text"` 和 `"min_seconds"`。
   - 可选:`brand` 填 brand_kit 建的品牌包名(logo、字体、颜色、片尾号召);`intro` / `outro` 加片头片尾卡;`music` 垫配乐,说话时自动压低;某段写 `"cover": true` 指定从那段截封面。
   - 等得到就直接交成片;等不到会先给任务号,过一会儿传 `{"job":"任务号"}` 再查,要停传 `{"job":"任务号","cancel":true}`,不会留半截文件。
   - 工具列表里没有 compose_video 时,退回 run_shell 手工拼:
     - 写画面清单 `shots.txt`,每个分镜两行,秒数照上一步:`file 'shot_01.png'` 换行 `duration 2.61`,依次往下写;**最后一张再单独补一行 `file 'shot_NN.png'`**——concat 不认最后一条的 duration,不补的话最后一镜只闪一帧,`-shortest` 还会把结尾那句旁白一起剪掉。
     - 成片:`ffmpeg -y -f concat -safe 0 -i shots.txt -i 旁白.wav -vf "fps=30,format=yuv420p" -c:v libx264 -tune stillimage -c:a aac -shortest final.mp4`。画面按累计时间切、整轨一次配上,十几镜拼完声画也不漂。别每镜各配一截音频再 concat:每截 AAC 开头都有几十毫秒补齐,越往后声音越晚。
     - 无配音模式:duration 写你定的每段秒数,去掉 `-i 旁白.wav` 和 `-c:a aac -shortest`。
6. **字幕**(可选加分项):compose_video 自带,按句切好;本机 ffmpeg 带 libass 就烧进画面,没有就只附 .srt,结果里会照实说。不要字幕写 `"subtitles": false`(分镜卡本身已带大字时可省)。手工路线直接用第 3 步出的 `旁白.srt`,时间轴就是整轨的:要烧进画面就在成片那条的 `-vf` 里接上 `,subtitles=旁白.srt:force_style='FontSize=18,Alignment=2,MarginV=40'`;先 `ffmpeg -hide_banner -filters` 看有没有 subtitles 这个滤镜,没有(没带 libass)就别烧,把 `旁白.srt` 跟成片一起交付。
7. **交付**:成片(compose_video 每个画幅一条,手工路线是 final.mp4)+ 封面图(compose_video 会截好;手工路线用第一张分镜卡)+ 发布文案(标题/简介/标签)。

## 硬约束
- 所有中间产物(HTML/PNG/旁白整轨和分句/timeline.json/shots.txt)留在工作空间,别删——用户可能要改某一段重拼。
- ffmpeg 命令一次只做一件事,失败要把 stderr 关键行读出来说人话,不要吞。
- 时长控制:总片长 ≤ 60 秒最稳(短视频平台完播率);口播稿超了就砍分镜,不要加语速。

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.