编辑风格短片(Fringe Lines) 是做什么的?
该风格以 Greg Isenberg 的短片为蓝本。每一个短片都必须严格遵循:
- 连续展示说话者画面不超过约 6 秒。
- 每 3–5 秒就要有一个图形或布局变化。
- 字幕逐词出现,部分关键词以橙色斜体显示。
- 图形紧随讲述内容,因此当某个词被讲述时,相应的图形就会随之出现。
0. 前置条件(每台机器)
pipeline/setup.sh会安装虚拟环境~/.shorts-skill以及~/.cache/fringe-lines-video中的 Remotion node_modules。- 剧集文字稿必须存在:
work/<ep>/words-quinn.json和words-doom.json(由pipeline/transcribe_verbatim.py生成)。 - Remotion 源码:
pipeline/remotion/src/ShortV2.tsx(布局)和Graphics.tsx(图形类型)。
1. 选取片段(30–50 秒)
- 在文字稿文件中搜索一个自包含的段落,它应当具备:
- 强有力的开场白(声明、数字或坦白);
- 单一观点;
- 靠近结尾的收尾或点睛之笔。
- 好的信号包括:
- 具体数字(百分比、金额、人数);
- 提及的公司或产品名称;
- 反主流观点;
- 个人实验(例如“我让 Codex…”)。
- 避免依赖前文语境的片段(如“就像我说的”、“那个东西”)。
- 可以拼接多个
--range参数。在句子结尾处剪辑,并检查拼接处是否有重复词语。
2. 裁剪片段
在 work/<ep>/shorts.sh 中添加一行并运行它:
b --name short-NN --range START:END [--range ...] --replace "27=>27%" --replace "claude=>Claude"
build_short.py会执行以下操作:- 移除填充词、口吃和长时间停顿;
- 选择活跃的摄像头;
- 写入
work/<ep>/short-NN/clip.mp4和props.json; - 渲染原始 v1 短片。
--replace用于修正字幕文本。右侧为空则隐藏该词。- 务必修正:数字(如“27”改为“27%”)、产品名称(如 Claude、Codex、Descript、GTM、SQL)以及 Whisper 的误听。
- 要获取编写规格所需的精确输出时间,请运行:
python3 -c "import json;p=json.load(open('work/<ep>/short-NN/props.json'));print(' '.join(f\"{w['text']}@{w['startMs']/1000:.1f}\" for w in p['words']))"
3. 编写风格规格文件:work/<ep>/short-NN/style.json
{
"hook": {"text": "Microsoft wants *27%* of its staff to quit", "end": 2.8},
"outro": {"text": "Grow *without* growing *headcount*", "hold": 2.0},
"emphasis": ["microsoft", "27%", "leave"],
"scenes": [
{"at": 0.0, "mode": "full"},
{"at": 3.0, "mode": "graphic", "graphic": {"type": "stat", "kicker": "Microsoft buyout offer", "value": 27, "suffix": "%", "label": "of employees offered a payout to *leave*"}},
{"at": 6.2, "mode": "card"}
]
}
时间以裁剪后片段的秒为单位,取自步骤 2 中的词语时间标注。
保持风格一致的规则:
- 结构:
- 场景 0 始终为
full,hook为 4–8 个词,约在 2.5–3 秒结束。 - 陈述观点;不要总结整个片段。
- 场景 0 始终为
- 节奏:
- 按
full→graphic→card→graphic→card… 的模式交替,在 40 秒的短片中应有 3–6 个图形。 - 在后半段再次使用
full来呈现一次有力的反应或笑声。
- 按
- 时机:
- 每个图形应在其对应的词语被讲述之前 0.1–0.3 秒 开始显示,并保持 2.5–5 秒。
- 两个图形可以连续出现,例如一张 20 美元的卡片随后紧接一张 100 美元的卡片。
- 强调词: 选取 10–18 个关键词:数字、名称以及点睛之笔的词语。匹配时忽略大小写和标点符号。
- 强调格式: 在任何文本字段中,
*word*将渲染为橙色斜体。每个字符串使用一到两个。 - 结尾卡片: 显示 2 秒的结束卡片,上面有一行短文本,重申核心观点或向观众提问。
- 诚实原则:
- 屏幕上显示的数字必须与节目中所述一致。
- 图表是示意性的:使用带形状的
lines,绝不使用虚构的坐标轴或数值。 - 当讲述者使用了模糊措辞时,也要添加“大约”或“~”等修饰。
图形类型(Graphics.tsx):
| 类型 | 字段 | 用途 |
|---|---|---|
stat | kicker, prefix, value (number, counts up), decimals, suffix, label | 一个重点数字 |
people | kicker, value (string), label, filled (0–1) | 人数 / 人员比例 |
lines | kicker, series: [{label, shape: up|flat|down}], caption | 趋势对比 |
quote | text, by? | 将点睛之笔展示在屏幕上 |
headline | source, title, highlight | 新闻、公告、“定论” |
list | title, items[] | 步骤、产品、问题所在 |
如果需要新增图形类型,请将其添加到 Graphics.tsx 及其联合类型中。保持卡片风格:白色或墨水色卡片,36px 圆角,弹簧入场动画,且动画基于其本地帧 f 运行。
4. 渲染
~/.shorts-skill/bin/python pipeline/style_short.py --ep <ep> --name short-NN --spec work/<ep>/short-NN/style.json
- 人脸追踪(
pipeline/face_track.py,使用 YuNet)仅计算一次,并缓存在short-NN/faces.json中。它确保圆形画中画和卡片始终以人脸为中心;如果重新裁剪片段,请删除该文件。 - 音效为合成音:每次场景切换时有“嗖”声,图形出现时有“砰”声。它们以
--sfx-db -20的音量混入。 - 响度:−14 LUFS。
- 输出:
out/shorts/<ep>-short-NN-v2.mp4。
5. 质量检查(始终在报告前执行)
提取若干帧并检查:
for t in 1.5 5 10 15 20 25 30 35 40; do ffmpeg -v error -y -ss $t -i out/shorts/<ep>-short-NN-v2.mp4 -frames:v 1 -vf scale=270:-1 /tmp/q_$t.png; done
逐一检查以下项目:
- 开头钩子: 清晰可读,且不遮挡人脸。
- 图形: 不与字幕块重叠(字幕块位于 y≈1340–1600 区域)。文本不溢出卡片边界。较长的统计值(如“+$500K”)会自动缩小。
- 画中画: 人脸居于圆形中心。
- 字幕: 没有多余的
*;关键词正确显示为橙色。 - 响度:
ffmpeg -i out.mp4 -af ebur128 -f null - 2>&1 | grep " I:"的结果约为 −14。
向用户报告:
- 短片内容概述及其时长。
- 需要验证的数字。
- 是否保留了露骨语言。