mcpField
R
reel

reel

github.com/andreoliveiras创意与媒体28184 次安装3 周前更新
代码仓库

关于 reel

用于制作竖屏文字动画 Instagram Reel 的技能,可通过 Remotion 在本机渲染 MP4,并指导脚本编写、可选配音与音乐、预览检查和导出。

主要功能

  1. 01按场景编写 Reel 脚本
  2. 02通过 Remotion 本机渲染 MP4
  3. 03可选 ElevenLabs 配音
  4. 04生成与语音同步的动态字幕
  5. 05混入用户提供的音乐
  6. 06检查预览与导出成品

适用场景

  1. 01制作文字动画竖屏 Reel
  2. 02无需编辑应用即可渲染 Reel
  3. 03添加可选配音和自备音乐

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/andreoliveiras/skills-de-conteudo --skill reel

安装后在 Claude Code 中输入/reel确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.env.exemplo
.gitignore
README.md
exemplos/
cenas.exemplo.json
scripts/
_comum.mjs
checar.mjs
mixar.mjs
narrar.mjs
template/
cenas.json
package.json
remotion.config.ts
tsconfig.json
template/public/
LEIA.txt
template/src/
cenas.tsx
fontes.tsx
index.ts
Legenda.tsx
Reel.tsx
Root.tsx
tempo.ts
tipos.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. 快速访谈(只发一条消息)

一次性询问所有问题,并在括号中给出默认建议,让对方可以用一行回答。如果对方在需求中已经提到某项内容,就不要重复询问。

  1. 领域和账号:账号的主题是什么?
  2. 受众:谁会观看?(该领域的新手)
  3. Reel 目标:扩大触达、方便收藏,还是引导评论以发送资料?(评论)
  4. CTA:对方评论什么关键词,会收到什么?(例如:“评论‘指南’,我就把指南发给你”)
  5. 语气:直接、讲解型、挑衅型,还是轻松?(直接)
  6. 声音和音乐:有 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(可选;仅在没有旁白时生效)。

类型字段用途
ganchotitulo、destaque第一个场景。大标题;destaque 是以强调色显示的斜体片段。如果标题与台词相同,字幕不会重复显示。
titulotitulo、subtitulo、destaque有力的陈述。标题最多约 50 个字符。
listatitulo、itens(2 至 5 项)列表项逐个显示,并带有编号。每项最多约 30 个字符。
numeroate、de、prefixo、sufixo、decimais、rotulo数字递增至指定值。例如:"prefixo": "R$ "、"sufixo": "%"。
antes-depoisantes、depois、rotuloAntes、rotuloDepois两张卡片;「之后」在场景中段出现并突出显示。
ctapalavra、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,也不安排帖子发布时间。
  • 音量闪避效果很简单(有台词时会降低音乐音量),无法替代专业混音。

评论

支持 Markdown