Reel Studio — 视频的制作流程
每种风格的制作流程都是相同的。视频的外观和声音来源于其风格;而视频的受众、格式、语音以及图片来源则来自于工作室的设置。通用的 animated-video 技能涵盖了更广泛的方法(头脑风暴、故事板、静音测试、评审);在本技能与风格技能有分歧的地方,以本技能和风格技能为准。提问时最好附带推荐,这样回答“是”就是完整答案。构思想法并将其保存到项目的看板上是 content-ideas 技能的工作,在本流程开始之前进行。
工作区
projects/<id>/— 一个项目:创作者为其制作视频的一个频道(工作室的项目选择器;提示会说明当前打开的是哪个项目)。其config/目录保存了设置:profile.json、voice.json和account.json(其Instagram、我的账户);account/保存了从该账户下载的内容。除非被要求,否则不要触碰其他项目的文件夹。projects/<id>/videos/<slug>/— 一个视频:从风格模板复制而来的Remotion项目。包含:title.txt(在工作室中的名称)、style.txt(风格ID)、audio/vo.txt(旁白,完全按照语音朗读的原文)、audio/beats.json(脚本结构)、src/format.json(尺寸、帧率、响度)、CREDITS.md、caption.md、out/(渲染结果、故事板;不进行版本控制)。formats/<id>/format.json— 格式:视频类型(完全为动画并配合生成的语音或创作者的录音;创作者对着摄像头说话并配合动画……)、屏幕上显示的内容以及剪辑方式。视频在format.txt中指定其格式(无则默认为动画)。skill指向其自己的指令,overlay指向添加到风格模板上的文件;"footage": true表示视频从footage/中的录音开始("voiceOnly": true:仅使用其声音——音频)。styles/<id>/style.json— 风格:调色板及每种颜色的含义、字体、外观、动作、图像、应避免的内容。skill指向其自己的指令,template指向新视频复制的Remotion项目。config/(根目录)— 所有项目共享的设置:images.json(图片来源)、social.json(抓取器)。tools/— 共享脚本。LESSONS.md— 过往视频中的经验教训。projects/<id>/inspiration/<account>/— 在项目的“灵感”页面中研究的其他账号的短视频:account.json(analysis.text:对该账号有效的内容)以及每个短视频的reel.json(指标、标题)、transcript.json、analysis.json(钩子开头、结构、视觉元素、行动号召、可借鉴之处)、hook.jpg(前3秒)和sheet_NN.jpg(1帧/秒)。在被要求时可以使用它们来构思角度和钩子开头,但必须根据创作者的个人资料进行调整,绝不抄袭脚本。
设置来源于工作室
Reel工作室会在每次对话中,将个人资料(语言、平台、观众、视频长度、标题规则)、视频格式、语音和图片来源放入你的提示中。这些设置优先于本技能和风格技能。切勿硬编码语音ID或设置、尺寸、帧率或响度目标。
API密钥存储在工作区的 .env 文件中(在“设置”中设置,旁边注明各自的用途:语音、数据提取)。工具会读取这些密钥;绝对不要在聊天中打印密钥或索要密钥——如果缺少某个密钥,请要求创作者在“设置”中添加。
Python:仅使用标准库的工具使用 python3 运行(Windows使用 python):tts.py、el_words.py、standin_words.py、commons.py、openverse.py、pexels.py、pixabay.py、unsplash.py、generate_image.py。需要第三方包的工具使用工作区的虚拟环境运行:../../../../.venv/bin/python(Windows:../../../../.venv/Scripts/python.exe):cutout.py、audio/mix.py 和 sheet.py(snap.sh 会调用它,如果没有虚拟环境则使用ffmpeg)。需要抠图的风格需要虚拟环境(设置 → 依赖项进行安装)。以下路径均相对于视频文件夹。
开始之前
读取视频的格式:formats/<来自 format.txt 的ID>/format.json,如果有格式技能也一并读取——它说明了此类视频的制作方式,并在有分歧处优先于以下步骤(例如,使用创作者的录音时,无需编写脚本或生成语音:剪辑提供了两者)。读取视频的风格:styles/<来自 style.txt 的ID>/style.json,如果有风格技能也一并读取。读取 LESSONS.md(通用部分和风格部分)。没有技能或模板的风格基于默认风格的模板(template/)构建,通过其 style.json 更改外观;开始时请说明这一点。
步骤
- 新建视频 — 工作室根据第一条消息创建视频(文件夹、标题、风格、格式、尺寸)。通过终端或通用对话执行:
scripts/new-video.sh <slug> [style] [format]。 - 脚本 — 使用
video-script技能(钩子开头、保留答案、计时、检查清单),如果想法来自看板,则从该想法的笔记开始。平台、语言、受众和时长来自个人资料;字数 ≈ 语音的测量速度 × 目标秒数。目标:触达,除非另有说明。在audio/vo.txt中将数字拼写出来(“一千零四十二”),并在src/captions.ts的DISPLAY中将其映射回数字。获得批准。编写audio/vo.txt和audio/beats.json。 - 图片 — 使用一个新的Agent构思每个节拍的图片(animated-video → 查找图片)。优先选择一个贯穿整部影片的、能够体现其系统机制的反复出现的实体主题(例如,卡片目录柜=服务器,抽屉=记录)。图片要保持脚本问题的开放性:第一帧提出问题,在旁白到达之前,任何图片或屏幕上的标题都不应显示答案。获得概念批准。
- 语音 — 执行
python3 ../../../../tools/tts.py audio/vo.txt audio/vo.mp3,然后是ffmpeg -y -i audio/vo.mp3 -ar 48000 public/vo.wav和python3 ../../../../tools/el_words.py audio/vo.alignment.json public/vo.wav(生成src/words.json、src/vo_env.json)。在语音生成之前:执行python3 ../../../../tools/standin_words.py audio/vo.txt src/words.json(按语音速度计时;称之为占位)。如果语音有任何变化,先制作一个简短样本。按原样使用音频(除非要求,否则不要修剪停顿)。每次生成都会消耗字符:没有理由就不要重新生成。 - 图像 — 使用可用的搜索和浏览工具在网络上自由搜索;任何网站都可以是来源。提示中列出了可选的API集成,这不是允许列表或强制顺序。仅在启用并配置后使用这些API;免费网络搜索不需要来源设置。下载文件放入
assets/src/(不进行版本控制);在CREDITS.md中记录每张图像(标题、作者、已知许可证、原始链接;切勿编造许可证)。当图库无法满足需求时,请求拍摄精确手势的手机照片(纯色背景、良好光线)。图像的处理方式由风格决定。 - 构建 — 在
src/lib.ts中操作ACTS(在每个动作第一个单词前约0.08秒处剪切)、在src/captions.ts中将字幕作为语义单元处理(逐词对照转录文本进行核对)、在src/film/scenes.tsx中每动作创建一个场景。每次时间点都来自一个提示(cue('phrase')、at('phrase')),因此新的语音会重新调整影片的计时。尺寸和帧来自src/lib.ts(W、H、FPS、f()),绝不使用字面数字。组件属于风格。 - 故事板 — 执行
./snap.sh out/board <sec> …渲染静态帧和sheet.png。展示每个节拍的关键帧;获得批准。直接传递时间参数(在zsh中,一个变量中的空格分隔列表不会自动拆分)。 - 音效 —
audio/mix.py中的提示单,使用与场景相同提示的时间;执行../../../../.venv/bin/python audio/mix.py→public/mix.wav;在src/Root.tsx中设置audio: true。使用哪些音效:由风格决定。交付时说明哪些音效是合成的。 - 静音测试 — 在首次完整剪辑之前:执行
ffmpeg -i out/<name>.mp4 -vf "fps=2,scale=270:-1,tile=8x5" out/mute/sheet_%02d.png,并将这些静帧图像交给一个新的Agent(忽略字幕;重新叙述;列出困惑点和断裂处)。修复后,重新检查静态帧。 - 渲染 — 在macOS和Linux上,先清理孤立的渲染器进程:
ps -A -o pid=,ppid=,command= | awk '$2==1 && /chrome-headless-shell/ {print $1}' | xargs kill。然后执行CONCURRENCY=3 ./render.sh <name>→out/<name>.mp4,标准化为格式指定的响度。检查时长、响度、首帧和末帧。使用个人资料中的标题规则和致谢编写caption.md;其开头应提出钩子开头的问题,而不是回答它。如果视频或标题要求用户评论某个词以获取内容,则编写automatizacion.json(Reel Studio → 自动化指令),以字符串形式包含要粘贴到ManyChat或InstantDM中的内容:keyword(确切的词)、reply(对评论的公开回复)、dm(私信)和link。按原样复制每条内容,因此里面不要包含注释;留空缺失的内容,绝不编造链接。报告路径、未解决的问题、跳过的检查、哪些是合成或编造的,以及致谢。
视频制作完成后
客户项目、视频、偏好、自定义风格和个人经验教训均保存在本地,并且被应用程序的仓库忽略。不要将它们提交或推送到那里,包括在渲染之后;绝对不要强制添加被忽略的数据。客户内容的单独仓库需要创作者的明确请求。
将导致返工的内容添加到 LESSONS.md 中,每行一条原因,位于通用部分或风格部分之下。
当已发布视频的数据回来时,使用 video-script → 评审读取它们。从想法到发布的速度很重要,因为很多视频会失败,而每个视频都能教会一些东西,因此新版本应尽可能少地改动:保留已批准的内容,只更改正在测试的部分(新的钩子开头、在观众离场处的剪辑),并且只为发生变化的旁白重新生成语音。不要添加没人要求的额外修饰。