短视频构建器
引擎:$(reelsmith root)/engine/(build.py、template.html、music.py、pull_vo.py、capcut.py、fonts/)。每个短视频一个文件夹:<reel-dir>/reel.json → <reel-dir>/out/reel.mp4。如果 reelsmith 提示未设置,请运行 reelsmith setup 一次。
reelsmith new reels/my-reel # 创建包含 src/、vo/ 和模板 reel.json 的文件夹
reelsmith sheet reels/my-reel/src/* # 生成联系表 → 为每个片段选取 `ss`
reelsmith build reels/my-reel --stills # 约 1 分钟:生成帧、单词时间、字幕、out/qa_sheet.jpg
reelsmith stills reels/my-reel 0.5,7.8,21.3 # 额外检查帧
reelsmith build reels/my-reel # 完整渲染(60 秒短视频约 4-5 分钟)
始终先运行 --stills:阅读打印的字幕列表并查看 out/qa_sheet.jpg(红色区域表示 Reels/TikTok UI 安全区;任何重要内容不得位于红色区域内)。修正 reel.json,然后构建。检查最后打印的响度线(-14 LUFS ±1,峰值 ≤ -1 dB)。然后在交给用户之前,查看最终 MP4 中每个特效和转场附近的帧。
工作流程(创作者耗时约 10 分钟/条)
- 脚本:
reel-script技能 → 创作者批准。用<em>…</em>标记重音词;数字保留为数字以便显示。 - 配音:可以是创作者自己的录音(
vo/vo.mp3)或 ElevenLabs(参见docs/voice.md):TTS 文本 = 不带标签的脚本,数字拼写为单词,品牌名称按发音拼写。免费版可在 ElevenLabs 网页 UI 中生成(Chrome 中的 Claude 可以驱动),然后运行reelsmith voice <reel-dir>将最新的两条录音拉入vo/并显示时长。转录两条,保留较清晰的一条为vo/vo.mp3。语速较慢的配音:在vo中设置"speed": 1.07。 - 素材:
footage-scout技能 — 仅使用新素材(检查used_footage.md)、联系表、隐私检查。各片段时长之和必须等于配音结束时间 + 约 2 秒。 - 剪辑计划:
reel-director技能选择本故事适用的 3-5 个特效及转场位置。 - 编写 reel.json →
--stills→ 修正 → 构建 → 交付out/reel.mp4+out/cover.jpg+out/caption.txt。 - 可选:在 CapCut 中进行声音处理:
reel-capcut技能(库音效+手动挑选的音乐)。
reel.json
{
"vo": {"file": "vo/vo.mp3", "offset": 0.25, "speed": 1.07, "gaps": [[5.73, 0.8]]},
"script": "我已经花了三个月重写我的指南,昨天我改了封面字体<em>第四次</em>。…",
"hook": {"tag": "永恒草稿场景", "lines": ["指南快准备好了。", "<em>已经三个月了</em>"], "out": 5.55},
"end": {"from": 55.6, "lines": ["你的那份", "<em>等了多久?</em>"], "lines_at": [55.75, 56.6],
"sub": "在评论区告诉我", "sub_at": "@comments", "handle": "@yourhandle", "handle_at": 58.6},
"cover": {"from": 0, "to": 4.35, "title": "草稿", "left": "No.4 · 十月", "right": "@yourhandle", "top": 330},
"cover_t": 2.0,
"stamps": [{"seg": ["I", "J"], "text": "tanya · 草稿两年了"}],
"punch": [[3.02, 4.4], ["@thousand", 9.0]],
"segments": [
{"id": "A", "clip": "src/night_desk.mp4", "ss": 9.5, "dur": 2.5, "crop": [0, 0.196, 0.75], "cut": true},
{"id": "B", "clip": "src/keys.mp4", "ss": 1.3, "dur": 1.9, "move": "none"},
{"id": "E", "clip": "src/phone_walk.mov", "ss": 0.8, "dur": 4.5, "cut": true, "in": "zoom"},
{"id": "I", "clip": "src/cafe.mp4", "ss": 0.3, "dur": 3.2, "look": "bw"},
{"id": "K", "clip": "src/walk.mov", "ss": 14.0, "dur": 4.95, "look": "burst"},
{"id": "N", "clip": "src/breakfast.mov", "ss": 0.0, "dur": 3.45, "rate": 0.4},
{"id": "Q", "clip": "src/meadow.mov", "ss": 13.2, "dur": 9.1, "move": "pull-out", "in": "zoom"}
],
"caption": "…",
"music": "synth"
}
一个完整的真实示例(乌克兰语,61 秒,17 个片段,包含以下所有特效)位于 $(reelsmith root)/examples/chernetka/reel.json;最小示例位于 examples/template/reel.json。
配音与字幕
- lang:配音的 Whisper 语言(
"uk"、"en"等);省略则自动检测(或使用REELSMITH_LANG)。 - vo.gaps
[vo_time, extra_s]:在(变速后的)配音中该时间点附近最安静的位置插入一个呼吸暂停点——为照片蒙太奇留出空间。vo.speed:atempo 因子。 - "@word" 锚点:钩子/结尾/涂鸦/毛玻璃/检查清单/封面/轨迹/标题墙/推进/跳过字幕中的任何时间点都可以是
"@thousand"(该脚本单词的开始位置;先精确匹配,再前缀匹配)、"@again#2"(第二次出现)、"@twice+0.3"。Whisper 识别错误的单词会被赋予插值时间——此时请使用秒数。out/words.json在--stills后包含真实时间。 - subs / punch:省略则根据
script+ 单词时间自动生成(每行 5-7 个单词,1-2 行,重音词以斜体强调色显示,结尾不加句号,一行不以“和/在/的…”结束;推进最多 4 个重音短语,间隔 ≥ 3 秒)。可通过"subs": [[a, b, "html"]]、"punch": [[a, b]]覆盖。钩子卡显示时、毛玻璃标题和检查清单下方、以及结尾卡开始后,字幕会隐藏(可通过subs_from/subs_until/subs_skip [[a, b]]调整)。
卡片与文字
- 钩子:从第 0 帧开始显示的纸质卡片(
at: [t…]逐行显示,size、top)。结尾:从from开始的卡片,lines_at处的行,sub、handle。 - 印章:在指定片段左上角显示的单一药丸形状标签(地点、日期、角色名称)。
- 封面(封面故事 + 画面断裂):杂志刊头适配宽度,字母依次落下;在设置了
"cut": true的片段上,人物站立在标题前方。选择/裁剪一个镜头,使人物头顶位于刊头顶部下方 40-80 像素处——绝不能遮住眼睛。color用于刊头,top用于移动位置。cover_t≈ 2,以便out/cover.jpg显示完成的封面。 - 毛玻璃(毛玻璃文字):
{"from", "to", "lines", "at", "top"}毛玻璃标题。 - 检查清单:
{"from", "to", "title", "items": [{"text", "sub", "at", "sub_at"}]}卡片,逐项增长,在at处绘制勾选标记。 - 标题墙:
{"from", "to", "items": [...], "every": 0.06}文件名/标题瓷砖堆叠;可在其上放置毛玻璃标题。 - 轨迹:
{"from", "to", "seg", "text": "1000 粉丝 · ", "speed", "scale", "tilt", "lift"}环绕人物头部的文字环(仅用于设置了cut的片段);后半部分从人物身后穿过。最适合用于近距离自拍。 - 涂鸦(涂鸦动画):
{"kind": "text"|"circle"|"underline"|"strike"|"arrow", "at", "to", "x", "y", …}— 文字:text, size, rot, write;圆形/删除线:w, h(删除线n个锯齿;保留 3 个使单词可读);下划线:w;箭头:x2, y2, bend;color、width。使用奶油色光晕突出墨水,从左到右绘制,每 3 帧轻微摆动。钩子卡显示期间以及人物脸部区域上方(y ≈ 1000 以上)应避免放置涂鸦。
片段
- 路径:相对于短视频文件夹,然后是当前目录,然后是仓库。HEIC/JPG 照片通过
img处理即可。 ss片段内的起始时间,dur秒数;pos0-1 水平取景(用于宽幅源素材);crop [x, y, size]= 竖屏帧的缩放裁剪(从 4K 素材保持清晰);rate< 1 = 慢动作(仅当只有一小部分可用时使用)。- cut:
true= 此片段使用 macOS Vision 人物遮罩(reelsmith masks,约 0.2 秒/帧,可缓存)。封面和轨迹功能需要此设置。 - in:
"zoom"(前一个镜头模糊冲入,新镜头从缩放状态着陆)或"whip"(快速模糊滑动,无黑色边缘)。在 4-6 个关键剪接处使用,而非每个剪接处。 - look:
""暖色胶片风格 ·"memory"淡化的缩放飞入效果(用于照片蒙太奇;date添加橙色相机日期戳) ·"bw"黑白(音乐变闷) ·"burst"灰色 → 色彩绽放(音乐打开)。 - move:
push(默认慢速推入) ·tilt-up·pull-out·none。
声音与颜色
- music:
"synth"(根据画面风格生成的低保真背景音乐——作为占位符效果不错,创作者通常更喜欢真实曲目)、指向您拥有版权的音频文件的路径,或null。原始片段声音永远不会被使用。 - music_gain:默认 0.16(在配音下方进行侧链压缩)。
- colors:
{"accent": "#D4573A", "cream": "#F4EFE6", "ink": "#1F1A17"}(默认:米色/赤陶色)。
来自真实反馈的规则
- 特效必须在手机尺寸上第一眼就能看清:大、强调色、有动画。细小的奶油色涂鸦和模糊的毛玻璃面板被反馈为“特效在哪里?”。
- 剪接处不要重复出现白色闪光。静音原始片段声音。每条短视频使用 3-5 种技术,不要全用。
- 绝不要将文字、卡片或涂鸦放在眼睛上方;移动卡片或重新取景。
- 以全分辨率检查素材的画面和背景:他人的消息、车牌、街道名称、私人仪表盘 → 跳过这些秒数。
- 每条短视频使用全新素材(
used_footage.md)。使用包含他人面部的镜头前请先询问。