Reel — 分屏剪辑(45 % 面板覆盖讲解者)
一个固定的奶油色面板占据帧的顶部(1080 × split.panel_height,默认 864 = 45%),显示 UI 风格的小工具——卡片、仪表、开关、终端、标签——精确可视化当前所说的内容。讲解者位于下方,比例为 1,从不移动。结尾:评论关键词以大号字体显示在屏幕上,然后是关注卡片。工作示例:examples/split/(一份真实的 100 秒关于五种 Claude 技能的视频的计划 + 场景模块)。
参数:$ARGUMENTS
默认值(仅当用户明确要求时才更改)
首先读取 reel.config.json(回退到 reel.config.example.json)。
| 项目 | 默认值 |
|---|---|
| 分屏 | "split": split.panel_height(864 → 面板 45%,讲解者 55%;960 = 50/50) |
| 讲解者 | 比例 1,无缩放,无移动;脸部居中于讲解者区域(speaker_y) |
| 安全框 | "safe": split.safe = [64, 160, 64, 32] → 场景内容位于 952 × 672 区域内,从顶部向下 160 像素开始(Instagram 头部 / 手机状态栏隐藏顶部) |
| 字幕 / 音效 / 音乐 | 不添加。音频 = 片段本身的混音,由 finish.py 重新封装 |
| 片段 | 假设已剪辑、调色、添加音乐 → 直接使用。原始/未剪辑 → 先询问 |
| 行动号召(CTA) | 评论关键词(单词或数字)大号显示在气泡卡片中;关注卡片 "handle": creator.handle,仅文字,绝不使用脸部裁切 |
| 调色板 | split_palette:奶油色面板,墨色文字,强调填充;奶油色背景上的文字使用 accent_deep(对比度) |
输入
片段名称和主题来自参数。仅在一个消息中一次性询问缺失的信息:片段是否已剪辑/调色/添加音乐;评论关键词;Whisper 可能听错的人名或术语(工具和产品名称)。
工作流程
PY = .venv/Scripts/python.exe -X utf8(Windows)或 .venv/bin/python -X utf8(macOS/Linux)。耗时步骤在后台运行。
| # | 步骤 | 命令 / 操作 | 检查 |
|---|---|---|---|
| 1 | 查看 | ffprobe;联系图 ffmpeg -i raw/<take> -vf fps=1/5,scale=216:384,tile=9x2 -frames:v 1 work/<take>/sheet.jpg 并查看 | 头部上方空墙?已编辑? |
| 2 | 转录 | $PY tools/transcribe.py <take> --prompt "<names, jargon>" | 校对工具名称;间隔 > 3 秒 → 重新转录窗口 |
| 3 | 人脸 | $PY tools/face_track.py <take> --split <panel_height> | 输出 speaker_y |
| 4 | 节拍规划 | 每个想法一个场景,通常 3–7 秒,每个小工具固定在一个口语单词上(提示 = 单词开始)。场景改变内容,从不改变布局 | |
| 5 | 计划文件 | work/<take>/showcase.json 基于 examples/split/showcase.json:video("../../raw/<file>"),split,speaker_y,safe,scenes_module,scenes[] {kind, start, end, cue{...}},关注场景的 handle;_note 记录人脸编号 | |
| 6 | 场景 | tools/scenes_<slug>.py 基于 examples/split/scenes_5skills.py:每种 kind 有一个 sc_<kind>(i, s) -> (html, js),RENDER 字典,可选的 CSS/JS。坐标在安全框内(宽 952);id 为 s{i}-*;提示时间绝对。sc_comment,sc_follow 为行动号召(CTA) | |
| 7 | 构建 | $PY tools/showcase_build.py <take>;在 work/<take>/sc 中:npx hyperframes lint public → 0 错误;npx hyperframes snapshot public -o ../snaps --no-end --describe false --at <每个场景的中间>;读取图片,修复 | 文本在面板内,不在头部下方 |
| 8 | 快速渲染 | $PY tools/finish.py <take> --seconds 12;读取 work/<take>/sc/quick_sheet.jpg | |
| 9 | 完整渲染 | $PY tools/finish.py <take>(后台)→ final/<take>/,验证,qa/sheet.jpg | 读取图片 |
| 10 | 报告 | 路径、时长、场景、验证结果。如果学到新东西,则添加到此技能中 |
面板规则
- 小工具可视化当前正在说的句子:提到仓库时显示仓库卡片,比较时显示仪表,说“不是这个”时显示删除线。
- 每个场景在下一个场景之前 0.25 秒淡出(构建器自动完成);在场景内部,元素在其提示词上到达。
- 屏幕上的数字必须是片段中实际计数。
- 内置于
showcase_build.py的场景种类(hook,repo,cta,……)早于 45% 安全框,可能溢出;请在tools/scenes_<slug>.py中基于examples/split/scenes_5skills.py编写种类。 - 波斯语 / 阿拉伯语文本:
.fa类(元素上 RTL,绝不使用<html>上的dir="rtl"),letter-spacing: 0,通过fa()输出数字,大零为拉丁字母0。 - 同一属性上无重叠动画补间,无
Math.random/from:"random",滑入动画在 from 状态中携带autoAlpha:0。 - 如果任何源片段为 HDR(HLG),首先进行色调映射(
tools/story_assets.py中的TONEMAP)——finish.py会在遇到“HDR 自动提升”时停止。 hyperframes snapshot不是渲染的证明——步骤 8 才是。