关于 reel
用于制作竖屏文字动画 Instagram Reel 的技能,可通过 Remotion 在本机渲染 MP4,并指导脚本编写、可选配音与音乐、预览检查和导出。
主要功能
- 01按场景编写 Reel 脚本
- 02通过 Remotion 本机渲染 MP4
- 03可选 ElevenLabs 配音
- 04生成与语音同步的动态字幕
- 05混入用户提供的音乐
- 06检查预览与导出成品
适用场景
- 01制作文字动画竖屏 Reel
- 02无需编辑应用即可渲染 Reel
- 03添加可选配音和自备音乐
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ andreoliveiras/ skills-de-conteudo --skill reel安装后在 Claude Code 中输入/reel确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.env.exemplo.gitignoreREADME.mdexemplos/cenas.exemplo.jsonscripts/_comum.mjschecar.mjsmixar.mjsnarrar.mjstemplate/cenas.jsonpackage.jsonremotion.config.tstsconfig.jsontemplate/public/LEIA.txttemplate/src/cenas.tsxfontes.tsxindex.tsLegenda.tsxReel.tsxRoot.tsxtempo.tstipos.ts详细介绍
在你的设备上直接渲染成片
只要提出类似“给我做一条关于跑步新手常犯的 3 个错误的 Reel,发在我的跑步账号上”的需求,你就能交付一条可直接发布的 Reel:包含开场钩子、逐场景脚本、旁白、配乐,以及用 Remotion 在本地渲染的竖屏 1080x1920 MP4。不会将任何内容发送到剪辑应用。
视频采用文字排版:深色背景搭配柔和光晕,场景中有大标题、编号列表、动态数字、前后对比卡片,以及最后的“评论关键词”区块;字幕在画面中央逐字显示,并交替使用粗体和斜体。
下面的 <skill> 是此技能的文件夹(SKILL.md 所在位置)。
前提条件
- Node 18 或更高版本(
node -v)。必需。 - ffmpeg(可选)。仅用于调整配乐音量。没有它,音乐会按原样加入。
Mac:
brew install ffmpeg。Windows:winget install ffmpeg。Linux:sudo apt install ffmpeg。 - ElevenLabs 密钥(可选)。没有密钥时,Reel 不会有旁白,只有动态字幕和配乐。
- 至少预留 600 MB 空间,用于 Remotion(只需安装一次)以及首次渲染时下载的浏览器。首次渲染需要联网,以下载 Google Fonts 字体。
工作流程:7 个步骤
1. 快速访谈(只发一条消息)
一次性询问所有问题,并在括号中给出默认建议,让对方可以用一行回答。如果对方在需求中已经提到某项内容,就不要重复询问。
- 领域和账号:账号的主题是什么?
- 受众:谁会观看?(该领域的新手)
- Reel 目标:扩大触达、方便收藏,还是引导评论以发送资料?(评论)
- CTA:对方评论什么关键词,会收到什么?(例如:“评论‘指南’,我就把指南发给你”)
- 语气:直接、讲解型、挑衅型,还是轻松?(直接)
- 声音和音乐:有 ElevenLabs 密钥吗?有音乐吗(自己的 MP3 或免费曲库中的音乐)?想用什么颜色?(无旁白、无音乐、深色主题搭配黄色重点)
绝不要让对方把密钥粘贴到聊天中。密钥应放在 .env 文件中(步骤 4)。
2. 开场钩子和脚本
先写内容,再编写任何代码,并以区块形式展示:开场钩子、编号场景(类型 + 屏幕显示内容 + 口播内容)以及预计时长。生成旁白前先征求确认,因为生成旁白会消耗 ElevenLabs 额度。如果不需要旁白,且对方要求“直接做”,就可以直接继续。
开场钩子(场景 1,最多 2 秒)
- 口播最多 6 或 7 个词。如果需要更多,就不是钩子,而是引言。
- 第一帧就显示完整钩子(
gancho类型会自动实现这一点)。 - 吸引人的形式:针对痛点提问(“每天训练却毫无变化?”)、反常识的断言(“每天发帖反而会拖累你”)、具体数字(“阻碍你跑完首个 5 公里的 3 个错误”)、强调后果(“这会让你在私信里失去客户”)。
- 不要说“大家好”“在这段视频里”“你知道吗”,也不要做个人介绍。
脚本(总时长 20 到 45 秒)
- 共 4 到 8 个场景。每个场景 1.5 到 6 秒:按每秒 2.9 个词计算,每个场景的口播为 5 到 17 个词。
- 口播要连贯,不要切得支离破碎。 按顺序读完所有场景的文本,听起来应像一个人连续说话:每个场景都要延续前一个场景的句子或意思。不要用单词句、用省略号“制造停顿”,也不要在没有动词的情况下口播列表。先写好完整连贯的文本,再拆分到各个场景中。
- 每个场景只讲一个观点。屏幕显示简短版本(标题、条目、数字);口播负责解释。
- 口播中的数字用简短的数字形式(“23 小时”“1.6 克”),让字幕更清晰。
- 只承诺真实内容。不要编造统计数据:如果没有来源,就换用其他场景类型。
- 最后一个场景始终是
cta,口播要说出关键词(“评论‘指南’,我就把分步教程发给你”)。
3. 搭建工作室(一次性)和短视频文件夹
工作室是一个安装了 Remotion 的文件夹;每个新短视频只需新建一个子文件夹并放入它自己的
cenas.json,因此 npm install 只需运行一次。
# primeira vez
cp -R <skill>/template ~/reels-estudio
cd ~/reels-estudio && npm install
# a cada reel (troque <slug> por um nome curto, ex.: 3-erros-corrida)
mkdir -p ~/reels-estudio/reels/<slug>/public
编写 ~/reels-estudio/reels/<slug>/cenas.json(格式如下)。工作室根目录中的
cenas.json 只是用于在 Studio 中打开的示例;无需修改。
4. 旁白(仅使用 ElevenLabs 密钥)
密钥保存在 ~/reels-estudio/.env 中(从 <skill>/.env.exemplo 复制):
ELEVENLABS_API_KEY=sua_chave
ELEVENLABS_VOICE_ID=id_da_voz # opcional
脚本会从环境变量或该 .env 文件中读取密钥,绝不会打印密钥。不要读取、展示密钥,
也不要将密钥复制到其他任何位置。
cd ~/reels-estudio
node <skill>/scripts/narrar.mjs --projeto reels/<slug> --simular # valida, mostra custo, não chama a API
node <skill>/scripts/narrar.mjs --vozes-pt # vozes pt-BR da biblioteca pública
node <skill>/scripts/narrar.mjs --projeto reels/<slug> # gera de verdade
- 务必先运行
--simular。它会验证cenas.json,并告知旁白将消耗多少字符(额度)。 - 语音:让用户自行选择。
--vozes-pt会列出公共语音库中的巴西葡萄牙语语音;要使用其中的语音,用户需要先在网站的 Voice Library 中将其添加到自己的账户("Add to my voices"),然后传入--voz <id>,或在.env中设置ELEVENLABS_VOICE_ID。--vozes会列出账户中已有的语音。如果用户没有选择,脚本会使用 ElevenLabs 的预设语音;该语音说葡萄牙语时带有非母语口音,请告知用户。 - 全文会通过一次调用发送(
/v1/text-to-speech/{voice_id}/with-timestamps),以保持语调连贯。每个字符的时间戳会转换为每个单词的时间戳(同步字幕)以及每个场景的时间戳。 - 输出:
reels/<slug>/public/narracao.mp3和public/palavras.json,并且cenas.json会更新为指向这些文件。使用相同文本和语音再次运行不会消耗额度;如需重新生成,使用--refazer。--velocidade 1.08可加快语速(范围为 0.7 到 1.2)。 - 旁白生成后如果修改了台词,请重新运行
narrar.mjs。 字幕来自音频。
没有密钥:跳过此步骤。短视频将不带语音,字幕会按照台词的估算时长(每秒 2.9 个单词)动画显示,并保留配乐(如果有)。
5. 配乐(仅在用户提供时使用)
音乐由用户提供:可以是用户自己的曲目,也可以来自免版税音乐库(YouTube Audio Library、Pixabay Music),并遵守每首曲目的许可条款。绝不要从“MP3 下载”网站、YouTube 视频或任何许可存疑的来源下载音乐,也不要建议用户这么做。没有配乐时,短视频将不带音乐。
node <skill>/scripts/mixar.mjs /caminho/da/musica.mp3 --projeto reels/<slug>
node <skill>/scripts/mixar.mjs /caminho/da/musica.mp3 --projeto reels/<slug> --inicio 12 # pula a introdução
如果装有 ffmpeg,脚本会将音乐剪辑至短视频长度(如果音乐较短则循环播放)、调整音量并添加淡入和淡出效果。如果没有 ffmpeg,则按原样复制。渲染时,配乐音量会较低,并且有语音时会自动降低(合成中的简单闪避处理)。音量由 cenas.json 中的 volumeTrilha 设置,范围为 0 到 1(有旁白时默认为 0.3,无旁白时默认为 0.8)。
如果用户在旁白生成后才提供音乐,请在 narrar.mjs 之后运行 mixar.mjs,这样剪辑时会采用实际时长。
6. 检查、预览和渲染
cd ~/reels-estudio
node <skill>/scripts/checar.mjs --projeto reels/<slug>
修正所有 ✖(错误)并查看 !(警告)。然后,渲染前预览 3 帧(开场钩子、中间部分、CTA)。从 narrar.mjs 的输出中获取时间,或将秒数乘以 30:
npx remotion still Reel out/<slug>-q1.png --props=reels/<slug>/cenas.json --public-dir=reels/<slug>/public --frame=30
npx remotion still Reel out/<slug>-q2.png --props=reels/<slug>/cenas.json --public-dir=reels/<slug>/public --frame=<meio>
npx remotion still Reel out/<slug>-q3.png --props=reels/<slug>/cenas.json --public-dir=reels/<slug>/public --frame=<fim-20>
打开图片,检查是否有文字被裁切、孤行或重叠。然后进行渲染:
npx remotion render Reel out/<slug>.mp4 --props=reels/<slug>/cenas.json --public-dir=reels/<slug>/public
30 秒的短视频需要 1 到 4 分钟。性能较弱的机器上可添加 --concurrency=2。如需快速草稿,可使用 --scale=0.5(输出分辨率为 540x960)。
7. 按照检查清单交付
交付 MP4 文件路径(~/reels-estudio/out/<slug>.mp4)、最终脚本和帖文说明文字建议。交付前,请确认并说明已检查:
- 对比度:字幕在背景上清晰易读(
checar.mjs会进行测量;最低要求为 4.5:1)。 - 没有画面静止超过约 3 秒:没有超过 6 秒的场景,也没有长时间停顿且无字幕的情况。
- 开场钩子在 2 秒内出现,并且在第一帧中已经可见。
- 结尾包含 CTA,在画面和台词中都出现正确的词语。
- 时长介于 20 到 45 秒之间。
- 有语音时:字幕与台词相符(查看 MP4 中间的一段)。
-
out/中的 PNG 预览图可以删除。
cenas.json
{
"cores": { "fundo": "#0E0F12", "texto": "#F4F4F2", "destaque": "#FFC94A", "suave": "#9A9CA3", "sobreDestaque": "#0E0F12" },
"fonte": "Inter",
"fonteItalica": "Instrument Serif",
"legenda": true,
"narracao": null,
"palavras": null,
"trilha": null,
"cenas": [
{ "tipo": "gancho", "titulo": "Treina todo dia e nada muda?", "destaque": "nada muda",
"fala": "Treina todo dia e nada muda?" },
{ "tipo": "titulo", "titulo": "O problema não é o treino.", "subtitulo": "É o que acontece nas outras 23 horas.",
"fala": "O problema quase nunca é o treino, é o que você faz nas outras 23 horas." },
{ "tipo": "lista", "titulo": "Os 3 vilões",
"itens": ["Dormir menos de 7 horas", "Comer pouca proteína", "Repetir a mesma carga"],
"fala": "São três vilões: dormir menos de sete horas, comer pouca proteína e repetir a mesma carga por meses." },
{ "tipo": "numero", "de": 0, "ate": 1.6, "decimais": 1, "sufixo": " g", "rotulo": "de proteína por quilo de peso, por dia",
"fala": "Uma referência comum para quem treina é 1,6 grama de proteína por quilo, todo dia." },
{ "tipo": "antes-depois", "antes": "Treino novo toda semana", "depois": "Mesmo treino, carga subindo",
"fala": "Em vez de trocar o treino toda semana, mantenha o mesmo e suba a carga." },
{ "tipo": "cta", "chamada": "Comenta", "palavra": "PLANO", "promessa": "que eu te mando o checklist das 23 horas",
"fala": "Comenta PLANO que eu te mando o checklist das 23 horas." }
]
}
相同示例也位于 <skill>/exemplos/cenas.exemplo.json。
场景类型
所有场景都有 fala(必填)和以秒为单位的 duracao(可选;仅在没有旁白时生效)。
| 类型 | 字段 | 用途 |
|---|---|---|
gancho | titulo、destaque | 第一个场景。大标题;destaque 是以强调色显示的斜体片段。如果标题与台词相同,字幕不会重复显示。 |
titulo | titulo、subtitulo、destaque | 有力的陈述。标题最多约 50 个字符。 |
lista | titulo、itens(2 至 5 项) | 列表项逐个显示,并带有编号。每项最多约 30 个字符。 |
numero | ate、de、prefixo、sufixo、decimais、rotulo | 数字递增至指定值。例如:"prefixo": "R$ "、"sufixo": "%"。 |
antes-depois | antes、depois、rotuloAntes、rotuloDepois | 两张卡片;「之后」在场景中段出现并突出显示。 |
cta | palavra、chamada、promessa | 最后一个场景。「评论」+ 方框中的关键词 + 对方会收到的内容。关键词最多 9 个字母。 |
颜色和字体
cores:任意#rrggbb颜色。默认采用深色中性色搭配黄色强调色。使用浅色主题时,反转fundo和texto,并选择足够深的destaque。checar.mjs会拒绝对比度过低的配色。fonte和fonteItalica:Google Fonts 字体系列名称(例如"Montserrat"、"Playfair Display")。fonte必须有 900 字重。使用"sistema"则不会下载字体。如果字体系列不存在或没有网络,渲染将使用系统字体。legenda: false会关闭逐词字幕。
常见问题
- 「palavras.json 与 cenas.json 不属于同一版本」:旁白生成后,台词发生了变化。请重新运行
narrar.mjs。 - ElevenLabs 401:密钥错误,或没有文本转语音权限。404:该声音不在账户中;请通过 Voice Library 添加。
- 文字超出屏幕:缩短标题或列表项;
checar.mjs会提示过长的内容。 - 渲染缓慢或卡住:使用
--concurrency=2,关闭浏览器,并检查磁盘空间。 - 首次渲染耗时更长:Remotion 会下载无头浏览器(只需下载一次)。
此 skill 不会执行的操作
- 不拍摄,也不使用录制的视频、图像或虚拟形象:短视频是文字排版形式(文字、数字、卡片)。如需编辑影片,请使用其他工具。
- 不克隆声音,也不会在没有本人 ElevenLabs 密钥的情况下生成语音。
- 不选择或下载音乐:配乐始终由用户提供。
- 不发布到 Instagram,也不安排帖子发布时间。
- 音量闪避效果很简单(有台词时会降低音乐音量),无法替代专业混音。