长篇播客开场(冷开场)
视觉风格参考 Greg Isenberg 的长篇开场。其吸引力在于:
- 以最强力的台词开场,不要先展示标志。
- 每 3–6 秒切换一次画面。
- **让大约每隔一个片段成为切出:**演讲者滑入左侧卡片,同时图形落在右侧。
- **字幕保持简短:**1–3个词,橙色的关键词。
- **以标题卡结尾:**展示未来内容的卡片。
工作流是 pipeline/build_episode.py,由 work/<ep>/episode.json → intro 驱动。渲染使用 Remotion 的 IntroV2 合成(pipeline/remotion/src/IntroV2.tsx);图形来自 Graphics.tsx。
1. 从剧集中挖掘剪辑片段(选出 8–10 个候选,保留 7–9 个)
- 读取转录文本(
work/<ep>/words-*.json或 Descript 的.txt文件),列出可在 6 秒内独立的台词。 - 按优先顺序:
- 一个硬数字:“支付 27% 的员工让他们离职”、“900% 的收入留存”。
- 一个大胆的主张或预测:“token 将会渗透到一切”。
- 一个忏悔或 relatable 的痛苦:“我对支付订阅费感到无比厌倦”。
- 一个有趣或情绪化的反应:“我会全力 token max”。
- 一句可引用的结尾:“超级智能的价值无法衡量”。
- **跨话题分布:**每个章节大约一个片段,两位主持人都要出现,至少有一个笑声。
- 排列集锦顺序:
- 片段1是单个最强的钩子,通常是一个数字或主张。
- 交替变换演讲者和能量。
- 将最可引用的台词放在最后,紧接标题卡。
- 跳过:
- 需要上下文的台词(“正如我所说”、“那张图表”);
- 超过约 6 秒的台词;
- 有重叠对话的台词。
- **脏话:**仅当用户接受明确的开场时才保留,并在报告中说明。
2. 配置 episode.json → intro
"title": "FRINGE LINES",
"subtitle": "2026年10月30日",
"intro": {
"style": "v2",
"title": "Fringe Lines",
"title_seconds": 4.5,
"topics": ["晨间循环", "微软员工规模", "构建 vs 购买", "Token限制", "Google vs AI模式", "Anthropic的S-1", "AI支出"],
"emphasis": ["27%", "leave", "900%", "retention", "sql", "agents", "tokens", "everything", "maxing"],
"clips": [
{"say": "microsoft just offered", "until": "employees to leave", "tag": "AI与就业", "replace": {"27": "27%"},
"graphic_on": "27%", "graphic": {"type": "stat", "kicker": "微软买断报价", "value": 27, "suffix": "%", "label": "被提供离职补偿金的员工占比 *离职*"}},
{"say": "tokens are going to seep", "until": "like the internet", "tag": "Token无处不在"}
]
}
- **
say/until:**剪辑片段的开始和结束几个口语词,匹配时不区分大小写和标点。匹配发生在剧集中的第一次出现,因此say要具有辨识性(3–5 个词)。如果其他演讲者覆盖了该台词,匹配器会仅使用一位演讲者的词语重试。 - **
pre:**在say之前的可选领先时间(秒)。 - **
tag:**显示在左上角的话题标签及其编号。使用 1–3 个词。 - **
replace:**字幕修正,例如数字、“sequel” → “SQL”,或"a": ""来隐藏某个词。 - **
graphic+graphic_on:**切出图形大约在口语词graphic_on前 150 毫秒出现。- 可选的
graphic_off(一个较晚出现的词)可恢复至全帧画面。 - 如果没有
graphic_off,则切出持续到剪辑结束。
- 可选的
- **切出数量:**为 3–5 个剪辑添加切出。选择含有数字、知名的公司或产品名称,或可引用台词的片段。对反应和笑声片段则保持全帧。
- 图形类型(与编辑短片相同):
stat:一个计数数字,带有提示词和标签;people:图标网格;lines:示意图趋势线;quote:墨水卡片;headline:新闻式卡片,带有高亮扫描效果;list:编号行。- 使用
*word*表示橙色斜体。
- **诚实性:**屏幕上的数字必须与所说内容一致。图表是示意性的,绝不捏造数据。
- **
topics:**用于标题卡的 5–7 个简短章节名称,按剧集顺序排列。 - **
emphasis:**12–25 个关键词,在字幕中显示为橙色:数字、名称、点题词。 - **
title_seconds:**4–5 秒。标题卡为“Fringe Lines”(serif 字体),最后一个单词为橙色斜体,包含日期和一个“本期剧集”列表。
3. 在渲染前检查计划
~/.shorts-skill/bin/python pipeline/build_episode.py --ep <ep> --stage plan
- 它会打印每个开场剪辑的标签、长度和字幕文本。
- 修复所有
WARN intro clip not found:调整say/until的措辞以精确匹配转录文本。 - **目标总时长:**剪辑 35–50 秒加 4.5 秒标题。删除或修剪超过 6 秒的剪辑。
- 仔细阅读每行字幕,找出误听的单词并添加
replace修正。
4. 渲染
~/.shorts-skill/bin/python pipeline/build_episode.py --ep <ep> --stage graphics # 开场剪辑 + IntroV2 + 下方字幕条
~/.shorts-skill/bin/python pipeline/build_episode.py --ep <ep> --stage final # 拼接开场 + 主体、章节、响度标准化
- 为两个命令添加
--blur以生成背景模糊版本。它需要~/.cache/fringe-lines-video/blur/中的模糊摄像机画面(见pipeline/bg_blur.py),并从单独的缓存中写入<ep>-fringe-lines-blur.mp4。 - 主体部分无需因开场更改而重新渲染。
- 章节文件会重新生成,因此所有时间戳都会随开场长度而偏移。
- 音效(嗖嗖声、砰砰声、进入标题的长嗖嗖声)会生成到图形文件夹中,并由 Remotion 混合。
5. QA
F=out/episode/<ep>-fringe-lines.mp4
ffmpeg -v error -y -i $F -t 50 -vf "fps=1,scale=320:-1,tile=8x7" -frames:v 1 /tmp/intro.png
检查:
- 每个切出的卡片完全显示在屏幕上,其数字与所说内容一致,且无残留的
*。 - 字幕显示橙色关键词,且无字幕与演讲者卡片底部边缘重叠。
- 标题卡按顺序列出所有话题。
- 视频和音频时长匹配(
ffprobe -show_entries stream=codec_type,duration)。 - 剧集响度约为 −15.5 LUFS。
- 章节文件以
00:00 Cold open开头,接着是开场时长,然后才是“Catching up”。
向用户报告:
- 剪辑列表(标签 + 台词);
- 哪些剪辑带有切出;
- 开场时长;
- 任何明显用语;
- 任何需要验证的数字。