Back to skills
SKILL.md
Short Drama
ASecurityAI 真生成画面的竖版短剧:分镜表→定妆照→首帧→图生视频→配音→拼片配乐,改一镜只重算一镜
- 262 stars
- 0 votes
- 0 copies
- 2 views
- Added September 26, 2026
Security analysis
100/100Pro scans all 2 files and shows the line behind each finding
npx -y skills add CatCatUncle/openworkbuddy --skill short-drama --agent claude-codeAre you the author of Short Drama?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/catcatuncle-short-drama)---
name: short-drama
description: AI 真生成画面的竖版短剧:分镜表→定妆照→首帧→图生视频→配音→拼片配乐,改一镜只重算一镜
---
# AI 短剧技能(一个故事 → 一条片子)
## 适用场景
「做一条 60 秒的短剧」「把这个故事拍出来」。产出 = 一条竖版 mp4(AI 生成画面 + 配音 + 配乐 + 字幕)+ 一份分镜表 JSON。
跟 video-compose 的分工别搞混:那条走「图文成片」——卡片轮播、画面成本为零、信息密度高,适合口播和知识分享;
这条是 AI 真生成画面,每一镜都真花钱。讲道理走那条,讲故事才走这条。
## 开工前先把钱和时间说清楚
一条 12 镜的短剧 = 12 次生图 + 12 次生视频 + 12 次配音。**生视频是里面最贵的,而且按条计费,生失败的那条钱照扣。**所以:
- **分镜表先定下来给用户过目,点头了再开始花钱。**别边想边生——中途改设定,前面生的全作废。
- **超过 6 镜先让用户把额度调上去**:设置 → 智能体 → 执行上限,「最大执行步数」调到 60、「任务最大运行时间」调到 60 分钟;不想守着就把「自动续跑轮数」设成 1~2(每一轮都真计费)。撞上限断在最后一步拼装之前是最亏的断法——图和配音的钱都花完了,片子一秒都没有。
- **重跑不用怕**:参数逐字一样的生图 / 生视频 / 配音会直接复用上一次的产物,一分钱不花。所以改了第 7 镜的台词、重跑整条,真正花钱的只有第 7 镜。确实要换一版不一样的,那一次调用加 `no_cache: true`。
## 前置检查(先做,缺了早说)
1. `run_shell` 跑 `ffmpeg -version`。没装的话报错里会直接写这台机器该敲哪一句装,照着说给用户听。这一步没过就别开始生图——最后拼不起来,钱全白花。
2. 生图、生视频、配音三路渠道都得配。哪一路没配,第一次调用就会直说「去设置 → 模型 → … 填」。缺配音可以降级成「无声 + 大字幕」并说明原因;**缺生视频不能降级**——那是这条技能的全部意义,直说做不了,别拿静止图凑数当短剧交付。
3. 生视频要的是 i2v(图生视频)型号。设置里配的是纯文生型号时,给了 `first_frame` 会在发请求之前就被拦下来——这是好事,别绕开它,让用户去设置里换型号。
## 流程
### 1. 分镜表(唯一不花钱的一步,最该慢慢来)
按 `references/分镜表.schema.json` 写一份 `分镜表.json`(write_file 落盘),然后把镜头清单摊给用户看:几场几镜、每镜多长、总时长、谁说什么。用户点头再往下走。
- 总时长 ≤ 60 秒最稳;一镜 3~6 秒,12 镜上下。
- 开头 3 秒必须是钩子——第一镜的画面和第一句台词就得把人钉住。
- 每个角色的外貌写死一段 `look`,后面所有镜头照抄,一个字都不要改。每镜重新描述一遍,人就会一镜一个样。
- 全片画风写在 `style` 里,每一镜的 prompt 都带上它,否则镜与镜之间画风会飘。
> **分镜表写完就能整张摆到无限画布上。** 画布上放一个「短剧分镜」节点,选中这份表,按「展开场次与镜头」:
> 角色、场次、镜头一次全建出来,每一镜的 `cast` 里点到谁,就从那个角色节点连一条「人物身份」的线过来。
> 这条线不是装饰——**生首帧时的参考图、配音时用谁的音色,都是顺着它找过去的**,没有它这一镜就等于没有角色。
> 所以 `cast` 里写的角色 id 必须在 `characters` 里查得到;查无此人的话展开完会直接点名说是哪几个,
> 别当成小毛病放过去:那几镜会安静地少参考图少音色,要等十二镜都生完、发现同一个人一镜一个样才看得出来。
>
> 字段是这么对上的:`look` → 角色节点的「人物设定」,`ref` → 「参考图」,`voice` → 「音色」;
> 镜头这边 `frame_prompt` → 「首帧提示词」(展开时会自动把全片 `style` 接在后面),`motion_prompt` → 「运镜提示词」。
> 这两格是分开的,因为生首帧和生视频是两枪:生视频只递运镜那一格,画面内容已经在首帧里了,
> 再把首帧提示词递一遍,模型会照着它重画一遍,生出来的片子跟你刚确认过的那张首帧对不上。
>
> **在画布上生出来的东西会自己回到这份分镜表里。** 展开的时候每个节点身上都盖了「我是这份表的哪一镜/哪个角色」,
> 所以画布上按「生成首帧 / 生成视频 / 生成配音」出来的路径会当场写回 `first_frame` / `video` / `audio`,
> 角色节点的定妆照写回 `characters[].ref`。这件事不是为了两个页面看起来一致——
> 分镜表是「改一镜只重算一镜」的依据,它不更新,下次重跑就是把已经买过的十二镜再买一遍。
> 回写失败(表被改名、镜头号对不上、两场撞了同一个镜头号)会跟「已生成」摆在同一条提示里说清楚,
> 不会闷掉;看到那条提示就去把分镜表里的编号理顺,别直接点重跑。
### 2. 角色定妆照(跨镜头长得一样,全靠这一张)
每个角色一次 `generate_image`,`filename` 用 `角色_<名字>.png`,prompt = 那段 `look` + 「正面半身、中性光、纯色背景」。
**出图后给用户看一眼再往下。**定妆照错了,后面十二镜全错——那才是真烧钱。路径回写进分镜表的 `characters[].ref`。
> **在无限画布里做这部戏,这一步也不用手敲。** 角色节点上就有「生成定妆照」(场景节点上是「生成场景图」),
> 跑着的时候按钮锁住写「生成中…」,出了图变成「重生成定妆照」,旁边多一颗眼睛能直接看图。
> 只写了个名字、人物设定还空着的时候它不开枪——一句话按死:只有一个名字,生出来的脸每次都不是同一个人,
> 当参考图没用,那一次生成就是白花的钱。
> 图落盘叫 `角色_<名字>_定妆.png` / `场景_<地名>.png`,写回节点的 `reference` / `image`:
> 「制片进度」的**定妆**那一档和素材台账的「用途」认的就是这两个字段和这个名字,
> 换个字段或者换个名字,等于图生出来了、界面上还是说你没做,台账里还会把它划进「没人用」那一栏——那一栏旁边写着可以删。
### 3. 每镜首帧图
每镜一次 `generate_image`:
- `reference_images` 填这一镜出场角色的定妆照(最多 4 张)。这是角色一致性的唯一手段,光靠文字描述同一个人,跨镜头一定长得不一样。
- `prompt` = 景别 + 场景 + 姿态 + 光线 + 全片画风。角色部分只写「参考图里的女生」这种指代,**别再描述一遍五官**——那会跟参考图打架。
- `filename` 用 `镜头_<镜头号>_首帧.png`,跟分镜表里的 `first_frame` 对上。
> **在无限画布里,这一步的参考图不用手挑。** 连到这一镜上的角色节点、场景节点,
> 生首帧的时候会自动把它们的定妆照 / 场景图当参考图带上(最多 4 张,跟 `generate_image` 的上限一样)。
> 上一镜连过来做连续性的话,它交出来的是**那一镜的首帧图**,不是成片 `.mp4`——
> 服务端只收 png / jpg / webp / gif / bmp,混一个 `.mp4` 进去不是「参考图差一点」,是整枪原地退回、这一镜的首帧根本生不出来。
> 同理,图生视频找不到首帧时不会拿手边第一张图顶上:宁可停下来说「还没有首帧」,也不拿角色定妆照生一条跟这一镜无关的片子。
多镜可以放在同一轮里一起发,系统默认同时跑 2 条;**每条 filename 必须不一样**,同名就是互相覆盖。
### 4. 图生视频
每镜一次 `generate_video`,`first_frame` 给第 3 步那张图,`prompt` **只写动作和运镜**(「她缓缓抬头,镜头轻微推进」)。
画面内容已经在首帧里了,再描述一遍只会让模型改画面。转场镜头(从这张变到那张)才同时给 `last_frame`。
### 5. 配音
每句台词一次 `text_to_speech`,`filename` 用 `配音_<镜头号>.mp3`,`voice` 用分镜表里给这个角色定的音色——同一个角色全程一个音色,别让它中途换人。
> **在无限画布里,音色写在角色节点上。** 角色节点的「音色」栏填一次(`alloy` / `nova` / `Cherry` 之类,
> 具体有哪些看你在 设置 → 模型 → 语音合成 接的是哪家),这个角色的每一句台词都用它。
> 镜头那边不用重填,连一条线过去就行;一镜里连着好几个角色的时候,在镜头的「说话的角色」栏点个名
> (写角色名或分镜表里的角色 id 都认)。
>
> **连着两个音色不一样的角色、又没点名的镜头,画布不会替你挑一个。** 它停下来说清楚,并把那几镜标出来让你点过去。
> 这不是小题大做:挑错了生出来的声音还是好声音,只是不是这个人的——接口 200、文件落盘、进度条全绿,
> 要等你把成片放给人看,才听出来爷爷和小孙女是一个嗓子。那时候这几条配音已经花过钱了。
> 「一键补齐配音」也照这个来:说得清的照跑,说不清的摘出来单独告诉你,不会闷头把整批都做成一个人。
### 6. 量时长、对齐
`ffprobe -v error -show_entries format=duration -of csv=p=0 配音_S1-01.mp3` 逐条量,写回分镜表的 `duration`。
**以配音时长为准**:视频短了定格补齐,长了 `-t` 截掉,别让话说一半画面先没了。
### 7. 拼装
> **在无限画布里做这部戏,这一步不用手敲。** 画布的「制片进度」条上有「合成成片」:
> 它先把镜头顺序、每一镜的真实时长和画幅摆给你看,确认了才跑,跑的就是下面这几条命令
> (代码在 `drama-compose.js`,不是模型现编的)。缺 ffmpeg、镜头视频不在盘上、
> 本机 ffmpeg 没带 libass 烧不了字幕、没带 sidechaincompress 做不了「说话时压低配乐」——
> 这些都在**开跑前**说,不会等全拼完才报错。配乐也在那儿:画布上有「配乐」声音节点就自动
> 多一个「垫上配乐」的勾,不想要就取消勾。
> 下面这几条是给「不在画布里」的场合留的底稿。
- 单镜合成(画面 + 配音):
`ffmpeg -y -i 镜头_S1-01.mp4 -i 配音_S1-01.mp3 -c:v copy -c:a aac -shortest 片段_S1-01.mp4`
- 合并:写 `list.txt`(每行一个 `file '片段_S1-01.mp4'`)后
`ffmpeg -y -f concat -safe 0 -i list.txt -c copy 成片素材/拼接.mp4`
(有配乐的话,`成片.mp4` 这个名字留给垫完配乐那一版——下游认的是它)
- 配乐:把音乐垫到整条片子底下。**一条命令混完,别分两步**:
```
ffmpeg -y -i 成片素材/拼接.mp4 -stream_loop -1 -i 配乐.mp3 -filter_complex \
"[0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,asplit=2[v0][key];\
[1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=0.5,afade=t=in:st=0:d=1.5,afade=t=out:st=<片长-2.5>:d=2.5[bg];\
[bg][key]sidechaincompress=threshold=0.05:ratio=8:attack=20:release=400[bgd];\
[v0]volume=2[v2];[v2][bgd]amix=inputs=2:duration=first:dropout_transition=0[mx];\
[mx]alimiter=limit=0.95:level=0[a]" \
-map 0:v:0 -map "[a]" -c:v copy -c:a aac -shortest 成片.mp4
```
四个坑,每一个错了都**听不出是哪一步错的**:
- `amix` 默认 `normalize=1`,两路各除以 2 —— 不先给人声 `volume=2`、给音乐把增益乘回来,
整条片子的台词平白小一半,听感只是「有点闷」,命令、退出码、文件大小全是对的。
- 音乐比片子短是常态(成品曲 60 秒,片子 3 分钟),短了才加 `-stream_loop -1`,
靠 `duration=first` 在画面结束的地方收住;**音乐比片子长的时候千万别 loop**,
也别让它把片尾拉出几秒黑屏。
- `sidechaincompress`(说话时音乐自动压低)和 `alimiter` 不是每台 ffmpeg 都有,
`ffmpeg -filters` 先查,没有就退回固定音量垫着,别让整条片子挂在最后一条命令上。
有 `alimiter` 必须写 `level=0`,否则它会把整条片子拉到 0dB,连没配乐的段落一起改。
- **「配乐」和「配音」是两回事**:画布上声音节点的「素材用途」默认是「对白/音乐」,
那个不算配乐;写成「配乐 / 背景音 / 主题曲」才算。认错了的症状是
「片子从头到尾有人在念第三镜的台词」。
- 字幕:按第 6 步的时长累加生成 `字幕.srt`,烧进去时不能再 `-c copy`:
`ffmpeg -y -i 成片.mp4 -vf "subtitles=字幕.srt:force_style='FontSize=18,Alignment=2,MarginV=60'" -c:a copy 成片_带字幕.mp4`
这条要求 ffmpeg 带 libass(`ffmpeg -filters | grep subtitles` 查得到才有)。没有就先别跑,
`字幕.srt` 照样交付——导进剪映/达芬奇是一行菜单的事,比在这儿卡住强。
### 8. 交付
成片_带字幕.mp4 + 封面(第一镜首帧)+ 分镜表.json + 发布文案(标题 / 简介 / 标签)。
产物路径全部回写进分镜表——它是下次改一镜重跑的依据。
## 改一镜怎么办
1. 只改分镜表里那一镜的字段(prompt / 台词 / 音色),别动别的。
2. 从第 3 步重跑整条:其余镜头参数逐字未变,直接复用上次的产物,不花钱;只有改过的那一镜真的重生成。
3. 第 7 步的拼装要重来一遍(`-c copy` 很快,不花模型钱)。
## 硬约束
- **分镜表是唯一真源。**每一镜的提示词、产物文件名、时长都写在里面。临时在脑子里改个 prompt 不回写,下次就对不上、缓存也命不中,等于白花一次钱。
画布那条路已经替你回写了:产物路径(首帧 / 视频 / 配音 / 定妆照),以及在检查面板里改的
提示词 / 运镜 / 台词 / 说话人 / 景别 / 时长 / 角色设定 / 音色——改完离开输入框就落盘,回不去会当场红一条。
连线也一样:在画布上给一镜多连一个角色、或者拆掉一根,分镜表里那一镜的 `cast` 当场跟着改
(cast 决定重跑这一镜时取谁的定妆照当参考图——少一个人当场换一张脸,多一个人两张脸糊一块儿)。
角色按展开时盖的戳认人,所以在画布上给角色改名不影响回表;把角色线全拆光也照样回(空镜是合法的)。
只有一件事它不替你做:**在画布上改镜头号**(编号是定位用的钥匙,改了那个节点就跟分镜表脱钩、
内容和 cast 都不再回表,会有一条提示告诉你——要改编号请直接改分镜表)。
还有一条:画布上那段「首帧提示词」是 frame_prompt 接上全片画风拼出来的,回写时会把画风那段剥掉。
你要是把画风那段也改了,剥不掉,整段写回去,下次展开会在后面再接一遍分镜表里的画风——
真要换全片画风,改分镜表的 `style`。
- 中间产物(定妆照、首帧、分镜视频、配音、片段)全部留在工作空间,别删——「改一镜只重算那一镜」靠的就是它们还在。
- 一条 ffmpeg 命令只做一件事。失败要把 stderr 的关键行读出来说人话,不要吞。
- 不许拿静止图加推拉摇假装 AI 短剧交付。做不到就说清楚是哪一路渠道没配、哪个型号不对。
- 画面里不加任何 AI 水印。
Files in this skill
- references/分镜表.schema.json
- skill.md
Attribution
Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.