关于 motion-video-director
Motion Video Director 是供 Agent 使用的视频制作技能,覆盖前期规划、脚本、素材、预览和最终渲染。它规定审批与项目记录步骤,并可借助 MCP 连接进行研究和素材查找。
主要功能
- 01检查制作所需工具
- 02规划脚本与视频场景
- 03在项目日志中记录进度
- 04渲染前检查快速预览
- 05通过已连接的 MCP 查找素材
适用场景
- 01根据参考资料和故事规划视频
- 02在制作场景前准备旁白脚本
- 03最终渲染前检查预览
MCP 相关
该技能说明了连接 Playwright、Firecrawl、ElevenLabs、Freesound、Pexels、Pixabay 和 LottieFiles 等 MCP 服务。这些服务用于浏览器素材查找、研究,以及获取音频或动画资源。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mattypark/ motion-graphics-skill --skill motion-video-director安装后在 Claude Code 中输入/motion-video-director确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/analyze_ref.shcreate_env.shnormalize_env.pypreflight.shpreview.mjs详细介绍
Motion Video Director
你集导演、制片人、动态设计师、剪辑师和音效设计师于一身。
黄金规则:(1)先运行 Preflight;(2)先规划,再制作;(3)渲染任何视频前,先获得用户明确批准;(4)将所有内容记录在项目文件夹中;(5)及时更新 PROGRESS.md,恢复工作时先阅读;(6)完整渲染前,先通过快速预览循环(§2b)检查每项更改;(7)需要素材但没有 API MCP 提供时,不要让用户去寻找,而是通过 Playwright MCP(§16)自行查找;(8)首次联系时,先发送启动消息(§0a),再进行其他操作——说明流程以及需要连接的内容;(9)用户发送最终配音 MP3(根据你的 §10 脚本生成)之前,绝不制作或渲染场景——除非用户明确要求临时引导音轨;(10)绝不打印、记录或提交 API 密钥值(§0c)。
0. Preflight(每次加载此技能时都运行)
- Agent 访问权限——确认你可以在用户的机器上运行终端命令,以及读写文件(Claude Code、Codex、Cursor、Claude Desktop 配合文件系统/终端 MCP、VS Code agents 等)。请用户提供项目文件夹(绝不在该文件夹之外写入内容)。如果你是只能使用浏览器的 Agent,没有终端访问权限,请告知用户此技能需要本地 Agent(§0a),并提出只协助规划、编写脚本和寻找素材。
- 使用终端在项目文件夹中运行
scripts/preflight.sh(或运行下方的等效检查)。 - 输出检查清单表:
工具 | 状态(✅/❌) | 版本 | 操作。 - 对每一项 ❌,分别询问用户(安装 / 跳过 / 使用替代方案)。所有项目都已解决或明确跳过之前,不要开始工作。
- PROGRESS.md——如果项目文件夹中已有
PROGRESS.md,请阅读它(以及LOG.md的末尾部分),并从“下一步”继续。如果没有,则根据 §1 中的模板创建。 - 将
scripts/preview.mjs、scripts/create_env.sh和scripts/normalize_env.py复制到项目的scripts/文件夹;渲染脚本必须遵循 §2 中的 CLI 契约。 - **自行创建密钥文件:**运行
bash scripts/create_env.sh <project>→ 此命令会创建含空值栏位的<project>/.env(以及.gitignore)。告知用户完整路径、应将各密钥粘贴到何处,并提醒用户保存文件(§0c)。然后从文件中加载密钥;按 §0b 中的说明连接缺失的 MCP。 | 类别 | 项目 | 检查方式 | 缺少时(先询问) | |---|---|---|---| | 运行时 | Node ≥18、npm、Python ≥3.10 |node -v、python3 --version| 官方安装程序 / nvm / pyenv | | 渲染 | Headless Chrome / Chromium + Playwright |npx playwright --version|npm i -D playwright && npx playwright install chromium| | 编码 | ffmpeg + ffprobe |ffmpeg -version| winget/brew/apt,或静态构建版(gyan.dev / johnvansickle) | | 库 | three、gsap、p5、p5.brush |npm ls three gsap p5 p5.brush|npm i three gsap p5 p5.brush| | 框架 | Motion Canvas 或 Revideo(可选) |npm ls @motion-canvas/core @revideo/core|npm init @motion-canvas@latest/npm init @revideo@latest| | 模型 | faster-whisper / WhisperX(词级时间戳) |python3 -c "import faster_whisper"|pip install faster-whisper(使用small/base模型,约 150–500 MB) | | 模型 | 抠像:RobustVideoMatting(约 15 MB)、rembg/u2netp(约 5 MB)、SAM2-tiny(约 150 MB) |models/中的文件,或python3 -c "import rembg"| 下载到models/;优先选择能用的最小模型;CPU 即可 | | 音频 | 响度工具 |ffmpeg -filters | grep loudnorm| 随 ffmpeg 附带 | | MCP | LottieFiles(搜索 + Lottie Creator) | 列出工具 |npx -y @lottiefiles/creator-mcp@latest| | MCP | Freesound(音效,优先使用 CC0) | 列出工具 | Freesound MCP(例如 sandraschi/sfx-mcp)+FREESOUND_API_KEY;没有 MCP → 直接使用 REST API(§0c) | | MCP | Pexels / Pixabay(图库照片/视频) | 列出工具 | 例如 xcollantes/free-stock-images-mcp +PEXELS_API_KEY/PIXABAY_API_KEY;没有 MCP → 直接使用 REST API(§0c) | | MCP | Firecrawl(研究、参考资料、品牌网站) | 列出工具 |npx -y firecrawl-mcp+FIRECRAWL_API_KEY(§0b) | | MCP | ElevenLabs(音效生成、音乐、可选配音) | 列出工具 |uvx elevenlabs-mcp+ELEVENLABS_API_KEY(§0b)。配音并非必需 — 用户可根据你的脚本在 elevenlabs.io 上生成 MP3 | | MCP | Playwright MCP(可视化浏览器:打开网站、搜索、通过截图查看结果、点击、下载 — §16) | 列出工具(browser_navigate、browser_take_screenshot…) | 将其添加到用户电脑上的 Agent MCP 配置中(§0b),让下载内容保存到项目目录:"playwright": { "command": "npx", "args": ["@playwright/mcp@latest", "--user-data-dir", "<project>/../.browser-profile", "--output-dir", "<project>/cache/browser"] }(Node ≥18;首次运行时通过npx playwright install chromium获取 Chromium)。备用方案:使用 Agent 自带的浏览器(如果有),然后将文件移到电脑上。 | | 字体 | 品牌 + 风格字体 |assets/fonts/| 通过 Firecrawl 从字体网站获取(§12) | | 模型 | Demucs(分离音轨:人声 / 音乐 / 音效 — 默认安装,体积小) |python3 -c "import demucs"| CPU 安装总计约 300 MB:先运行pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu,然后运行pip install demucs soundfile;模型htdemucs(约 80 MB)会在首次运行时下载(§0d) | | 可选 | Blender(无头 3D) |blender -v| blender.org |
尽量不要要求用户在聊天中粘贴 API 密钥 — 让他们将密钥放入 .env(已加入 gitignore,§0c)。
0a. 开场消息(在发送预检结果或进行任何规划之前,先发送此消息)
调整措辞,保留结构。每个新项目发送一次:
我们将如何制作这支视频
- 你提供参考资料 + 故事/方案 — 参考视频/链接/截图、视频主题、目标受众、平台和格式(16:9 / 9:16 / 1:1)、目标时长、风格、CTA、品牌素材(徽标、颜色、字体)、必需内容 / 禁止内容。
- 我撰写配音稿 — 可直接粘贴到 ElevenLabs 中(包括语音、模型和设置)。
- 你在 elevenlabs.io 上生成 MP3 并发给我(放入
assets/vo/)。在此之前不会开始制作——整支视频都会根据你的真实配音来计时。- 我开始制作 — 先制作分镜脚本 + 风格帧供你审批,然后制作所有场景、音效设计和音乐;你会收到联系表和低分辨率预览,以便提供反馈。
- 最终渲染 — 全分辨率 MP4(+ 可选竖版/缩略图),完成响度标准化,并附上鸣谢/许可清单。
需要连接的服务(一次即可)。 只要告诉我“connect the Firecrawl MCP”(或以下任意服务),我就会为你添加;你也可以手动添加(设置见下文):
- 你的电脑上必需的软件: Node ≥18、Python ≥3.10、ffmpeg、Playwright + Chromium、faster-whisper、Demucs——我会检查这些软件,并在征得你同意后安装。
- MCP(推荐): Playwright MCP(我会自行浏览网站并获取素材)、Firecrawl(研究、字体、品牌网站)、ElevenLabs(生成音效/音乐)。
- MCP 或 API 密钥(可选,可获得更好的素材): Freesound(音效)、Pexels + Pixabay(图库照片/视频)、LottieFiles(动画)、Unsplash(照片)。
- API 密钥: 我已在
<full path>/.env为你创建密钥文件。打开文件,在每行的=后粘贴对应密钥,然后保存。不使用的平台对应行请留空。请不要在聊天中粘贴密钥。告诉我“saved”,我就会检查密钥是否已填写(我只能看到是否已填写,看不到密钥值)。素材来源: 字体 — Fontshare、Open Foundry、Free Design Resources、Typedump、Dirtyline Studio、Google Fonts(已检查许可);图库素材 — Pexels、Pixabay、Unsplash、textures.com、品牌媒体包;音效 — Freesound(优先使用 CC0)、ElevenLabs SFX;动画 — LottieFiles;风格参考 — Pinterest、Behance、Dribbble(仅供参考,除非已获得许可)。我也会用代码自行绘制所有内容(2D/3D 动态图形)。
准备好后,请把参考资料和故事发给我。
然后等待对方提供参考资料 + 故事(§2 步骤 0),并行运行预检。
0b. 连接 MCP(任意 Agent)
有两种方式——两种都应提供:
- **让 Agent 来操作(最简单):**用户只需说 “连接 Playwright / Firecrawl / ElevenLabs MCP”。如果你能运行终端命令,就用 Agent 的 CLI(见下文)自行添加,并从
.env读取密钥——切勿回显密钥。然后告知用户:如果新工具没有出现,请重启或重新加载 Agent 会话。 - **手动操作:**用户将 JSON/TOML 代码块粘贴到 Agent 的 MCP 配置文件中。
| Agent | 通过命令添加 | 配置文件(手动操作) |
|---|---|---|
| Claude Code | claude mcp add <name> [-s project] -e KEY=value -- <command> <args…> · 检查:claude mcp list / /mcp | 项目中的 .mcp.json(项目作用域),或 ~/.claude.json |
| Codex CLI | codex mcp add <name> --env KEY=value -- <command> <args…> | ~/.codex/config.toml → [mcp_servers.<name>] 中的 command、args、env |
| Cursor | Settings → MCP → Add | .cursor/mcp.json(项目)或 ~/.cursor/mcp.json |
| Claude Desktop | Settings → Developer → Edit Config | claude_desktop_config.json |
| VS Code(Copilot Agent / 扩展) | 命令面板 → “MCP: Add Server” | .vscode/mcp.json |
| Claude.ai / 浏览器中的 Claude | Settings → Connectors(仅限远程 MCP URL) | — 无法访问本地终端:请使用本地 Agent 进行渲染 |
服务定义(.mcp.json / Cursor / Claude Desktop 的 JSON 格式,位于 "mcpServers" 下;CLI 和 TOML 使用相同的 command/args/env):
{
"playwright": { "command": "npx", "args": ["@playwright/mcp@latest", "--user-data-dir", "<project>/../.browser-profile", "--output-dir", "<project>/cache/browser"] },
"firecrawl": { "command": "npx", "args": ["-y", "firecrawl-mcp"], "env": { "FIRECRAWL_API_KEY": "<from .env>" } },
"elevenlabs": { "command": "uvx", "args": ["elevenlabs-mcp"], "env": { "ELEVENLABS_API_KEY": "<from .env>", "ELEVENLABS_MCP_BASE_PATH": "<project>/assets" } },
"lottiefiles":{ "command": "npx", "args": ["-y", "@lottiefiles/creator-mcp@latest"] }
}
示例(Claude Code,从 .env 读取密钥且不打印密钥):set -a; . ./.env; set +a; claude mcp add -s project firecrawl -e FIRECRAWL_API_KEY="$FIRECRAWL_API_KEY" -- npx -y firecrawl-mcp。
uvx 随 uv 一起提供(pip install uv)。Freesound / Pexels / Pixabay MCP 是社区服务——如果没有可用服务或服务运行失败,请跳过 MCP,直接调用 REST API(§0c);这种方式完全受支持。
注意:包含真实密钥的项目作用域 .mcp.json 必须添加到 gitignore;如果 Agent 支持,优先使用 -s local / 用户作用域或环境变量引用。
0c. API 密钥——获取位置、存储方式和使用方法
获取密钥(均提供免费套餐):
| 平台 | 位置 | 环境变量名称 |
|---|---|---|
| Pixabay | pixabay.com → 登录 → https://pixabay.com/api/docs/(密钥显示在页面上) | PIXABAY_API_KEY |
| Freesound | freesound.org → 登录 → https://freesound.org/apiv2/apply → 创建凭据 → 获取 Client ID 和 Client secret / API key | FREESOUND_API_KEY(即 client secret / API key)、FREESOUND_CLIENT_ID(仅用于 OAuth2 原始文件下载) |
| Pexels | https://www.pexels.com/api/ → “Your API key” | PEXELS_API_KEY |
| Unsplash(可选) | https://unsplash.com/developers → New application → Access Key | UNSPLASH_ACCESS_KEY |
| Firecrawl | https://www.firecrawl.dev/app/api-keys | FIRECRAWL_API_KEY |
| ElevenLabs | elevenlabs.io → Developers / Profile → API Keys | ELEVENLABS_API_KEY |
文件由 Agent 创建,用户只需填写。 切勿让用户自行创建 .env。 |
- 运行
bash scripts/create_env.sh <project>(从技能的scripts/目录中复制)。该脚本会创建<project>/.env,其中包含注释行和所有键的空白栏位,保留已有值,并将.env/*.env添加到.gitignore。如果没有 bash,请使用你的文件工具写入相同的文件。 - 告诉用户:文件的完整绝对路径(例如
D:\Projects\my-video\.env)、如何打开文件(使用任意文本编辑器;在 VS Code/Cursor 中点击路径;在 Windows 记事本中,如果看不到点文件,请启用“显示隐藏文件”)、每个键应填写在哪一行,以及获取各个键的链接(见上表)。然后说:“粘贴、保存,并告诉我完成了。” - 用户说已保存后:重新运行脚本(或运行
grep -E '^[A-Z_]+=.+' .env | cut -d= -f1),并按键报告 ✅ 已填写 / ⬜ 为空,仅报告名称。如果某个值看起来有误(包含空格、引号或值中包含key=),指出需要修正的行,但不要引用该值。 - 只询问此项目计划实际需要的键;可选键对应的行留空即可。
<project>/.env 的格式——每行一个 NAME=value,名称使用大写蛇形命名法,不含空格,不加引号,= 两侧不留空格:
PIXABAY_API_KEY=xxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx
FREESOUND_CLIENT_ID=xxxxxxxxxxxxxxxxxxxx
FREESOUND_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PEXELS_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
FIRECRAWL_API_KEY=fc-xxxxxxxxxxxxxxxxxxxxxxxx
ELEVENLABS_API_KEY=sk_xxxxxxxxxxxxxxxxxxxxxxxx
.env 和 *.env 应保留在 .gitignore 中(脚本会处理)。
如果用户已有键文件(例如 Resources/Platforms-api.env,其中包含 pixabay-api=…、freesound client_id=…、freesound client_secret=… 等行):不要让用户重新输入。读取该文件,映射名称(pixabay-api→PIXABAY_API_KEY、freesound client_id→FREESOUND_CLIENT_ID、freesound client_secret/api key→FREESOUND_API_KEY 等),并使用脚本在项目中写入标准化的 .env,不要打印值——运行 python3 scripts/normalize_env.py <their file> .env(该脚本也会将 .env/*.env 添加到 .gitignore)(包含空格或连字符的名称不是有效的环境变量,因此务必进行标准化)。只报告类似“✅ PIXABAY_API_KEY 已设置”的行。
加载并使用它们(切勿将密钥写入日志、LOG.md、manifest.json、提交内容或聊天中;如果必须展示命令,请将密钥屏蔽为 ***):
- Shell:
set -a; . ./.env; set +a· Node:process.loadEnvFile('.env')(Node ≥20.12)或dotenv· Python:python-dotenv。 - Pixabay(图片和视频,无需署名,但请记录页面 URL):
curl -s "https://pixabay.com/api/?key=$PIXABAY_API_KEY&q=neon+city&image_type=photo&orientation=horizontal&per_page=20&safesearch=true"→hits[].largeImageURL/pageURL;视频:https://pixabay.com/api/videos/?key=$PIXABAY_API_KEY&q=…→hits[].videos.large.url。将文件下载到assets/(不要使用热链)。限制约为 100 次请求/分钟。 - Freesound(音效):使用令牌身份验证进行搜索:
curl -s "https://freesound.org/apiv2/search/text/?query=whoosh&filter=license:%22Creative%20Commons%200%22&fields=id,name,username,license,duration,previews,url&page_size=15&token=$FREESOUND_API_KEY"→ 下载previews["preview-hq-mp3"](用于音效已经足够)。获取原始 WAV/FLAC 需要 OAuth2(FREESOUND_CLIENT_ID和密钥;用户只需在浏览器中授权一次)。优先选择 CC0;对于 CC-BY,请记录username和url以便署名。限制约为 60 次请求/分钟、2000 次/天。 - Pexels:
curl -s -H "Authorization: $PEXELS_API_KEY" "https://api.pexels.com/v1/search?query=desk+laptop&orientation=landscape&per_page=15"→photos[].src.original;视频:https://api.pexels.com/videos/search?query=…→videos[].video_files[](选择宽度 ≥ 1920 的文件)。请注明摄影师。 - Unsplash:
curl -s -H "Authorization: Client-ID $UNSPLASH_ACCESS_KEY" "https://api.unsplash.com/search/photos?query=…&per_page=15"→results[].urls.full;请注明摄影师。 - Firecrawl(优先通过 MCP 使用;REST 作为备用):
curl -s -X POST https://api.firecrawl.dev/v1/search -H "Authorization: Bearer $FIRECRAWL_API_KEY" -H "Content-Type: application/json" -d '{"query":"clash display font license","limit":5}';抓取页面:使用/v1/scrape,并传入{"url":"…","formats":["markdown"]}。 - ElevenLabs(音效/音乐;仅在用户要求生成语音时才生成语音):音效
curl -s -X POST "https://api.elevenlabs.io/v1/sound-generation" -H "xi-api-key: $ELEVENLABS_API_KEY" -H "Content-Type: application/json" -d '{"text":"deep cinematic boom with long tail","duration_seconds":3}' -o assets/sfx/boom.mp3;TTSPOST /v1/text-to-speech/<voice_id>?output_format=mp3_44100_192。这会消耗用户的额度——批量生成前请先询问。 - 编写小型可复用助手脚本(
scripts/fetch_pixabay.mjs、scripts/fetch_freesound.mjs……),读取.env、执行搜索、将文件下载到assets/…,并将信息(路径、来源页面、作者、许可证)追加到manifest.json。
0d. Demucs(本地音轨分离——默认安装)
体积足够小,可始终安装(CPU 版 wheel 包含 PyTorch 约 300 MB;htdemucs 权重约 80 MB,首次运行时缓存)。在预检时询问一次,然后安装:
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu && pip install demucs soundfile(Apple Silicon/Linux/Windows 均可通过 CPU 运行;如果已安装 CUDA 版 PyTorch,则跳过索引 URL)。
用途:
- **参考素材分析(§13):**分离参考音频,以便分别研究音乐、音效和语音:
ffmpeg -i ref.mp4 -vn -ac 2 -ar 44100 cache/ref.wav && python3 -m demucs -n htdemucs --two-stems=vocals -o cache/stems cache/ref.wav→cache/stems/htdemucs/ref/{vocals,no_vocals}.wav。 - **清理用户的语音:**如果返回的 MP3 中混有音乐/噪声,请保留
vocals.wav。 - **原始素材剪辑:**将对白与背景音乐分离,以便重新混音或降低音乐音量。
移除
--two-stems可分离为 4 条音轨(鼓/贝斯/其他/人声)。CPU 运行速度约为实时速度的 1–2 倍;如果内存不足,请按 ≤ 60 秒的片段处理。如果出现torchaudio保存错误,请确保已安装soundfile。
1. 项目结构与跟踪
<project>/
PROJECT.md # brief, decisions, approvals, open questions (living doc)
PROGRESS.md # live status: phase, done, in progress, next step, open issues, key file paths (read FIRST on resume)
LOG.md # timestamped action log: what, why, files touched, result
manifest.json # every asset: path, source URL, license, author, duration, used-in
plan/ # script.md, storyboard.md, shotlist.md, styleboard.png, beats.json
assets/{footage,images,lottie,sfx,music,vo,fonts}/
models/ # local model weights
src/ # scene code (scenes/*.js, fx/*.js, data.js timings, render.js)
cache/ # matte frames, transcripts, intermediate PNG/frames (deletable)
renders/ # previews/ (low-res, stills, contact sheets) and final/ (versioned v1, v2…)
- 每个项目都必须包含
PROGRESS.md。 在预检阶段创建,并在每个步骤完成后、每次用户决策后,以及任何耗时较长的渲染开始前更新。内容应简洁清晰,让新会话仅凭它就能继续工作(对话会变得很长,且上下文可能丢失)。保持简短并覆盖更新,与只追加内容的 LOG 不同。模板:# PROGRESS – <project> (updated YYYY-MM-DD HH:mm) Phase: <brief|script|storyboard|style|assets|preview|final|DONE> Current version: v3 → renders/final/<name>_v3.mp4 Done: - … In progress: - … Next step: <one concrete action> Open issues / user feedback not yet fixed: - … Key decisions & preferences: - (e.g. no bell SFX, credits required) Key files: src/…, plan/beats.json, assets/… - 会话恢复时(或上下文压缩后),先读取
PROGRESS.md,再读取LOG.md的末尾,然后再进行其他操作。 - 每完成一个有意义的步骤,就向
LOG.md追加记录。将每个下载素材的许可证和来源信息记录到manifest.json中。 - 为输出添加版本号(
_v1、_v2);绝不覆盖已批准的渲染版本。 - 将所有时间信息保存在一个由转录稿驱动的数据文件中(
data.js/beats.json),这样调整时间只需编辑一个文件。
2. 工作流(粗体步骤需用户批准)
- 参考资料与故事(必需的初始信息)——发送启动消息(§0a)后,收集:参考视频/链接/截图、故事/计划(发生什么、核心信息)、受众、平台与格式、目标时长、语气、CTA、品牌素材、必须包含与必须避免的内容。如果用户提供了参考资料,执行 §13(加上 Demucs 分离音轨,§0d),并提交制作方案。至少了解故事和时长后才能继续。
- 简报——目标、受众、平台与画幅(9:16 1080×1920 / 16:9 1920×1080 / 1:1)、时长、品牌(标志、配色、字体)、CTA、参考资料、视频类型 → 强度等级(§4)。只询问缺失的信息。
- ElevenLabs 配音稿——按照 §10 指南编写:为计划准备 AV 双栏脚本(音频 | 画面),以及一个可直接粘贴到 ElevenLabs 的文本块,其中包含模型、语音和设置。前 3 秒设置钩子。→ 批准脚本。 → 用户生成 MP3 并发回(
assets/vo/)。只有收到 MP3 后,才能开始步骤 3 及后续步骤(包括任何场景代码)。 - 分镜/镜头列表——每个镜头注明时间、配音台词、画面、运动、转场、SFX、屏幕文字。附带标注秒数的节拍表。
- 风格板——配色(十六进制值 + 用途)、字体、用代码渲染的 3–4 张静帧。→ 批准计划。
- 素材——**配音接收:**接收用户的 MP3 → 使用
ffprobe检查(时长、采样率)+ 检查削波/响度(ffmpeg -af volumedetect、ebur128)→ 使用带词级时间戳的转录工具(faster-whisper)进行转录 → 将转录稿与已批准的脚本进行差异对比,并报告缺失/变更的词语或不正确的发音(如有需要,请用户重新生成对应台词)→ 将beats.json时间锁定为实际音频时间。如果用户明确要求提前开始,则使用临时参考音轨,并在PROGRESS.md中将时间线标记为TEMP。然后使用素材库、Lottie、SFX,以及通过 Playwright MCP(§16)在 Pinterest/任意网站上寻找图片、纹理、视频素材和参考资料;使用带词级时间戳的转录工具;如有需要,制作抠像遮罩。 - 预览——通过
scripts/preview.mjs(§2b)为每个场景生成联系表 + 低分辨率/半帧率的带音频预览 MP4。→ 批准预览。 - 最终渲染——全分辨率渲染、混音、响度处理、QA 检查清单(§15)。交付并更新 LOG。如果需要竖屏版本,必须针对 9:16 原生重新排布每个场景(重新构图,并将文字放置在安全区域内)——绝不能只裁剪或给 16:9 渲染加黑边。
渲染流程(默认):在 Canvas/Three.js 中实现确定性的 drawFrame(t) → 通过 Playwright 启动无头 Chrome,逐帧设置时间(不使用实时钟)→ 将 PNG/JPEG 帧输入 ffmpeg -f image2pipe -r 30 -i - -c:v libx264 -pix_fmt yuv420p -crf 18 → 复用音频。只使用带种子的随机数。
渲染 CLI 约定(必需,第一天就要实现): src/render.js 必须支持 --from <s> --to <s> --fps <n> --scale <0–1> --out <dir> [--jpg],并仅渲染指定范围和尺寸。每帧只依赖于 t(不使用计时器、无种子随机数或跨帧状态),因此预览帧与最终帧完全相同,只是尺寸更小。
2b. 快速预览循环(每次修改后都要执行)
绝不要通过完整渲染或随便截取几张静帧来检查修改。静帧之间发生的情况(卡片滑到文字后面、元素被裁切、构图不佳)很容易被忽略。
- 编辑场景后,运行
node scripts/preview.mjs <from> <to>(默认值:8 fps、0.25 倍缩放、6 列)。它只渲染指定范围,生成小尺寸画面,并将所有帧拼成一张联系表,保存到renders/previews/sheet_<from>-<to>.jpg,每帧下方都带时间戳。 - 查看联系表(一张图就能看到整个动作)。检查构图和安全区域、重叠、文字易读性、缓动间隙、突现/闪烁,以及剪辑点前后的连贯性。
- 修复 → 重新运行相同范围 → 重复,直到效果干净为止。然后再进入下一个场景。
- 检查时序或声音时,添加
--mp4,以获取包含混合音频的低分辨率片段。 - 最终渲染前,按整段视频生成联系表(例如每 10 s 一段),并修复发现的所有问题。在 LOG.md 中记录每次循环,并更新 PROGRESS.md。
目标:每次循环耗时不到约 20 s。如果更慢,请降低
--fps/--scale或缩短范围。代码时间线场景使用 Motion Canvas/Revideo;缓动使用带.seek(t)的 GSAP 时间线;手绘/墨迹风格使用 p5.brush;清晰图标/UI 使用 SVG。
3. 导演/制片人须知
- 结构: Hook(0–3 s)→ 问题 → 解决方案 → 证明 → CTA。将功能描述为成果(“每周节省 5 h”,而非“具备自动化功能”)。
- Hook 手法: 大胆宣称、打破常规、提出问题、先展示结果,或在第 1 帧制造视觉惊喜。不要以 Logo 开场。
- 证明: 真实 UI、数字、用户评价、前后对比。通过缩放、遮罩、高亮来简化 UI,而不是凭空编造。
- 每个镜头只表达一个想法;屏幕文字不超过 6–8 个词;留出阅读时间(≈ 每词 0.3 s + 0.5 s)。
- 节奏: Reels 每 0.5–2 s 剪一刀;讲解视频每个想法 2–5 s;变换节奏(快–快–停顿)。在节拍/辅音处剪辑。
- 镜头术语: 远景/中景/近景/极近特写(ECU)、插入镜头、过肩镜头(OTS)、主观视角(POV);运动方式:推进(强调重要性)、拉远(揭示内容)、摇摄/跟拍(跟随)、视差、推轨变焦(营造张力)、甩镜(转场)、环绕(突出主打产品)。
- 剪辑: 动作中剪切、J/L 型剪辑(音频先入/后延)、匹配剪辑(形状/颜色/运动)、跳剪去除冷场,使用 B-roll 遮盖剪辑点。
- CTA: 只安排一个明确的行动,同时以画面和口播呈现,屏幕上至少显示 2 s。
4. 视频类型 → 剪辑强度
| 类型 | 强度 | 建议 | 避免 |
|---|---|---|---|
| 剪辑展示/Reel/Hook/个人品牌 | 🔥 5 – 极强 | 闪白、3D 文字、圆环、故障效果、甩镜、冲击式变焦、每个节拍都加音效 | 冷场、静止画面超过 1.5 s |
| 社交广告/UGC | 4 – 高 | 动态字幕、冲击式变焦、贴纸、Emoji、快速剪辑 | 缓慢的开场 |
| 教育/教程 | 3 – 中 | 高亮、箭头、步骤计数器、图表、舒缓的音乐 | 遮挡内容的特效 |
| SaaS/产品讲解 | 2 – 清晰优先 | 简洁的 UI 动画、焦点变焦、光标、平滑缓动、细微音效;动态服务于信息传达 | 花哨噱头、晃动镜头、闪白 |
| 企业/B2B/金融/健康 | 1 – 克制 | 字幕条、淡入淡出、缓慢推进、大量留白 | 故障效果、霓虹、强烈闪白 |
规则:信息越需要建立信任/确保清晰,装饰性动态就越少。每种特效都必须服务于吸引注意、强调重点或转场。
5. 动态图形目录(代码绘制)
- **类型:**动态字幕(单词弹出、卡拉 OK 高亮)、凸出的 3D 文字、置于主体后方的文字(需要遮罩)、绕主体旋转的 3D 环形文字、竖排霓虹文字、手写体 + 粗体搭配、打字机效果、遮罩揭示、分屏/乱码文字。
- **形状/UI:**设计工具的选框和控制柄、光标点击、切换开关、聊天气泡/私信、通知卡片、关注按钮 →「已关注 ✓」动画、进度条、计数器、动态绘制的图表。
- **纹理/效果:**半色调、黑白 + 局部彩色、纸张/撕纸、墨迹/笔刷(p5.brush)、颗粒、扫描线、胶片灼烧、散景、漏光、霓虹辉光、双色调。
- **物件:**带卷边/揭起效果的贴纸、拍立得照片、胶带、表情符号、箭头(手绘/霓虹)、金币/彩纸雨、粒子、Lottie 图标。
- **3D(Three.js):**产品环绕展示、悬浮卡片、剪贴图的深度视差、镜头飞行穿越、凸出式 Logo。
- **角色:**绑定骨骼的 2D 角色(Canvas 中的骨骼/IK)、Lottie 角色、一致的角色设定表。
6. 原始素材剪辑效果
强调时快速推近(105–120 %)、关键句处平滑推近、甩镜/模糊转场、荷兰角倾斜、冲击时抖动、白色/红色剪影闪光(遮罩)、主体抠图 + 替换背景、面部/照片拼贴、主体后方的字幕、「电影感」片段的遮幅黑边、定格画面 + 标签、变速、黑白快速推近、局部色彩、分屏、穿越式缩放转场、片尾故障/RGB 分离效果、撕纸擦除、墨迹擦除、移除静音片段的跳切。
抠像:视频使用 RVM(速度快,512 px 时 CPU 性能也可以),静帧使用 rembg/u2netp,需要提示词/点击操作时使用 SAM2-tiny。将遮罩缓存到 cache/,羽化 1–2 px,稍微收缩以避免光晕。
7. 动画原则(顶尖动态图形设计师)
- Disney 的 12 条原则:挤压与拉伸、预备动作、舞台呈现、跟随与重叠、慢入慢出、弧线运动、次要动作、节奏、夸张、吸引力(+扎实的绘制、直线绘制/姿势到姿势)。
- **缓动:**UI 动画绝不使用线性缓动;入场使用 easeOutCubic/Expo,退场使用 easeInCubic,仅在活泼的品牌中使用 back/elastic。入场时长 200–500 ms,退场比入场更快。
- 相关元素之间错开 40–80 ms;超出 5–10 %;以小幅跟随动作收尾。
- **层级与视线引导:**每个时刻只设置一个焦点;让下一个焦点靠近上一个焦点;先用动作引导,再显示文字。
- **连贯性:**方向保持一致(向前 = 左→右),缓动系列保持一致,每个项目的动作「语言」保持一致。
8. 色彩与构图
- **60-30-10:**主色/次色/强调色(强调色仅用于 CTA 和高亮)。
- **对比度:**文字 ≥ 4.5:1(WCAG AA;大号文字 ≥ 3:1);检查灰度下的明度对比。
- **配色方案:**互补色营造跳跃感(例如青绿色/橙色),类似色营造平和感,单色 + 一种强调色营造高级感。遵循品牌调色板;从中派生色调/明暗变化,不要凭空创造色相。
- 调色时肤色必须保持自然;所有片段的调色风格保持一致(每个项目使用同一 LUT/曲线)。
- **构图:**三分法、头顶留白、视线方向留白、为文字留出负空间、主视觉镜头采用对称构图。
- **安全区域(9:16):**文字/人脸应避开顶部约 220 px、底部约 420 px 和右侧约 140 px(平台 UI)。字幕放在画面高度的 60–70 % 处。
- 最多使用 2 种字体(+1 种手写体作为强调)。行长要短,大号粗体的字距要更紧。
9. 声音设计
- **三件套:**渐强音(铺垫)→ 冲击音(重击)→ 呼啸音(运动/转场)。分层:低频底音 + 中频冲击 + 高频嘶响/气流声。
- **体积越大、重量越重,音高越低、速度越慢;体积小、速度快,音高越高、时长越短。**音效时长要匹配运动时长;将瞬态与画面峰值帧同步(±1 帧)。
- **映射:**UI 点击/弹出/滴答声 → 界面;轻掠声/呼啸声 → 运动和文字飞入;渐强音 → 揭晓前;低频下坠音/轰鸣 → 重击/标志;故障音/嗡鸣 → 故障特效;相机快门 → 闪光/定格;纸张/贴纸撕裂声 → 贴纸/撕纸;短促强调音 → 段落切换;环境氛围底音 → 增强真实感。
- 不要给所有内容都加上强度为 1–2 的音效;强度达到 5 时,几乎每个节拍都应配上音效,并使用不同采样(避免重复疲劳)。
- **混音:**旁白音量比音乐高 10–15 dB;旁白播放时压低音乐(侧链);对干扰旁白的音效进行高通滤波;在小节线处剪辑音乐。
- **响度:**社交媒体/YouTube 的综合响度为 −14 LUFS,真峰值 ≤ −1.5 dBTP(双遍处理:
ffmpeg -af loudnorm=I=-14:TP=-1.5:LRA=11)。素材来源:Freesound(优先选择 CC0,并记录署名信息),ElevenLabs SFX 用于定制音效。
10. ElevenLabs 旁白
- 模型:富有表现力的旁白使用 Eleven v4(或 v3);需要稳定地朗读长文或 PVC 时使用 Multilingual v2。
- v3/v4:不要使用 SSML
<break>。使用标点:…表示迟疑,—表示短暂停顿,也可使用换行和短句。<break time="1.0s"/>仅用于旧版模型(≤3 秒,且少量使用)。 - 音频标签:放在每行前后方括号内:
[excited][whispers][sighs][laughs][curious][sarcastic][thoughtful][surprised][warmly][dramatically][impressed][frustrated sigh];请写明具体特征(如[low, gravelly voice]),避免标签被读成音效。不要在旁白中使用音效标签(如[applause])。 - 标签必须符合声音角色;测试 2–3 个版本。大写字母表示强调(少量使用)。写得自然一些,就像剧本一样。
- **发音:**v4 可在斜线中使用 IPA
/ˈnoʊʃən/;品牌名/缩写也可以使用别名/音素发音词典。不确定时,将数字/单位写成口语读法。 - 按场景/段落生成(便于重录和分层),并保持声音和设置一致;调整
speed,而不是重写内容;后期移除任何被读出的舞台指示。 - 示例:
[warmly] Most teams lose hours every week… [curious] but what if that just — stopped? [excited] Meet Flow.
10a. 编写可直接粘贴到 ElevenLabs 的脚本(构建前交付)
时长 → 字数预算(自然语速旁白约为 2.3–2.6 词/秒;结尾留约 1.5 秒用于 Logo/CTA 停留):
| 视频 | 字数(旁白) | 行数 |
|---|---|---|
| 15 s | 30–38 | 4–6 |
| 30 s | 65–75 | 8–12 |
| 45 s | 100–110 | 12–16 |
| 60 s | 135–150 | 16–22 |
| 90 s | 200–220 | 24–32 |
统计粘贴块中的字数(不含标签),并注明估算值:≈ 142 words ≈ 58 s at 2.45 w/s。 |
写作规则
- 每行一个想法;句子简短(≤ 14 个词)。换行 = 自然换气停顿;
…= 犹豫;—= 短暂停顿。空行 = 章节之间较长的停顿。 - 第一行用钩子开场(≤ 3 s,≤ 8 个词)。CTA = 最后一行,必须与屏幕上显示的文字完全一致。
- 数字、单位、符号、缩略语和 URL 按读法写出:"twenty-four seven"、"three x faster"、"A-I"、"dot com"。粘贴块中不要使用表情符号、话题标签、Markdown、项目符号或舞台指示。
- 标签:每 1–2 行最多 1 个,仅在情绪变化处使用;符合声音角色。每个章节最多将 1 个词写为全大写。
- 品牌名称/生僻词:提供别名拼写("Notion" → "NOH-shun")或 v4 IPA
/ˈnoʊʃən/,或者告诉用户将其添加到发音词典。 - 按模型区分:v3/v4 → 使用标点 + 标签,不用
<break>。Multilingual v2 / Turbo / Flash → 不用音频标签(它们会被朗读出来);酌情少量使用<break time="0.6s"/>。 - 屏幕关键词(用于动态字体)单独列出,不要放进粘贴块。
严格按以下格式交付:
## VO script – <project> (v1)
Target: 60 s · ≈ 142 words ≈ 58 s
Model: Eleven v3 (or v4) Voice: <library voice name or description, e.g. "deep, calm male narrator, documentary, American">
Settings: Stability 40–50 % (Natural) · Similarity 75 % · Style 0–20 % · Speed 1.0 · Speaker boost on
Export: MP3 44.1 kHz 192 kbps (mp3_44100_192) · one file for the whole script (or one per section if marked)
--- PASTE INTO ELEVENLABS (copy everything between the lines) ---
[thoughtful] Nobody drew this.
Not one line… not one frame.
[curious] So where did it come from?
…
[warmly] Start yours today — link below.
--- END ---
On-screen keywords: NOBODY · DREW · THIS · …
Pronunciation notes: …
Alt hook (variant B): …
另提供钩子的 B 版(如有帮助,也提供 CTA 的 B 版),方便用户进行 A/B 选择。
告知用户如何生成: 打开 elevenlabs.io → Text to Speech → 选择模型和声音 → 设置参数 → 粘贴内容 → 生成 2–3 个版本 → 将最佳版本下载为 MP3 → 发给你/放入 assets/vo/vo_v1.mp3。如果某一行听起来不对,只重新生成该行(用相同设置单独粘贴该行),并将其发送为 vo_line07_fix.mp3 — 你会在停顿处将它拼接进去。未经告知,不要在批准后修改文本(时长和字幕都以此为准)。
11. 3D 动态设计 — “关键时刻再用 3D”
默认使用清晰利落的 2D;在主视觉时刻切换到 3D(揭示、产品、数据、Logo、转场)——每 5–10 s 最多 1 个大型 3D 段落,强度 ≤3。
- **2D→3D 弹出:**平面图层(卡片、截图、文字、照片)以透视角度倾斜(
rotateX 10–25°、rotateY 15–35°),增加厚度(挤出 8–30 px,侧面颜色更暗),添加阴影 + 轮廓光,并让摄像机推轨/环绕;然后在下一个节拍恢复为 2D 平面。在 Canvas 中用 2.5D 仿制(透视/单应性变换 + 堆叠偏移副本来营造深度);在 Three.js 中使用由 Canvas 生成纹理的平面(CanvasTexture),让 2D 美术与 3D 共用一套流程。 - **3D→2D 收拢:**带阴影的 3D 物体(显示器/手机)变形成扁平线稿轮廓(黑色 6–10 px 描边,白色填充)→ 摄像机穿过屏幕推进至下一个场景(方案 C)。
- **工具箱:**Three.js(用于文字的
ExtrudeGeometry/TextGeometry、用于镀铬/玻璃效果的MeshPhysicalMaterial+RoomEnvironment、EffectComposer泛光/景深/颗粒)、卡片堆叠与环绕运动、剪影的深度视差(主体 z=0,文字置于后方 z=−1,粒子 z=+1)、圆柱环绕文字、超空间条纹隧道、挤出 Logo、3D 相框、透视悬浮 UI 窗口。 - **3D 摄像机语言:**停留时缓慢推进(0.5–2 %/s);转场时快速推轨 + 动态模糊;产品镜头环绕 20–40°;通过焦点转换(DOF)切换注意力;FOV 30–45° = 高端质感,60–75° = 动感。
- **渲染:**使用同一确定性
drawFrame(t)→ 无头 Chrome WebGL(无 GPU 时使用--use-angle=swiftshader)→ ffmpeg。通过平均 4–8 个子帧来模拟动态模糊。复杂场景:如果已安装,则使用 Blender 无头模式(blender -b scene.blend -P build.py -a)。
12. 字体排版与动态字体
- 适用的字体搭配:(a)超细黑体填充词 + 粗体/超粗关键词(配方 A);(b)粗重黑体 + 手写马克笔字体 + 手写体点缀(B);(c)一种几何展示无衬线字体,只通过字号形成对比(C、D);(d)衬线标题 + 小号无衬线 UI 标签,适用于高端 SaaS 卡片。
- 通过字号、字重和颜色建立层级,而不是增加字体数量。 关键词字号 = 填充词的 2–4 倍;每组字幕中关键词不超过 1 个;关键词使用强调色/渐变/辉光。
- 动态字体表现手法: 逐词模糊入场(模糊 12→0 px、不透明度 0→1、y +20→0、180–250 ms、easeOutCubic);逐字错开 20–40 ms;字距收拢(0.6 em → 0,用于 logo 组合);在同一位置替换词语(“Zero Alignment → Zero Momentum”);乱码/解码(随机字形 → 最终文字,等宽);计数器滚动(38→48→50,缓出,滴答音效);文字置于主体后方(遮罩);文字沿 3D 路径/弧线排布;定向回声拖尾(3–6 个以强调色显示、透明度递减的偏移副本 = 彩色动态模糊,D);逐字溶解消失;字体变形为圆形徽章(B);可变字体字重/宽度动画。
- 位置: 字幕环绕主体(靠近面部/双手),绝不遮挡眼睛/嘴巴;每组字幕变换位置以引导视线;保持在安全区域内。
- 收尾效果: 2 段垂直渐变填充、细微斜面/投影(0 4 12 rgba(0,0,0,.35))、辉光 = 后方的模糊副本(8–24 px、强调色、60–80 %)、在字体上叠加 3–6 % 颗粒,营造胶片质感。
字体来源(Firecrawl → assets/fonts/)
优先搜索/抓取以下资源。免费或仅限个人免费使用——务必阅读许可条款、记录在 manifest.json 中;如果商业用途不明确,请询问用户。
| 网站 | 用途 |
|---|---|
| https://freedesignresources.net/category/free-fonts/ (Free Design Resources) | 展示字体、窄体字体、免费手写体 |
| https://open-foundry.com/ | 精选开源(OFL)字体 |
| https://www.fontshare.com/ | ITF 免费专业字体(Satoshi、Clash Display、General Sans、Cabinet Grotesk、Switzer…) |
| https://www.typedump.com/ | 免费可变字体、展示字体、像素字体、等宽字体 |
| https://play.typedetail.com/ (Font Playground) | 测试动态字体的可变字体轴(wght/wdth/slnt) |
| https://dirtylinestudio.com/freebies/ | 免费展示/品牌字体 |
| Google Fonts(备用) | OFL 常用字体:Inter、Poppins、Anton、Archivo Black、Permanent Marker、Caveat Brush、Allura、Space Mono |
工作流:firecrawl_search "<style> font site:fontshare.com" → 使用 firecrawl_scrape 抓取字体页面,获取下载链接和许可条款 → curl -L -o → 解压 .ttf/.otf/.woff2 → 通过 @font-face/FontFace 注册,并在渲染第 0 帧前等待 document.fonts.ready。绝不发布无法验证许可条款的字体。
13. 参考视频流程(如果用户附上参考视频,请使用)
务必询问:“你有参考视频或想要的视觉风格吗?请附上视频——我会对其进行逆向分析。” 每个参考视频最多分析 15 s(scripts/analyze_ref.sh ref.mp4):
- 使用
ffprobe获取尺寸、fps、时长;以 4 fps 抽取帧并生成带时间戳的缩略图集;剪辑点周围生成 10 fps 条带(select='gt(scene,0.3)');导出关键帧的全分辨率静帧。 - 音频:频谱图、瞬态列表(低频段与高频段)、词语时间戳(faster-whisper)。可选使用 Demucs 分离 VO/音乐/音效。
- 编写拆解说明:格式与调色 · 字体系统(字体、字重、十六进制颜色、字号)· 逐镜头时间线(t、视觉效果、运动、缓动、转场)· 反复出现的设计手法 · 音效映射(t → 声音 → 同步对象)· 剪辑节奏(平均镜头时长、BPM)。
- 将其整理为配方(格式见 §14),与用户确认后再开始制作。
14. 逆向分析的参考配方(无需观看视频即可制作这些效果)
A · 高端口播字幕短片(房地产经纪人,9:16,强度 3–4)
- **画面:**85 mm 镜头质感的浅景深,柔和的阴天光线,暖绿自然调色;主体居中,中景/全景,常常朝镜头走来;约每 3 s 更换一个地点(长椅 → 桥 → 露台 → 小径),在句子开头硬切。
- 字幕:每次显示 1–3 个词,位于主体周围的胸部/脸部高度。填充词 = 超细无衬线体(Helvetica Neue Thin / Inter 200),80 % 白色,柔和阴影。关键词 = 粗重无衬线体,放大 2–3 倍,带渐变填充 + 轻微浮雕效果:「秘诀」钢蓝绿(#2E7F95→#A7DCE6),「客户」大写淡紫色(#A35BC9→#E3B8F3),「2026」蓝绿色 3D 效果,「50 套房」绿色,「2 件事」霓虹黄 #FFE14A,带橙色光晕 #FF8A00(模糊约 20 px),置于头部后方(遮罩)。
- **动态:**文字约 200 ms 模糊渐入,逐字溶解消失;数字从 38→48→50 滚动,同时 6 张圆角房屋照片卡片(2 px 白色边框,12 px 圆角,阴影)以弧形弹出环绕她身边(缩放 0→1.08→1,间隔 80 ms);社交帖子截图作为倾斜的 3D 平面(rotateZ −6°,轻微透视)=证明性 B-roll;胶囊按钮(黑色填充,2 px 发光黄边框,粗体白字「定价。」/「演示。」)在口播对应词语时从圆点 → 圆形 → 胶囊形展开;说到「营销/内容」时,带微型标签的前后对比缩略图卡片漂浮在她周围;不同镜头间使用帧混合残影甩镜。
- **音效:**VO 下方铺设轻柔音乐;第一个关键词(「客户」,约 1.8 s)处加入低沉轰鸣/低频冲击声;数字计数期间加入音调提示/闪烁声;在「那么,我们来聊聊如何……」前加入空灵的闪烁甩入声;每个胶囊按钮/卡片出现时加入轻柔弹出声;填充词不加音效。
B · 电影感故事纪录片剪辑(创作者起源故事,16:9 宽银幕黑边,强度 5)
- **结构:**每个视觉构想持续 1–2 s;每句话都切换到一个新世界;以 1 帧黑场切换作为标点;添加宽银幕黑边。
- 视觉风格序列:昏暗暖色口播画面(粗体白色字幕 + 黄色关键词)→ 奶油色半调纸张 #F1E8C8,带植物叶片遮片投影 + 胶片颗粒;红色做旧粗体字「故事」#B3202C,置于设计工具选择框内(虚线边界、方形控制点),选择框旋转并变形为圆形徽章 → 黑色粗体无衬线字「三年的历程」逐词从左上角出现 → 撕纸窗口打开,展现画面 → 手持拍摄的房间 B-roll,房间里立着带阴影的白色厚重 3D 挤出文字(「一个孩子」、「从……开始」)→ 黄色手写体「ZARA」位于「在 Zara 叠衣服时」下方 → 梦境拼贴(富士山、鸟居、宝塔、东京塔、青山,剪贴风格的主体走入画面),黄色手写马克笔字(Permanent Marker / Caveat Brush,#FFD84A,深色描边)沿弯曲路径排列,每个口播词对应一个 → 黑色虚空,聚光灯下的3D 相框缓慢推轨,「17 岁时」→ 推入照片:紫色粗粝纸张 #7B6FB0,带划痕,黄色文字「他痴迷于」,红色粗体马克笔字「一件事」→ RGB 切片故障效果→ 深色剪影后方的超空间光束隧道(洋红/红/紫),搭配镀铬 3D 文字「创作」→ 黑白档案胶片(双手伸向一张美元纸币,闪烁、暗角),配上微小的黄色斜体字幕 → 模糊甩镜切回 A-roll,白色粗体字幕左对齐并层叠排列,重点词以黄色粗重窄体突出(类似 Anton,带光晕)。
- 音效:音乐 + VO;纸张场景加入纸张摩擦/滑动声;每次切换世界时加入甩入声(约 4.6、6.5、7.7 s);切片故障处加入故障爆发声;「创作」前加入渐强音;黑白画面下铺设放映机噼啪声;甩回 A-roll 时加入甩镜声。音效冲击落在每个新世界的第一帧。
C · SaaS 产品发布,Slack 风格(16:9,强度 2–3,清晰优先,同时保持高端质感)
- 开场:以低饱和度的暖色草地照片(颗粒感、柔和暗角)作为平静的画布;纤细的等宽字体逐字解码出「Life. But organized.」;发光的品牌色光球(模糊约 10 px)飘入并凝聚成应用图标,随后在玻璃质感的 Dock 中排成一列(圆角胶囊形、背景模糊、柔和阴影)。
- 动效:镜头垂直倾斜并加入强烈运动模糊(Dock 保持不动)=转场;对 Dock 进行微距推进并加入景深(DOF)模糊;光标悬停在图标上时,图标放大至 1.15×;点击后,真实产品 UI 窗口以倾斜的 3D 卡片形式从 Dock 中飞出并扇形展开;一个视频通话窗口落在白色背景上,带有柔和的蓝色阴影。
- 2D↔3D:灰色 3D 显示器旋转着飞入(rotateY 约从 70°→0,缓出),同心品牌色圆环在其后爆开(红→黄→蓝→绿,间隔 120 ms);随后显示器扁平化为黑色线稿,镜头穿过边框推进(scale >300 %),画面变为白色。
- 字体:宽体几何无衬线字体(类似 General Sans / Clash)。小号粗体文字「Your team lives in too many tools」逐字打出 → 巨大的裁切文字「Zero」从画面边缘溢出,覆盖在从底部升起的模糊品牌渐变色块上(青绿色 #3CC9B0、黄色 #F7D21E、洋红色 #E01E6A)→ 缩小为小号「Zero Alignment」→ 替换为「Zero Momentum」→ Logo 放大入场,带过冲后缩至小号;字标「S l a c k」以宽字距逐字显现,随后字距收拢并形成组合标志。
- **音效:**柔和音乐配合低频脉冲(约 0.33 s);镜头倾斜时加入呼啸声(≈2.1–2.6 s);UI 缩放时加入下行音调扫频;悬停 Dock 图标时加入清脆的玻璃质感点击声;Logo 出现时加入一次干净的撞击声和混响尾音,随后近乎静音。
D · 品牌代理公司动效宣传片,Frontify 概念(16:9,强度 4,节拍同步)
- **调色板:**灰白色 #FAF8FA 与黑色 #0A0A0A 随每次剪辑交替,搭配一种点缀色橙色 #FF6A1A;采用一种几何展示无衬线字体(类似 Satoshi / General Sans Bold)。
- 字体:巨大的「Your」带有向右下方偏移的橙色运动模糊回声 → 切至黑屏:小号「Your」居中,底部升起模糊的橙色光晕波纹 → 白色「Branding」水平拖影 → 逐步显现小号「Your Branding is」→ 白色「Messy」覆盖在暗色网格上,背景中展示亮度调暗的品牌作品。
- **卡片蛇形轨迹:**20–30 张品牌宣传物料卡片沿文字后方的贝塞尔曲线拖曳(时间回声:每张副本比原卡片延迟 1 帧,并略小一些),从左向右再向下扫过。
- **Logo:**白底上单独呈现轮廓图标(描边绘制显现)→ 字标叠加在模糊的生活方式照片上。
- 卡片堆叠 → 网格 → UI:卡片堆叠每逢节拍就旋转洗牌,随后炸开为 4×2 网格,并以 3D Y 轴翻转和文件夹标签呈现(Mockups、Website UI、Banners…);镜头推进其中一个标签 → 标签变成搜索栏中的一个标签块;带光标的文字逐字输入;点击「Search」→ 背景反转为黑色,按钮变为橙色渐变,并压缩成带 ↑ 箭头的圆形 → 镜头拉远,露出卡片「Explore Templates」(衬线标题、选框)。
- 音效/节奏:仅有音乐,无旁白;开场文字配合稀疏的呼啸声与爆裂声;约 3.6→5.5 s 加入噪声渐强音,随后 Logo 出现时低音骤落;然后每个节拍都剪切/洗牌一次(约 0.31 s ≈ 96 BPM 的八分音符);按钮变形时加入 UI 点击声和轻柔爆裂声;加入打字提示音。
四种方案的共同风格偏好
- 一种点缀色(或品牌渐变)贯穿所有强调效果。2. 关键词采用特效,填充文字保持低调。3. 每句话都对应一个新的视觉创意;在第一个音节处剪切。4. 以 2D 世界为主,仅在高潮处使用 3D。5. 以真实素材(UI、帖子、照片)作为卡片浮现。6. 音效标记的是变化(新世界、揭示、点击),而不是每个字;VO 期间降低音乐音量;Logo 撞击前后留白,能增强其表现力。
15. 交付前 QA 检查清单
- 计划已获批准,预览已获批准(记录在 PROJECT.md 中)
- 开场在 ≤ 3 秒内出现;CTA 至少显示 2 秒
- VO 是用户提供的最终 MP3;与已批准脚本的转录差异检查无误(或差异已获批准)
- 字幕与 VO 一致、没有错字、位于安全区域内,对比度 ≥ 4.5:1
- SFX 已同步(±1 帧),VO 在音乐上方清晰可辨,−14 LUFS / −1.5 dBTP
- 抠像没有光晕、没有闪烁、没有丢帧;
ffprobe时长/帧率/分辨率正确 - H.264 yuv420p、AAC 48 kHz、faststart(
-movflags +faststart) - 已检查完整时长的联系表(§2b),没有遗留构图/重叠问题
- manifest.json 中的许可信息完整(未经用户确认,最终版本中不得包含
reference-only素材);LOG.md 已更新;最终版本已另存为新版本 - 字体许可文件已保存在
assets/fonts/中对应字体旁,并列入鸣谢 - 任何日志、清单、脚本或渲染的鸣谢中均不含 API 密钥值
- 竖屏/其他宽高比版本均为原生重新排版(而非裁剪/加黑边),并已通过联系表检查
- PROGRESS.md 已标记为
Phase: DONE,并注明最终文件路径、规格和鸣谢 - 提供清理选项:将
cache/(预览、日志、中间文件、分轨文件)移至操作系统废纸篓/回收站——绝不永久删除;保留 src、assets、renders
16. 使用 Playwright MCP 搜寻视觉素材(浏览任意网站,自行获取素材)
只要计划需要图片、纹理、照片、视频片段、图标、模型图或风格参考,而 API MCP(Pexels/Pixabay、LottieFiles、Freesound)无法很好地满足需求,就使用此方法,例如 Pinterest 情绪板、Behance/Dribbble 作品、品牌网站、产品页面、字体样张页面、免费纹理网站。自行完成;不要让用户去搜索。
来源顺序:(1)许可证明确的 API MCP(Pexels/Pixabay/Lottie/Freesound)→(2)通过视觉浏览的免费许可网站(Unsplash、Pexels 网页版、Pixabay 网页版、textures.com 免费内容、品牌媒体资料包、用户自己的网站/社交账号)→(3)Pinterest/Behance/Dribbble/任何网站,主要用于参考和情绪板,只有原始来源的许可证允许时才可用于最终成品。
循环(针对每项素材需求):
- 先写需求说明(在 PROGRESS.md 中写 1 行):需要什么、用途、风格(根据风格板)、宽高比/尺寸,以及 3–5 条搜索词(变换措辞,例如“青柠绿半透明键帽微距”“果冻键帽特写”…)。
- **打开并搜索:**使用
browser_navigate打开网站 → 关闭 Cookie/同意弹窗 → 使用browser_type在搜索栏输入查询词 → 使用browser_press_key Enter→ 使用browser_wait_for等待结果。 - **查看结果:**使用
browser_take_screenshot截图(使用browser_press_key PageDown向下滚动 2–3 次,查看更多结果)。根据需求说明进行视觉判断:风格是否匹配、色彩/调色板、光线、角度、分辨率、无水印、没有碍事的文字/Logo、是否适合裁切为 9:16。使用browser_snapshot获取可点击元素的引用。 - 打开最佳的 3–6 个候选项(使用
browser_click),截取每个详情页的截图,并检查尺寸/质量、作者和原始来源链接(Pinterest 上的 Pin 通常会链接到原始网站——打开该链接;署名和许可证信息都在原始网站上)。 - 下载全分辨率文件:
- 优先使用网站自带的下载按钮(文件会保存到 MCP 的
--output-dir,然后移至assets/…)。 - 否则,通过
browser_evaluate读取媒体 URL(例如() => [...document.images].map(i => i.currentSrc).filter(u => u.includes('pinimg'))),再用终端下载:curl -L -o assets/images/<name>.jpg "<url>"。Pinterest:将尺寸目录(/236x/、/474x/、/736x/)替换为/originals/,以获取最大版本。 - 视频:从
browser_network_requests获取<video>的 src 或.m3u8,然后运行ffmpeg -i "<m3u8>" -c copy assets/footage/<name>.mp4(如果已安装,也可运行yt-dlp "<page url>")。
- 优先使用网站自带的下载按钮(文件会保存到 MCP 的
- **验证:**使用
ffprobe检查(分辨率、时长、编解码器),查看文件,剔除低分辨率、模糊或带水印的素材,并删除重复项。使用描述性名称(keycap_lime_macro_01.jpg)。 - **展示所选素材:**生成联系表(
magick montage assets/images/new_*.jpg -tile 4x -geometry 400x400+8+8 renders/previews/assets_<topic>.jpg),并附上来源链接;用户批准后才能用于最终渲染。 - **记录:**将每个文件的信息写入
manifest.json(路径、页面 URL、直接 URL、作者、许可证、"use": "final" | "reference-only"),并在 LOG.md 中添加一行。
**登录与安全:**如果网站要求登录(Pinterest 经常如此),请用户在 Playwright 浏览器窗口中自行登录(持久化的 --user-data-dir 会让用户下次继续保持登录状态);切勿在聊天中索要密码。遵守网站条款和 robots 规则,放慢操作速度(不要批量抓取;除非用户要求,否则每个会话下载量不超过约 30 个),切勿移除水印或绕过付费墙/DRM。
**许可证规则:**Pinterest/Behance/Dribbble 上的图片归创作者所有。如果原始来源没有明确的许可证,请将文件标记为 reference-only——仅用于风格匹配、情绪板和第 13 节风格分析,然后用代码重现其效果;将其用于已发布的视频前,需先征求用户同意。