产品介绍视频
产品图进,竖版介绍视频出。但不要一口气做完:图先确认,字再确认,最后才出片。
何时用这个技能
| 用户手里有什么 | 要做什么 | 用哪个 |
|---|---|---|
| 产品图(包装、场景、特写) | 介绍这个产品 | 本技能 |
| 软件界面截图 | 展示功能怎么用 | shot2clip |
| 只有一段文字主张,没有图 | 讲清一个卖点 | 纯文字卡片类技能 |
判据很简单:画面主体是一张产品照片,还是屏幕上的一块字。前者是本技能。
三步两闸
| 阶段 | 你做什么 | 产出 | 用户确认什么 |
|---|---|---|---|
| 1 收图 | 收路径 → 体检 → 定顺序 | photos_sheet.png + intake.md |
图齐不齐、有没有拿错、顺序对不对 |
| 2 写文案 | 按每张图写标题/说明/口播 | copy_sheet.md |
每句话、每个数字的依据 |
| 3 出片 | 生成 spec → 渲染 → 抽帧自检 | final.mp4 + 3 张自检帧 |
成片 |
两道闸都是硬闸,不是建议:
- 闸 1:用户没确认图,不许写文案。图选错了,文案全白写。
- 闸 2:用户没确认文案,不许渲染。
render.sh会检查签字单,没签字直接退出。
签字后再改 brief,签字作废(指纹对不上),必须重新确认。
用户中途要换图 → 回阶段 1 重跑 intake_photos.py,阶段 2 的签字自动失效,别在旧文案上改改就出片。
阶段 1:收图并确认
先问一句话
> 产品图在哪里?给我目录或文件路径就行(也可以直接上传)。顺便说一下这些图里哪张最像"正面主图"。
只问这个。产品卖点、参数留到阶段 2 一次性问完,别在这一步把用户问烦。
体检 + 出确认表
python scripts/intake_photos.py <目录或文件或通配符>... --outdir <工作目录>/intake
它做四件事:
- 排顺序:文件名的排序是碰运气,叙事顺序得人来定。用户给了顺序就加
--order "03.jpg,01.jpg,02.jpg"。 - 量每张图:边缘是否单色、长宽比、主体占比 → 决定铺满 / 镶框、文案放上还是下、背景用虚化照片还是品牌色渐变。
- 挑毛病:重复图、太小(<760px)、几乎纯色、过暗、带透明通道,全部标出来。
- 出两样东西:
photos_sheet.png(带序号的缩略图,用户一眼看完)和intake.md(清单 + 待确认问题)。
给用户看什么
把 photos_sheet.png 发过去,问三句:
- 图齐了吗?有没有拿错(包装背面、竞品图、纯细节不讲问题)
- 顺序对吗?第 01 张会作为开场主视觉
- 缺的那张现在补,比出片后补省一整轮
得明确的一句"Yes / 顺序这样就行"。用户只回"可以"也算过;如果用户说"这张换掉",改完重跑,不要嘴上答应手上继续。
阶段 2:写文案并确认
固化图片路径
python scripts/new_brief.py <工作目录>/intake/photos.json -o <工作目录>/brief.json \
--product "产品名" --brand "品牌名" --slogan "主标语" [--logo logo.png] \
[--primary "#2F6BFF"]
不要手抄图片路径。抄错一个字符,报错会发生在渲染阶段——那时候用户已经在等成片了。这个脚本把用户确认过的顺序原样搬进 brief,只留文案字段空着。
写文案前,一次问齐这几项(缺哪项问哪项,别猜):
- 产品名、品牌名
- 3~5 个卖点,以及哪个卖点配哪张图
- 每个数字的依据(蛋白质含量、发酵时长、容量……)→ 填进
claims - 品牌色(十六进制),没有就从包装上取主色
- 落版要不要 logo / 二维码 / 价格(默认都不要)
写文案
每屏三行字,写法看 references/copywriting.md:
| 字段 | 上限 | 作用 |
|---|---|---|
title |
≤16 字 | 屏幕上最大那行,一屏只说一件事 |
desc |
≤2 行 | 补依据、补限定条件 |
voiceover |
≤30 字 | 念出来的话,按字数决定这屏多长(约 4~6 秒) |
口播不是把标题念一遍——标题是看的,口播是听的,两句可以不同。屏长是按口播字数反推的,不是固定 3 秒。
出确认单
python scripts/copy_sheet.py <工作目录>/brief.json
产出 copy_sheet.md:逐屏文案 + 预计秒数 + 数字依据核对 + 广告法扫描结果。退出码 1 = 有阻塞项(缺文案、图不存在、合规 ERROR),改完再跑。
把这张表给用户,问:
- 每屏这句话,是不是你们真正想说的?
- 数字和依据对得上吗?(表里"未登记"的就是没有出处的)
- 屏数和时长接受吗?3 张图 3 屏是最短的样子,不是缺点
用户点头后才签字
python scripts/copy_sheet.py <工作目录>/brief.json --approve
这行会写 copy_approved.json(含 brief 指纹)。没有用户确认就不要跑这个命令——它等价于替用户签字。
阶段 3:出片
python scripts/make_spec.py <工作目录>/brief.json --outdir <工作目录>
bash scripts/render.sh <工作目录>
render.sh 先查签字单:没签字、或 brief 在签字后被改过,直接退出(FORCE_RENDER=1 可强行放行,只在明确知道自己在干什么时用)。
渲染完自动抽三帧:开场 / 中段 / 落版。逐张看:
- 字有没有被切在边缘
- 有没有白字压在浅色画面上(最常见的翻车)
- 落版是不是全片字号最大的地方
- 产品图有没有被拉伸(只允许等比裁切)
版式细节和判定阈值见 references/layout.md。
硬性约束
- 资料里没有的事实,一个字不写。 参数、认证、工艺、产地全部来自用户给的资料。没有就说没有,不补"行业领先""精选原料"这类填充句。
- 数字必须有依据。 brief 里每个数字都要在
claims登记出处,确认单会逐个核对;核对不到就是"未登记"。 copy_sheet.py必须 0 阻塞项才签字。 绝对化用语和食品功效宣称是硬拦截(lint_copy.py的 ERROR),不是建议。- 图不够就少做几屏。 3 张图就 3 屏,不要同一张用两遍凑时长,也不要硬拉每屏停留。
- 两道闸不许跳。 确认图 → 确认字 → 出片。跳过一次省 5 分钟,返工赔一小时。
常用变体
# 只改配音,复用已有画面(约 20 秒)
SKIP_RENDER=1 bash scripts/render.sh <工作目录>
# 不要人声,只出画面 + BGM
SKIP_VOICE=1 bash scripts/render.sh <工作目录>
# 单张图单独调取景
python scripts/analyze_photos.py photo.jpg --verbose
# 强制单张图铺满/镶框(覆盖自动判定)
# 在 brief 的该屏加 "mode": "bleed" 或 "frame"
文件说明
scripts/
intake_photos.py 阶段1:收图 → 顺序 → 体检 → 确认表(photos_sheet.png / intake.md / photos.json)
new_brief.py 阶段1→2:把确认过的图清单固化成 brief 骨架
copy_sheet.py 阶段2:文案确认单;--approve 写签字单
analyze_photos.py 图片体检算法(铺满/镶框 + 文案方位 + 背景策略)
make_spec.py brief + 体检结果 → spec.json + storyboard.md
preview.py 静帧联系表(想先看画面时用)
render_product.py 逐帧渲染器(两种取景 + 运镜 + 文字动效 + 转场)
render.sh 查签字 → 画面 → 配乐 → 配音 → 混流 → 抽帧
lint_copy.py 广告法 / 功效宣称 / 数字依据 / 长度(copy_sheet 内部调用)
ensure_deps.sh 环境自检
publish.py 打包
vendor/shortvideo-studio/
make_bgm.py 程序化 BGM(免版权)
make_voice.py edge-tts 配音 + 自动语速 + 侧链闪避混音
references/ TTS 音色与排错(来自 shortvideo-studio,MIT)
references/
brief.md 字段说明
brief.example.json 可直接改的模板
copywriting.md 产品介绍文案写法
layout.md 版式、安全区、判定阈值
已知边界
- 只出竖版 1080×1920。 要 16:9 需要同时改安全区和字号常量,不在保证范围内。
- 产品图建议 ≥ 800px 宽;更小的图铺满会糊(
intake_photos.py会提示)。 - 配音用 edge-tts,需要联网。离线时加
SKIP_VOICE=1只出画面 + BGM。 - 落版只用品牌名 + 一句话 + CTA,不做价格条和二维码——那是投放素材的活,不是产品介绍。
- 一支片子一个产品。多产品对比需要另做结构。