旁白 → 玻璃帧视频
一步输入,一步输出完成的MP4。用户提供一个旁白文件(任意音频或视频格式,最长约3分钟)以及可选的脚本文字、主题说明或参考链接。你负责其余所有工作,仅在以下情况停止:
- 一次用于下载Logo等素材。没有信用额度预算:所有素材免费获取(参见
references/higgsfield.md——经过测试的Pixabay / Wikimedia / thesvg方法)。报告素材来源,但除非用户明确要求付费附录,否则绝不谈及费用。
在聊天中使用用户的语言。屏幕上的一切内容使用旁白的语言。
产出内容
将任意旁白(及可选脚本)通过一次请求转化为After Effects中完整的16:9纪录片风格视频。它会剪辑停顿和呼吸声,编写视觉故事,免费获取所有图片(Wikimedia Commons档案照片、Pixabay MCP片段和肖像、thesvg MCP的Logo SVG、ffmpeg 静态图像Ken Burns动态效果),并原生在After Effects中构建编辑。视觉效果:暗调档案纪录片,每个片段置于浮动的圆角玻璃框架中,带有细发光边框和平滑推入效果;动态透视网格,关键词随文字翻转颜色;大号字幕;打字机/大词/照片卡片页面;剪辑处的闪白和负片闪烁;合成音效。渲染输出1080p H.264 MP4。当用户提供旁白、语音备忘录、叙述或播客片段并请求制作视频、短片、短视频、解说或编辑时使用:"用我的旁白做个视频"、"把这段叙述做成视频"、"玻璃帧编辑"、"从旁白剪一段"、"用我的录音做视频"、"按我的语音剪辑视频"、"玻璃帧和网格"。即使他们没有素材也没问题。
开始前(每台Mac检查一次;如有失败,告诉用户具体修复内容)
- macOS 26或更新版本(设备端转录)且After Effects 2024或更新版本,打开。在AE中,启用设置 → 脚本和表达式 → 允许脚本写入文件和访问网络。
- Xcode命令行工具(
swiftc)。运行scripts/build_tools.sh。它会编译scripts/bin/{to_wav,transcribe,facebox,frames}。如果脚本因"权限被拒绝"失败(上传的技能可能丢失可执行权限),在该技能文件夹中运行一次chmod +x scripts/*.sh。 - 免费素材准备就绪:
pixabay和thesvgMCP工具(search_pixabay_images、search_pixabay_videos、search_icons、list_variants、get_icon_url、get_icon)以及curl和ffmpeg(引擎已使用)。Wikimedia Commons只需网络连接 + 正确的User-Agent。无需信用额度、无需账户、无需检查余额。 - 第一次运行
transcribe可能会请求语音识别权限。也可能一次性下载设备端模型。 - 如果另一个AE项目打开且未保存更改,
build.sh会拒绝。请用户保存。绝不丢弃他们的工作。构建日志会打印PREVIOUS_PROJECT <path>当关闭用户已保存的项目时。最终渲染后,重新打开它:写一行jsxapp.open(new File("<path>"));并用scripts/ae_run.sh运行。
S = 此技能文件夹。PY = /usr/bin/python3(或任意Python 3.9+,仅标准库)。
流程
1. 项目文件夹和语音
- 创建
<proj>= 在旁白文件旁新建一个名为<旁白文件名>_reel的文件夹。 - 运行
PY S/scripts/reel.py prep <voiceover> <proj>。它会转换音频,在Mac上转录,并移除所有停顿和呼吸声。结果存储在work/voice_cut.wav和work/words.json(单词索引 → 节目时间)。 - 然后运行
PY S/scripts/reel.py words <proj>并阅读整个索引转录文本。 - 如果用户提供了脚本,将其与转录文本比较。记下拼写错误的名称,用于
spell(例如"28": "Grok")。
2. 故事(阅读references/story.md,然后编写<proj>/story.json)
- 决定适合脚本的世界:时代、地点、2-5个角色的固定演员阵容、3-6个地点、黑白或彩色。
- 默认:黑白1950-60年代档案纪录片风格,抽象主题变成人和地点。
- 选择主持人的外观。当用户希望自己出镜时,使用其照片作为主持人参考。
- 将转录文本切分为镜头。每个镜头从一个单词索引开始。
- host(对着电视摄像机的对话):3-6个镜头,每个2-6秒。用于钩子、转折和行动呼吁。总时长约占运行时间的15-20%。
- clip(玻璃框架中生成的素材):大部分镜头,每个1.5-3秒。
- type(打字机页面):开场问题或章节标题,最多6个单词。
- giant(一个巨大的单词,带有红色标签和衬线的副标题行):一个命名的概念。
- cards(2-4张照片卡片,带有Logo徽章,每个单词上有一个名称):当语音列出人物、产品或品牌时。Logo仅在提及它们时出现。
- list:当语音列出2-4个要点时,标记该单词范围。其关键词会翻转成强调色。
- keys:每句话最多一个。
- hits:在3-6个戏剧性剪辑处使用
invert,最多2个"事情变得更疯狂"的时刻使用strobe,最多2个高潮处使用burn。 - 绝不重复显示相同的片段瞬间。
- 根据镜头编写素材清单:
- 每个故事片段为8-12秒的素材片段(或对免费静态图像的Ken Burns平移),覆盖连续的镜头,因此一个片段通过不同的
in时间提供多个镜头; - 卡片肖像、地点和任何主持人素材——全部免费获取;
- 可选背景音乐(或没有:当缺少
music时,构建会跳过)。
- 每个故事片段为8-12秒的素材片段(或对免费静态图像的Ken Burns平移),覆盖连续的镜头,因此一个片段通过不同的
3. 获取素材(阅读references/higgsfield.md)
- 按此顺序获取:故事片段 → 卡片肖像 → 地点 → (如果保留)电视面板 → (如果保留)主持人片段。按照经过测试的方法验证每个下载(HEAD
content-type+content-length,curl-AUA + 重试,如果Commons提供则使用SHA-1)。记录文件 → 来源URL → 许可证 → 作者到work/SOURCES.md。 - 故事片段:Pixabay
search_pixabay_videos(video_type: "film",匹配方向,时长8-15秒)或Commonsfiletype:video(imageinfo→ 使用curl方法下载→转码Talks.ogv/.webm为MP4)。静态图像使用ffmpeg方法变成Ken Burns.mp4。 - 主持人片段(仅当用户自己出镜时):
PY S/scripts/reel.py chunks <proj>将每个主持人镜头的音频块写入work/host/host_NN.wav;- 将音频块合成到他们的网络摄像头片段上,保存为
assets/host/host_NN.mp4(ffmpeg -map 0:v:0 -map 1:a:0 -shortest)-reel.py align然后精确匹配单词; PY S/scripts/reel.py align <proj>测量每个片段相对于单词的偏移量。 无自有素材 → 将这些主持人节拍重组为type/giant/cards页面。
- 如果使用电视面板,运行
PY S/scripts/reel.py screen <proj>/assets/tv_plate.png <proj>。它会找到绿屏。如果未找到,重新绘制(ffmpeg drawbox,参考文档§2)或将主持人镜头切换为full模式——无需面板。 - 运行
PY S/scripts/reel.py sfx <proj>合成音效(无需许可证)。 - 音乐:省略
music(默认),使用用户的曲目,或将Commons音频文件转换为MP3。
4. 构建和检查
- 运行
PY S/scripts/reel.py plan <proj>。它会写入work/plan.json并打印检查结果。修复story.json中的所有ERROR。认真对待WARN:重复的片段、主持人口型同步问题。 - 运行
S/scripts/build.sh <proj>。它会构建<proj>/reel.aep(合成REEL),对于70秒的视频大约需要1分钟。读取日志:使用的字体、警告。 - 运行
S/scripts/render.sh <proj> --half进行快速检查(约2分钟)。然后检查帧:S/scripts/bin/frames <proj>/out/reel_half.mp4 <proj>/work/check.jpg 4 <约16个镜头中间秒>;- 查看
check.jpg:字幕可读且不覆盖面部、主持人在电视内嘴唇活动、玻璃框架存在、无黑色间隙、页面不为空。 在story.json中修复,然后重新运行plan、build和检查。
- 最终: 运行
S/scripts/render.sh <proj>。它会写入<proj>/out/reel_1080.mp4(1920×1080,25 fps,约40 Mbps,含声音)。 - 发送MP4。报告:
- 其长度;
- 无法验证的内容;
- 手动调整的位置(
reel.aep:每个镜头在02_SHOTS/03_PAGES中有自己的合成,字幕在CAPTIONS中)。
规则
- 版权:
- 所有素材免费获取:Pixabay MCP、Wikimedia Commons(检查每个文件的许可证)、thesvg MCP用于Logo,以及本地合成(ffmpeg Ken Burns、
reel.py sfx)。默认不使用付费服务;Higgsfield附录仅在用户明确要求时使用。 - 绝不抓取电影、系列、广告或其他人的社交帖子。
- Logo仅来自thesvg MCP或Wikimedia Commons,且仅在用户同意后使用。
- 音乐可选(省略、用户自有曲目、或将Commons文件转换为MP3)。
- 音效由
reel.py sfx合成。
- 所有素材免费获取:Pixabay MCP、Wikimedia Commons(检查每个文件的许可证)、thesvg MCP用于Logo,以及本地合成(ffmpeg Ken Burns、
- 语音是时钟。
- 每个剪辑点落在单词上,在其前一个帧处。
reel.py实现这一点。 - 绝不改变速度或单词。
- 字幕精确显示所说内容,除了
spell修正的拼写错误名称。
- 每个剪辑点落在单词上,在其前一个帧处。
- 人物:
- 朴素、符合时代服装;
- 写实的成年人;
- 角色不使用真实公众人物;
- AI模型和公司以虚构角色呈现,仅通过字幕和Logo命名。
- 重跑成本低。
plan和build是确定性的,从头重建reel.aep。更改story.json,而非手动编辑reel.aep,除非用户要求手动编辑。一旦用户自行编辑了reel.aep,未经询问绝不覆盖重建。 - AE一次只运行一个脚本。
- 仅使用
scripts/ae_run.sh、build.sh和render.sh。 - 退出码4表示AE仍然忙碌:等待,绝不重新发送。
- 退出码6表示AE未启动脚本:是否有对话框打开?
- 仅使用
文件
| 路径 | 说明 |
|---|---|
scripts/reel.py | prep / words / chunks / align / screen / sfx / plan(仅标准库) |
scripts/build.sh、scripts/ae/build_reel.jsx、scripts/ae/reel_lib.jsx | After Effects构建 |
scripts/render.sh | aerender输出H.264(--half用于检查) |
scripts/ae_run.sh | 向运行的AE发送一个脚本并等待 |
scripts/tools/*.swift → scripts/bin/ | 音频转换、设备端转录、人脸框、帧图 |
references/story.md | story.json格式、镜头规则、完整示例 |
references/higgsfield.md | 免费素材获取手册:经过测试的Pixabay / Wikimedia / thesvg检索和验证方法、按素材映射、付费生成附录 |
references/look.md | 构建绘制的内容(尺寸、时间、颜色)以及如何调优 |
references/troubleshooting.md | 错误和修复 |
references/example_story.json | 已完成70秒视频的story.json(EXPERIMENT测试) |
PROMPT.md | 如何安装技能以及发送的提示词 |