Fork me on GitHub

分类 OpenMontage 下的文章

学习 OpenMontage 的 12 条流水线

在前面几篇文章中,我们已经把 OpenMontage 跑了起来:装好环境、用 make demo 渲染了第一个零成本视频,体验了零 API key 的图片动画和真实素材纪录片,还学会了从一个参考视频出发让 agent 生成差异化方案,以及怎么接入各家 provider、让打分选择器替我们挑工具。

这些能力散落在不同场景里,今天我们把它们串起来,从一个更高的视角看 OpenMontage 是怎么组织一次完整生产的。答案是 pipeline(生产流水线)。OpenMontage 自带 12 条 pipeline,每一条都是一套从想法到成片的完整工作流。我们今天就来看看它们分别做什么、agent 怎么选、以及我们怎么用。

Pipeline 概览

OpenMontage 把不同类型的视频制作抽象成了不同的 pipeline,全部以 YAML 清单(manifest)的形式放在 pipeline_defs/ 目录下。每条 pipeline 对应一个真实的制作场景,这些我们在入门篇里曾提到过,这里再展开来看下:

12-pipelines.jpg

beta 的 pipeline 还没经过完整审计,能用,但可能有些粗糙的边角。OpenMontage 的 agent 在你选到 beta pipeline 时会主动提醒这一点。

除此之外还有一条 framework-smoke,那是一个最小的两阶段冒烟测试,用来验证框架本身是否正常,不参与真实生产。

这 12 条 pipeline 覆盖了相当宽的需求面:想做知识科普选 animated-explainer,想做吉卜力风动画选 animation,想剪一段电影感预告选 cinematic,想把一期两小时的播客拆成十几条社媒短片选 clip-factory,想把视频翻译配音成其他国家语言选 localization-dub

实际选择时,可以按几个问题往下分:

how-to-select-pipeline.jpg

  • 有现成素材吗?

    • 有自己的录屏 → screen-demo
    • 有一段长视频要拆条 → clip-factory / podcast-repurpose
    • 有别人的参考视频 → 任意 pipeline 配上参考输入(第三篇讲过的玩法)
  • 从零开始,要真人或数字人吗?

    • 要数字人讲述 → avatar-spokesperson
    • 要真实动态素材、不要 AI 画面 → documentary-montage
    • 纯 AI 生成,再看偏哪种:低成本动画走 animation,电影感预告走 cinematic,知识科普走 animated-explainer

Rule Zero

在动手之前,有一条贯穿 OpenMontage 的硬规则,官方文档把它叫做 Rule Zero:任何视频生产请求都必须走 pipeline 系统,没有例外。

rule-zero.jpg

这条规则写在 AGENT_GUIDE.md 里。当我们让 agent 做、生成、制作任何视频时,它必须:

  1. 选定 pipeline:把请求匹配到 pipeline_defs/ 里的某一条;不清楚就直接问我们
  2. 读 manifest:搞清楚这条 pipeline 有哪些阶段、用哪些工具、有哪些质量门禁
  3. 跑 preflight:通过 registry 发现当前可用的工具,把能力菜单呈现出来(上一篇学习过)
  4. 逐阶段执行:每进入一个阶段,先读该阶段的 director 技能,再干活
  5. 调工具前先读 Layer 3 技能:用任何带 agent_skills 的工具前,先读它引用的 provider 专属技能

反过来,agent 被明确禁止这么做:

  • 写临时 Python 脚本直接调工具
  • 跳过 pipeline 直接调 API
  • 没读 stage director 技能就生成资产
  • 绕过 preflight、checkpoint 或 review

这条规则背后的设计取向很明确:智能在技能里,不在临时代码里。一个完整读过 director 技能和 Layer 3 知识再动手的 agent,产出质量会明显高于一个拿着通用提示词直接调工具的 agent。

简单来说,我们该把每一个视频需求都当成一个 pipeline 选择问题:先选对流水线,再读清单,再读阶段技能,最后才动工具。

Pipeline 的阶段流转

12 条 pipeline 各有侧重,但骨架是相通的。一条「从零全生成」的 pipeline(animated-explaineranimationcinematic 这类)大致是下面这七八个阶段:

  1. research(研究):上网调研选题,收集数据点、受众真实提问和视觉参考,产出一份带出处的研究简报。
  2. proposal(方案):基于调研给出 2~3 个差异化概念和分项成本估算,等你拍板选一个。
  3. script(脚本):把选定的概念写成逐句脚本和旁白文案。
  4. scene_plan(分镜):把脚本拆成一个个镜头/场景,定好每个场景要什么画面、多长。
  5. assets(资产):按分镜逐个生成或采集素材,图、视频片段、配音、音乐都在这一步。
  6. edit(剪辑):决定素材怎么排列、转场、卡点,产出一份剪辑决策。
  7. compose(合成):按剪辑决策把素材渲染、拼合成最终视频。
  8. publish(发布):输出成片,并生成封面、说明等发布物。

pipeline-steps.jpg

不同 pipeline 会在这条主干上增减。以现成素材为主的那几条(screen-democlip-factoryhybridtalking-head 等)不走 research/proposal,而是用一个更轻的 idea 阶段开场;documentary-montage 干脆没有 script,采到素材就直接进分镜;character-animation 则在脚本和分镜之间多插了角色设计、骨骼绑定两步。但「先想清楚、再写脚本、再分镜、再生成资产、再剪辑、再合成」这条主线是一致的。

每个阶段都有一个专属的 director 技能(一个 Markdown 指令文件),手把手教 agent 这个阶段该怎么做:读技能、用工具、自审、过 checkpoint(阶段检查点),并在创意决策点请我们批准。比如 proposal(方案)之后通常有一道人工批准,agent 会停下来等我们点头再往下走。

这里有一个点值得强调:web research 被放在最前面。在写下脚本的第一个字之前,agent 会先去搜 YouTube、Reddit、Hacker News、新闻站和学术来源,收集数据点、受众真实提问、热门角度和视觉参考,写进一份结构化的研究简报并逐条标注出处。这样产出的视频建立在真实、当下的信息之上,而不是凭空编造。

Pipeline 清单详解

开头提过,每条 pipeline 都是 pipeline_defs/ 下一份声明式的 YAML 清单(manifest)。前面又讲了它有哪些阶段,这一节就以 animated-explainer.yaml 为例,看看这些阶段和规则具体是怎么写的。

开头声明基本信息:

name: animated-explainer
version: "2.0"
description: >
  Generated explainer video from topic/idea - fully AI-produced
  with narration, visuals, and music.
category: generated
stability: production
default_checkpoint_policy: guided

这几行相当于 pipeline 的「身份证」:name 是标识,description 一句话说清它产出什么,stability: production 表示它经过完整审计、可放心用(就是表格里那一列稳定性)。

category 是它的大类,一共七种:

  • generated:纯 AI 从主题生成,不依赖现成素材(animated-explainer 就是这类)
  • animation:动效、动画
  • cinematic:电影感
  • screen_recording:录屏
  • talking_head:真人讲话
  • hybrid:现成素材 + AI 补充
  • custom:其他、自定义

default_checkpoint_policy 定的是默认的检查点策略,一共三档,本条用的是 guided

  • guided(默认):agent 在关键节点停下来征求我们的意见
  • manual_all:每个阶段都要人工过一遍,最稳但最麻烦
  • auto_noncreative:非创意阶段自动放行,只在创意决策点停,最省事

再往下有一段 orchestration,管这条 pipeline 的编排策略和预算:

orchestration:
  mode: executive-producer
  skill: pipelines/explainer/executive-producer
  budget_default_usd: 2.00        # 默认预算
  max_revisions_per_stage: 3      # 每个阶段最多返工 3 次
  max_send_backs: 3               # 最多打回上一阶段 3 次
  max_wall_time_minutes: 20       # 墙钟时间上限,免得 agent 在某个环节死磕,把时间和钱无限耗下去

其中 modeskill 用的是影视剧组的说法:这条 pipeline 由一个执行制片人(executive-producer)统筹全局,它像监制一样管预算进度、调度各阶段、把关质量。而下面每个阶段各配一个导演(director),是那一步的行家、只对自己这段负责(比如后面会看到的 proposal-directorresearch-director)。producer 统筹、director 各管一段,正好对应一个真实制作团队的分工。

接着是 stages 阶段列表,animated-explainer 一共八个阶段:

stages:
  - name: research      # 研究
  - name: proposal      # 方案
  - name: script        # 脚本
  - name: scene_plan    # 分镜
  - name: assets        # 资产
  - name: edit          # 剪辑
  - name: compose       # 合成
  - name: publish       # 发布

每个阶段都用同一套字段描述。我们挑 proposal(方案)阶段展开看:

- name: proposal
  skill: pipelines/explainer/proposal-director   # 这个阶段读哪个 director 技能
  required_artifacts_in:
    - research_brief                              # 依赖上一阶段的产物
  produces:
    - proposal_packet                            # 本阶段产出的工件
    - decision_log
  checkpoint_required: true
  human_approval_default: true                   # 这一步需要人工批准
  review_focus:                                  # 自审要盯的点
    - Concept options are genuinely different
    - Cost estimate is itemized and honest
  success_criteria:                              # 验收标准
    - Schema-valid proposal_packet with at least 3 concept_options
    - approval.status is "approved" before proceeding

每个阶段都写清了:读哪个技能、依赖什么、产出什么、要不要 checkpoint、要不要人工批准、自审盯哪些点、验收标准是什么。human_approval_default: true 意味着 agent 跑完这一步会停下来等我们点头才继续。验收标准往往是硬指标,比如 research 阶段要求「至少 3 个数据点」「至少引用 5 个带 URL 的来源」,agent 读到就知道这一步要做到什么程度才算合格。

阶段之间靠规范化的产物(artifact)衔接:research 出 research_brief、script 出 script、scene_plan 出 scene_plan、assets 出 asset_manifest、edit 出 edit_decisions、compose 出 render_report。每种产物都有对应的 JSON Schema 做校验,放在 schemas/artifacts/ 下;上一阶段的产物先过校验,合法了才进入下一阶段。

到这里看到的都是单条 pipeline 自己的 manifest。它之上还有一层管全局的配置,在项目根目录的 config.yaml 里:LLM、输出格式、路径这些项目级默认都放在这,预算也是。还记得前面 orchestration 里的 budget_default_usd 吗?那只是这条 pipeline 单次运行的默认额度config.yaml 里的这段 budget 管的则是整个项目的钱

budget:
  mode: warn                     # observe | warn | cap
  total_usd: 10.00
  reserve_pct: 0.10              # 给重试和清理留的余量
  single_action_approval_usd: 0.50
  require_approval_for_new_paid_tool: true

total_usd 是全局的总预算上限($10),单条 pipeline 那 $2 的默认额度也在它之内;single_action_approval_usdrequire_approval_for_new_paid_tool 则是全局的批准规矩:单次动作超过 0.5 美元、或者要启用一个新的付费工具,都会先问过我们再执行,不会偷偷把账单刷上去。

这套设计的好处是,整条流水线的行为(阶段、工具、审查重点、验收标准、批准与预算策略)全写在可读可改的 YAML 里,我们随时能打开看、甚至照着改一份自己的;Python 那边只负责提供工具和持久化。这正是 agent-first 架构的精髓:把人类制作团队的经验,沉淀成 agent 能读懂的指令

Prompt Gallery 实战

理论讲得差不多,最后动手跑两个。这一节的例子都来自仓库里的 PROMPT_GALLERY.md,那是一份现成的提示词菜单,按花费和用途分好了组:有零成本就能跑的,有花费很低的,也有配齐全套、效果更好的;还按人群分了类(老师、开发者、独立开发者、内容创作者)。每条都能直接复制,挑一条丢给你的 AI 编程助手,它会照着 Rule Zero 选好 pipeline、逐阶段把视频做出来。下面挑两条我自己跑过的。

第一条是吉卜力风动画,走 animation pipeline,属于花费很低的那一档。

做一条 30 秒的吉卜力风动画:黄昏金光下,一座漂浮在云端的魔法图书馆。
书本在书架之间飘荡,暖光透过彩色玻璃窗洒进来,一只小猫在书桌上打盹。

跑完十来分钟,就得到一条带镜头运动和配乐的动画短片。下面是我这次跑出来的效果:

cloud-magic-library.jpg

第二条是电影感预告片,走 cinematic pipeline,偏电影质感,花费和耗时都要高一些。

做一条 30 秒的电影感预告片,科幻设定:人类收到一条来自一千年后未来的警告。
请使用动态视频片段、电影感配乐和富有张力的标题卡。

我跑出来的结果如下:

warning-from-the-future.png

两条一对比就能看出来:同样是 30 秒,选的 pipeline 不同,质感和花费能差出一个量级。至于每个环节具体调用哪个工具、花多少钱,取决于你配了哪些 key,你不用操心,agent 会照上一篇讲的打分选择器,在当前可用的工具里自动权衡。如果你想要的是真实素材而不是 AI 画面,还可以试试 documentary-montage,它从 Archive.org、NASA、Wikimedia 等公开库检索真实片段剪成时间线(第二篇细讲过),触发时在提示词里写明 use real footage only 即可。

具体做什么、做成什么样,就随你了。每个人跑出来的内容本就不一样,与其照抄我的,不如打开 PROMPT_GALLERY.md,按预算和用途挑一条中意的,改改主体和风格,做一条自己的视频。

小结

今天我们学习了 OpenMontage 的 pipeline 系统,回顾一下:

  • 首先,我们认识了 12 条内置 pipeline。OpenMontage 把不同类型的视频制作抽象成了不同的流水线,从 AI 全生成的讲解、动画、电影感预告,到录屏、数字人、长视频拆条、多语言配音和真实素材纪录片,基本覆盖了主流场景;具体选哪一条,按「有没有现成素材、要不要真人、偏哪种风格」往下分就行。
  • 随后,我们学习了 Rule Zero。这是贯穿全系统的一条硬规则:任何视频生产都必须走 pipeline,agent 得先选流水线、再读清单、再读阶段技能,最后才动工具,不允许写临时脚本抄近道。
  • 接着,我们梳理了 每条 pipeline 的阶段流转。从研究、构思,到脚本、分镜、生成资产、剪辑、合成,多数还有一步发布;每个阶段都配一个专属的 director 技能手把手带着 agent 做,而 web research 被放在最前面,让成片建立在真实、当下的信息之上。
  • 最后,我们打开一份 manifest,看清了 pipeline 到底是怎么声明的。阶段、工具、编排预算、审查重点、验收标准、批准策略,全写在一份可读可改的 YAML 里,再配合全局的 config.yaml;Python 只负责提供工具和持久化,真正的智能沉淀在这些技能和清单里。

至此,这个 OpenMontage 系列也暂时告一段落了。从安装环境,到零成本生成视频,从参考视频生成差异化方案,到工具发现、Provider 选择,再到今天的 Pipeline 架构,希望读完之后,你不仅知道 OpenMontage 能做什么,更理解了它为什么会设计成现在这个样子。

剩下的,就交给你去实践了。挑一条 pipeline,换一个自己的主题,跑出第一条真正属于自己的视频,也许会比继续读更多文档更有收获。

参考


学习 OpenMontage 的工具发现与打分选择器

在前面的几篇文章里,我们已经体验了 OpenMontage 的零成本玩法:用 Piper 配音、用免费素材剪纪录片、用 Remotion 把图片做成动画,全程不花一分钱 API 费用。我们也试过贴一个参考视频,让 agent 帮我们拆解出差异化的制作方案。

不过零成本路径终究有上限。想要 FLUX 的图、Veo 或 Kling 的真实运动镜头、ElevenLabs 的高质量配音,就得接入对应的 provider。OpenMontage 支持的 provider 有几十个,同一个能力往往有好几个、多的有十几个候选。今天我们就来看两件事:怎么加 key 解锁更多工具,以及 OpenMontage 是怎么在一堆 provider 里自动挑出最合适的那一个。

解锁更多工具

OpenMontage 的所有 API key 都写在项目根目录的 .env 文件里。make setup 会从 .env.example 生成一份空的 .env,你按需填就行。每个 key 都是可选的,加得越多,能用的工具越多。

这里有个坑。make setup 拷出来的 .env,每个 key 后面都跟着一段行内注释,形如 FAL_KEY= # FLUX images...。而 OpenMontage 自带的解析器(_load_dotenv)很朴素:它把等号后面的内容整段取出,只去掉首尾空格和引号,并不会剥掉 # 注释,于是注释会被当成 key 的值,密钥直接失效。填的时候,把这一行的行内注释删掉、只留 KEY=你的值,最稳妥。

打开 .env.example,可以看到 key 是按能力分组的。下面是主要的几个:

环境变量解锁的能力
FAL_KEYFLUX 图像、Google Veo 视频、Kling 视频、MiniMax 视频、Recraft 图像(一个网关覆盖多家)
GOOGLE_API_KEYGoogle Imagen 图像、Google Cloud TTS(700+ 声音、50+ 语言)
ELEVENLABS_API_KEYTTS 旁白、音乐生成、音效
OPENAI_API_KEYOpenAI TTS、DALL-E 图像
XAI_API_KEYGrok 图像生成/编辑、Grok 视频生成
DOUBAO_SPEECH_API_KEY火山引擎豆包语音 TTS(中文配音友好)
SUNO_API_KEYSuno 整曲音乐(任意风格的完整歌曲、纯伴奏)
HEYGEN_API_KEYHeyGen 网关(一个 key 调 VEO、Sora、Runway、Kling、Seedance)
RUNWAY_API_KEYRunway Gen-4 视频(直连 API)
PEXELS_API_KEY / PIXABAY_API_KEY / UNSPLASH_ACCESS_KEY免费图库素材(开发者 key 免费申请)

Piper 本地语音不需要任何环境变量,pip install piper-tts 装上就能用。

把这些 provider 和它们解锁的能力放在一起看,OpenMontage 的能力版图大致是这样一张图:

openmontage-provider-landscape.jpg

先做一次预检

加完 key,怎么知道到底解锁了哪些工具?这就要做一次 Preflight(预检),让 OpenMontage 汇总一下当前机器有哪些能力可用。上一篇里 CC 在「盘点能力」时跑的就是它;AGENT_GUIDE.md 把预检列为开工前的必做项,agent 每次动手前都会先跑一遍。

最简单的方式是运行下面的命令:

$ make preflight

它底层就是一行 Python 代码,先调用 registry.discover() 扫描 tools/ 包,把所有工具类发现并登记进来,再调用注册表的 provider_menu() 把结果打印出来:

python -c "
from tools.tool_registry import registry; 
import json; 
registry.discover(); 
print(json.dumps(registry.provider_menu(), indent=2))
"

输出结果是一个 JSON,它的顶层结构如下:

{
  "analysis":            { … },
  "audio_processing":    { … },
  "avatar":              { … },
  "character_animation": { … },
  "clip_acquisition":    { … },
  "clip_retrieval":      { … },
  "corpus_population":   { … },
  "enhancement":         { … },
  "graphics":            { … },
  "image_generation":    { … },
  "music_generation":    { … },
  "music_search":        { … },
  "screen_capture":      { … },
  "source_ingest":       { … },
  "subtitle":            { … },
  "tts":                 { … },
  "video_generation":    { … },
  "video_post":          { … }
}

光看这些顶层 key 就能看出,预检覆盖的是 OpenMontage 的整条产线,一共 18 个能力家族。大致可归成四类:

  • 生成:直接产出素材,包括图像 image_generation、视频 video_generation、配音 tts、音乐 music_generation,外加角色动画 character_animation 和数字人 avatar。视频这族最庞杂,从云端的 Veo、Kling、Runway 到能在本地跑的 Wan、Hunyuan 都在里面。
  • 素材获取:不生成,而是去现成素材库里找,有两条路。一条是即搜即用clip_acquisition 直接去十几个免费源(Pexels、Archive.org、NASA、维基共享等)在线搜,搜到后直接下载使用;另一条是先建库再检索,为大批量、反复挑片准备:corpus_population 先把一批候选素材抓下来、用 CLIP 向量建成离线索引库,clip_retrieval 再在这个库里按语义相似度挑片去重,省掉每次编辑都重新调 API。此外还有一个 source_ingest 用于下载单个在线视频。
  • 分析理解:只有 analysis 一族,共 11 个工具,负责拆参考视频、切场景、抽关键帧、算音频能量,上一篇 agent「盘点参考视频」跑的就是它。
  • 后期与合成:把素材拼成成片。核心 video_post 里,FFmpeg、Remotion、HyperFrames 三个渲染引擎都在;此外还有音频处理 audio_processing、画质增强 enhancement、字幕 subtitle、图形 graphics、录屏 screen_capture 等丰富的能力。

每个家族内部的结构都一样:一个 available 列表、一个 unavailable 列表,外加 total / configured 计数;不可用的工具还各带一句 install_instructions,告诉你怎么安装。以配音 tts 为例:

"tts": {
  "available": [
    { "name": "google_tts", "runtime": "api",   "status": "available" },
    { "name": "openai_tts",  "runtime": "api",   "status": "available" },
    { "name": "piper_tts",   "runtime": "local", "status": "available" }
  ],
  "unavailable": [
    { "name": "doubao_tts",     "install_instructions": "Set DOUBAO_SPEECH_API_KEY ..." },
    { "name": "elevenlabs_tts", "install_instructions": "Set ELEVENLABS_API_KEY ..." }
  ],
  "total": 5,
  "configured": 3
}

通过这套结构,一眼就能看出哪些能力还空白,加哪个 key 收益最大。上一篇 CC 动手做参考视频前先跑了这遍预检,发现音乐是唯一的能力缺口,于是没有硬着头皮往下做,而是回头问我怎么处理,是配个音乐生成的 key,还是先不要背景音乐。

选择器模式

知道了有哪些工具,下一个问题是怎么挑。回头看 preflight 列出的能力家族,每个家族下往往挂着好几个工具,但它们分两种情况。一种是各司其职,比如 analysis 家族里 scene_detect 切场景、frame_sampler 抽帧、transcriber 转写,各干各的活,agent 要做哪件事直接调对应的那个工具就行,没有选择的问题。另一种是可以互相替代,比如 tts 家族里 ElevenLabs、Google、OpenAI、Piper 都能出旁白,video_generation 家族里十几个工具都能产出视频片段,这时才需要从一堆候选里挑一个最合适的。这一节讲的就是后一种情形。

在讲怎么选之前,先看每个「工具」长什么样。OpenMontage 里每个工具都继承自 tools/base_tool.pyBaseTool,声明了一组契约字段,我做了下精简:

class BaseTool(ABC):
    capability: str = "generic"      # 属于哪个能力家族(tts、image_generation…)
    provider: str = "openmontage"    # 对接哪家 provider
    best_for: list[str] = []         # 擅长什么
    not_good_for: list[str] = []     # 不擅长什么
    supports: dict = {}              # 支持哪些特性(reference_image、native_audio…)
    provider_matrix: dict = {}       # 网关型工具挂的多个模型
    fallback: str | None = None      # 不可用时退到谁

一个工具就是对某个 provider 某项能力的封装:provider 字段标明它对接哪家(fluxopenaigoogle_tts……),capability 字段标明它属于哪个能力家族,也就是 preflight 那份 JSON 里 ttsimage_generation 那些顶层分组名。多数工具是「一个工具对应一个 provider」,也有网关型工具用 provider_matrix 同时挂上好几个模型,比如 heygen_video 背后就是 VEO、Sora、Kling 一串。

当同一个能力下挂着好几个可以互相替代的工具时,OpenMontage 会给它配一个选择器(Selector)做统一入口:靠 registry.get_by_capability(...) 从注册表把这个能力下的工具全捞出来,凑成一份候选名单;至于从名单里挑哪个,留到下一节细说。目前一共 4 个选择器:

选择器对应 capability路由到的工具
tts_selectorttsElevenLabs、Google TTS、OpenAI、Piper、豆包
image_selectorimage_generationFLUX、Imagen、DALL-E、Recraft、本地 Stable Diffusion、免费图库
video_selectorvideo_generationVeo、Kling、WAN、Hunyuan、LTX 等十几个
screen_capture_selectorscreen_captureCap、FFmpeg 录屏

四个选择器对应配音、图像、视频、录屏这四类能力,其余家族的工具各司其职,用不上选择器。

七维度打分

选择器知道了候选名单,那怎么排序?早期的朴素做法是取第一个可用的 provider,但这显然不够好:免费的图库素材和 FLUX 生成图都处于可用状态,可它们适合的场景天差地别。

OpenMontage 的做法是给每个候选 provider 打分,而且是七个维度的加权打分。实现位于 lib/scoring.py,核心是一个 ProviderScore 数据类:

@dataclass
class ProviderScore:
    tool_name: str
    provider: str
    task_fit: float = 0.0        # 与这个资产类别的契合度
    output_quality: float = 0.0  # 预期成品保真度
    control: float = 0.0         # 参考图/风格的可控性
    reliability: float = 0.0     # 运行时可靠性
    cost_efficiency: float = 0.0 # 每美元能买到的质量
    latency: float = 0.0         # 出活速度
    continuity: float = 0.0      # 与已锁定决策的一致性

    @property
    def weighted_score(self) -> float:
        return (
            self.task_fit * 0.30
            + self.output_quality * 0.20
            + self.control * 0.15
            + self.reliability * 0.15
            + self.cost_efficiency * 0.10
            + self.latency * 0.05
            + self.continuity * 0.05
        )

七个维度都归一化到 0 到 1,加权汇总成一个总分。权重分配把意图契合和成品质量放在最前面:

维度权重含义
task_fit0.30与任务意图、资产类型的契合度
output_quality0.20预期成品保真度
control0.15参考图、风格迁移等可控性
reliability0.15运行时可靠性(生产级工具基线更高)
cost_efficiency0.10性价比,免费记 1.0,超预算记 0.0
latency0.05出活速度,本地工具更占优
continuity0.05与前面已锁定的 provider 是否一致

在逐维展开之前,我们需要知道一件事:每个选择器本身就是一个工具,它的入参大致如下:

{
    "prompt": "给量子产品做条电影感预告",       # 必填:这次要生成什么
    "operation": "text_to_video",              # 生成方式:文生 / 图生 / 参考视频 / 只排名
    "task_context": {                          # 喂给打分器的上下文
        "intent": "给一款量子产品做电影感发布预告",
        "style_keywords": ["cinematic", "minimalist"],
        "asset_type": "video",
        "budget_remaining_usd": 0.5,
        "motion_required": True,
        "locked_providers": {"openai"},
    },
    # 还有 aspect_ratio、duration、reference_image_* 等透传给 provider 的参数
}

其中 task_context 就是打分器真正要用的那份上下文,而这份结构化的上下文,正是 agent(也就是 CC)生成的,它在调用工具时将用户的「照着 VOID 做条量子计算的电影感预告」这句话读懂,并填充这些结构化字段,选择器拿到后就可以根据这些信息做确定性的加权算分。从这里也可以看出 OpenMontage 的分工设计:语言理解交给 agent,确定性的规则留给 Python。

有了这份 task_context,七个维度各自怎么打出 0 到 1 的分就有了依据:

  • task_fit:这里有两组输入,一句话的意图(这次要做成什么,比如「量子产品的电影感预告」)和一组单独的风格关键词(比如「极简」「暗调」)。二者各自拆成词,分别和工具 best_for 里的词算重合度,得到「意图分」和「风格分」,最后按 意图分 × 0.7 + 风格分 × 0.3 + 0.1 合成,意图占大头。匹配是纯关键词的,不用向量或语义模型,只额外挂了一张手写同义词表(「cinematic / film / movie / trailer」算一组、「stock / footage / b-roll」算一组……)让近义词也能对上;重合度用「交集 ÷ 较小的一方」,免得 best_for 写得越丰富的工具反而被压分。这个维度权重最高,是这工具擅不擅长这个任务的主要判断依据。
  • output_quality:优先用工具实测的质量分;没有就按稳定性等级兜底。稳定性等级是每个工具在代码里自报的 stability 字段,分 production(生产)、beta(测试)、experimental(实验)三档,不声明就默认最保守的 experimental;据此给分:生产级 0.9、测试级 0.7、实验级 0.4,生成类的生产级工具再加 0.05。
  • control:看工具 supports 里支持哪些可控特性,按每个特性能给多大创作控制力来加权求和:controlnet(2.0)、参考图(1.8)、风格迁移和局部重绘(1.5)、img2img(1.3)这类能实打实左右生成结果,权重高;seed(0.5)、宽高比这类只能微调,权重低。把命中的权重加起来归一化到 0 到 1,支持得越多越强,分越高。
  • reliability:有历史成功率就直接用;没有就看状态,可用且生产级 0.95、可用但非生产级 0.8、降级 0.4、不可用 0.0。
  • cost_efficiency:免费直接 1.0;有预算时按「预估成本占剩余预算的比例」给分,占用超过一半压到 0.1、超过两成给 0.5、否则 0.8;预算未知时按绝对成本递减估(几分钱 0.9,逐档降到 1 美元以上的 0.3)。
  • latency:有实测中位耗时就按档给分(1 秒内 1.0、10 秒内 0.8、30 秒内 0.6、60 秒内 0.4,更慢 0.2);没有就按运行方式估,本地 / 本地 GPU 0.9、混合 0.6、云端 API 0.4。
  • continuity:这个 provider 前面已经锁定过就给 0.9(风格更连贯),没有历史给 0.5,换成别家给 0.4(可能风格断裂)。

在这些基础分之上,还有几条针对具体场景的加减:任务要运动镜头、可候选却只会出静图,它的 task_fit 直接乘 0.2 重罚;意图里带 cinematic、trailer 这类词,支持原生音轨、多镜头、运镜控制等特性的高端工具按命中数加分;本来想要生成的画面、却给了个图库工具,task_fitoutput_quality 一起打折。也就是说,打分器懂得把电影感的活交给擅长电影感的工具。

排好序之后,agent 看到的是一份带分数的候选清单,类似:

1. flux_image (fal.ai) — score: 0.86 [fit=0.9 quality=0.9 control=0.7 ...]
2. recraft_image (recraft) — score: 0.78 [fit=0.8 quality=0.8 control=0.6 ...]
3. pexels_image (pexels) — score: 0.55 [fit=0.6 quality=0.6 control=0.3 ...]

agent 看完打分和各维度拆解后再做选择,并把这次选择连同考虑过哪些备选、为什么选它一并写进可审计的决策日志(decision_log)。这带来两个好处:每一次 provider 选择都是可解释的,不再是因为它恰好可用而被选中;同时你完全可以自由换 provider,OpenMontage 不和任何一家厂商绑定。

最后补充一点,上面这套选择器加七维打分,管的是同一能力下的多个工具之间怎么选,而一个工具内部在多个源之间怎么挑,是另一回事。比如素材获取 clip_acquisition 家族其实只有 direct_clip_search 一个工具,它内部支持 Pexels、Archive.org、NASA 等十几个免费源,在这些源之间,它用的是一套简单得多的办法:每个源带一个 priority 优先级,默认按优先级从高到低挨个查,凑够需要的片段数(clips_per_query)就停,你也可以让 agent 指定只用某几个源。

解锁本地免费工具

前面解锁的 provider 大多是付费云端 API。但如果你的机器有一块像样的 GPU,还能解锁一批本地、离线、零 API 费用的工具。make install-gpu 会把 PyTorch、diffusers 这套本地推理依赖装上;视频生成还要在 .env 里显式打开、选一个模型:

make install-gpu

# 视频生成需要在 .env 里再加:
VIDEO_GEN_LOCAL_ENABLED=true
VIDEO_GEN_LOCAL_MODEL=wan2.1-1.3b   # 或 wan2.1-14b、hunyuan-1.5、ltx2-local、cogvideo-5b

配好之后,preflight 里就能看到一堆标着 local_gpu 的工具了。

除此之外,能本地做的远不止视频一种,下面做一个汇总,感兴趣且有条件的朋友可以试试:

  • 生成:图像 local_diffusion(本地 Stable Diffusion);视频 wan_videohunyuan_videoltx_video_localcogvideo_video(Wan、Hunyuan、LTX、CogVideo 四家本地模型)。
  • 修复与增强upscale(Real-ESRGAN 超分放大)、face_restore(CodeFormer 修脸)、bg_remove(rembg 抠图去背景)。
  • 数字人talking_head(SadTalker,让一张静态头像开口说话)、lip_sync(Wav2Lip,把口型对上一段音频)。
  • 理解与转写video_understand(CLIP / BLIP-2 看懂画面内容)、transcriber(faster-whisper 本地语音转写,有 GPU 会快很多)。

其中有几个还要按各自的 install_instructions 再补装一两个包(比如超分的 Real-ESRGAN、数字人的 SadTalker / Wav2Lip)。这些本地工具落到选择器加打分里也占便宜:latencycost_efficiency 两项通常评分很高,等于免费、离线、还不用排队。对于愿意用显卡换钱包的人,这是一整条本地免费的产线。

小结

今天我们学习了 OpenMontage 的工具发现和选择机制,最后来总结一下:

  • 首先,我们了解了 Provider 的解锁方式。OpenMontage 把所有第三方能力都做成了可插拔的 Provider,.env 里的每一个 API Key 都只是解锁对应的一组工具,而不是绑定某一家平台。需要什么能力,就添加什么 Key;没有 Key,也仍然可以依靠 Piper、本地模型和免费素材完成不少工作。
  • 随后,我们学习了 Preflight(预检)。它会自动扫描整个 tools/ 目录,发现所有工具,并根据当前环境生成一份能力清单,让 agent 在真正开始工作之前先知道「现在有哪些工具可以用、哪些还没配置」。对于 AI Agent 来说,这一步相当于开工前的设备检查,也让能力缺口一目了然。
  • 接着,我们重点分析了 Selector(选择器)模式。当一个能力对应多个可以互相替代的 Provider 时,Agent 并不会写死调用哪一家,而是统一交给对应的选择器处理,把所有候选工具集中起来进行比较。这种设计把「做什么」和「用谁做」彻底分离,使整个系统具备了很好的扩展性。
  • 最后,也是 OpenMontage 比较有特色的一部分,就是 七维度打分机制。系统不会因为某个 Provider 恰好可用就直接采用,而是综合任务契合度、生成质量、可控性、可靠性、成本、速度以及风格连续性等七个维度进行加权评分,再把排序结果交给 Agent 决策,并记录完整的决策日志。整个选择过程既自动化,又具备可解释性。

工具和 provider 备齐了,接下来就该看 OpenMontage 是怎么把这些能力组织成一条条完整制作流水线的。它内置了 12 条 pipeline,从动画到电影感再到纪录片各有打法。我们明天就来逐一学习它们。

参考


学习 OpenMontage 的参考视频玩法

前两天我们把 OpenMontage 装好、跑通了零成本的 demo,也分别走了图片视频和真实素材两条免费路线。这些玩法有个共同点:你得先想好选题,再去描述你要什么。

但很多时候,做视频最难的不是执行,而是我到底要做成什么样。你刷到一条特别带感的短视频,心里想我也想要这种感觉,可真要你把那种节奏、那种钩子、那种风格用文字描述清楚,反而写不出来。OpenMontage 提供了一个更省心的起点:直接把那条视频丢给它。

今天我们就来看这个从参考视频出发的玩法。

比从空白提示词更快

从一段参考视频出发,往往比从一个空白提示词出发更快。与其逼自己硬拼出一段完美的提示词,不如让 agent 去看一段真实存在的好视频,从里面提炼出可复用的东西。OpenMontage 支持多种参考来源:YouTube 视频、YouTube Shorts、Instagram Reels、TikTok 这些长短视频,甚至本地的一段片段都行。

这种把主题、风格、镜头、语气、各种限定一股脑堆在一起的提示词,社区里有个形象的叫法 prompt spaghetti(提示词面条)。它借自程序员熟悉的「spaghetti code(意大利面条式代码)」,指那种逻辑缠成一团、没有结构、读起来像一盘搅在一起的面条的烂代码。prompt spaghetti 就是提示词版的它:又长又乱、彼此缠绕,难写难调还未必管用。

你要做的只是粘贴一段视频,再加一句你想要什么:

Here's a YouTube Short I love. Make me something like this, but about quantum computing.
# 我很喜欢这条 YouTube Short,照着它的感觉给我做一个,但主题换成量子计算

agent 拿到后不会给你一份原视频的拙劣复刻,而是会明确告诉你它保留什么、改变什么:保留参考视频的节奏、钩子形式、整体结构和基调,改掉主题、视觉处理、切入角度和叙述方式。除此之外,它还会在动手生成素材之前,先告诉你这条片子大概要花多少钱、以你手上现有的工具实际能做成什么样,而不是承诺一个做不到的效果。最后你拿回的是 2 到 3 个差异化的概念方案,外加一段样片,再决定要不要全量制作。

这套机制在 Claude Code、Cursor、Copilot、Windsurf、Codex 上都能用,任何能读文件、能跑代码的 AI 编程助手都行。换个需求、换个说法也一样:

Analyze this Reel and give me 3 original variants I could make for my own product launch.
# 分析这条 Reel,给我 3 个能用在自己产品发布上的原创变体
I like the pacing and hook in this video. Keep that energy, but turn it into a 45-second explainer about black holes.
# 我喜欢这条视频的节奏和钩子,保留这种感觉,但做成一个 45 秒、讲黑洞的解说视频

第一个偏向找灵感变体,第二个偏向抽取节奏后换主题,是两种很常见的需求。

reference-to-concepts.jpg

实测:把 VOID 仿成量子计算版

OpenMontage 官方样片里有一条叫 VOID 的广告片,它是一款虚构脑机接口产品的发布预告,画面像苹果发布会一样克制、留白,一帧一个卖点,配一段沉稳的旁白,整条片子花了 0.69 美元。我挺喜欢这种有质感的风格,于是我在 Claude Code 里直接将视频链接丢给它,然后让它仿照着做一条量子计算主题的:

https://github.com/user-attachments/assets/8a6d2cc3-7ad2-46f5-922f-a8e3e5848d9f
Here's a video I love. Make me something like this, but about quantum computing.
# 我很喜欢这条视频,照着它的感觉给我做一个,但主题换成量子计算

CC 一上来先读了 AGENT_GUIDE.md,认出这是「make me something like this」式的 参考驱动(reference-driven) 请求。这个入口不是什么隐藏功能,而是写进了 OpenMontage 给 agent 的工作契约里:AGENT_GUIDE.md 有专门的一节 Reference Video Entry Point,规定 agent 一旦收到参考视频,必须先读 skills/meta/video-reference-analyst.md 这个 meta skill(元技能,专门驱动 agent 的指令文件),照着它规定的一整套分析流程走完,再给差异化的概念,而不能直接复制。下面就是 CC 这一遍实际走过的几步。

第一步:拆解参考视频

CC 先把 VOID 下载下来分析。这一步要用到哪些工具,可以在 pipeline 清单里看到。以 pipeline_defs/animated-explainer.yaml 为例,它有一个 reference_input 块:

reference_input:
  supported: true
  analysis_depth: standard
  analysis_tools:
    - video_analyzer
    - transcript_fetcher
    - video_downloader
    - scene_detect
    - frame_sampler

这里的 video_analyzer 是「总指挥」,列表里其余几个是它内部调用的组件:它依次用 video_downloader 下视频、transcript_fetcher 拉字幕、scene_detect 切场景、frame_sampler 抽关键帧,自己再补一遍音频能量分析,最后汇总成一份结构化的概要。值得注意的是,这一整套流程不含 AI,全是机械处理:下视频用 yt-dlp,取字幕走 youtube-transcript-api 或 faster-whisper,切场景靠 PySceneDetect / FFmpeg 比较帧间差异找镜头切换,抽关键帧用 FFmpeg 在场景边界和中点导出,产出的都是可量的结构信息。真正「看懂」画面内容的,是 agent 自己的视觉模型。所以除了跑这些工具,CC 还会自己逐张看关键帧、从烧录字幕里读出旁白。

上面那个 analysis_depth 字段控制分析的深浅,由浅到深分三档:transcript_only(只拉字幕)、standard(默认,含分镜、关键帧、节奏分析)、deep(更细,电影感这类 pipeline 才用)。参考分析走的是居中的 standard,最多抽 20 张关键帧。

这份最终汇总出的概要,并不是一堆原始数据:它已经把视频分好了场景、量好了节奏、抽好了关键帧,是整理过的结构信息。

这份概要在源码里对应的工件叫 video_analysis_brief(直译即「视频分析概要」),完整长这样:

{
  "version": "1.0",
  "source": { "duration_seconds": 48.57, "title": "void_ref" },
  "structure_analysis": {
    "total_scenes": 3,
    "scenes": [
      { "scene_index": 0, "start_time": 0.0, "end_time": 27.57, "energy_level": "medium", "motion_type": "unknown" },
      "...另外 2 个场景,motion_type 同样是 unknown..."
    ],
    "pacing_profile": { "cuts_per_minute": 3.71, "pacing_style": "slow_contemplative" }
  },
  "keyframes": [
    { "timestamp": 0.1, "scene_index": 0, "path": ".../keyframes/frame_0000.jpg", "description": "" },
    "...另外 5 张,最后一张在 40.6s,description 字段同样是空的..."
  ],
  "replication_guidance": {
    "suggested_pipeline": "cinematic",
    "suggested_playbook": "flat-motion-graphics",
    "estimated_complexity": "simple",
    "motion_required": false
  }
}

对照上面的 JSON 一个字段一个字段地看:

  • source 记了源视频的时长(48.57 秒)和标题;
  • structure_analysis 是结构主体,total_scenes 说全片切成 3 个场景,scenes 列出每段的起止时间和 energy_level(能量档位,这里都是 medium),每段还挂一个 motion_type,这个字段最为重要,因为它直接决定后面走哪条工具路径。它标的是每个镜头到底是真实运动还是静图,取值为 motion_clip(真实运动镜头)、animated_still(静图加 Ken Burns,即在静止画面上做缓慢推拉摇移)或 static_image(纯静图):判成 motion_clip 就得围绕视频生成工具来规划,判成 animated_still 则生图加 Remotion 合成就够了,如果判错就会用错 pipeline、走错工具路径;
  • pacing_profile 记节奏,cuts_per_minute 是每分钟剪切次数,pacing_style 是归好类的节奏档位,这里的 slow_contemplative 是最慢的节奏,它按「平均一个镜头多少秒」由慢到快分四档:超过 10 秒是 slow_contemplative(最慢,留白多、画面舒缓),5 到 10 秒是 steady_educational(沉稳的讲解节奏),2 到 5 秒是 dynamic_social(社媒短视频那种偏快的节奏),2 秒以内是 rapid_fire(快切轰炸);一个场景都切不出来、时长拿不到时则记为 variable。VOID 全片 48.57 秒只切出 3 个场景,平均一镜约 16 秒,于是落在最慢的 slow_contemplative 节奏;
  • keyframes 是抽出来的 6 张关键帧,每张带时间戳、所属场景和文件路径,外加一个 description,但全是空的,脚本只管把帧抽出来,还不知道画面里是什么;
  • 最后 replication_guidance 是几条复刻建议:推荐的 pipeline、playbook、复杂度,外加一个 motion_required 字段,它表示复刻这条片子需不需要真实运动(即动用视频生成或大量动画),超过三成镜头是 motion_clip 就记 true,否则回退看节奏,快节奏(dynamic_social / rapid_fire)才记 true。VOID 的 motion_type 全是 unknown、无从计数,于是只能看节奏,slow_contemplative 不算快,便记成了 false,意思是复刻它不需要真实运动,静图加 Ken Burns / Remotion 就够。

把这些字段连起来看,这份概要全停在结构层:能数、能量的它都给了,可画面里到底是什么(谁、在干什么、什么风格),它几乎没有,motion_type 留空成 unknown,关键帧的 description 也是空的。这些更细的语义判断,包括每个镜头是真运动还是静图,都得靠 CC 自己逐张看关键帧补上。

其实 OpenMontage 也有一套判断 motion_type 的规则:用 OpenCV 的稠密光流(Farneback 算法)在每个场景取 2~3 对相邻帧,算两个量,一是画面整体动了多少(光流幅度),二是动得均不均匀(幅度方差)。几乎不动判 static_image,动得均匀判 animated_still(整幅画面一起平移缩放,正是 Ken Burns),动得不均匀、各处独立运动判 motion_clip。如果这套光流没能跑起来,比如没装 OpenCV、视频打不开、或某个场景的帧取不出来,它就退回 unknown,把判断交给 agent。我这台机器恰好没装 OpenCV,三段于是全判成了 unknown,最后是 CC 逐张看关键帧补出来的。

正如上文所说,对视频的分析光有结构还不够,要真正看懂这段视频,CC 会在它之上再补一份按五个维度(5-aspect)组织的解读。这套结构来自 CMU 和哈佛的一篇论文 《Building a Precise Video Language with Human–AI Oversight》,是 CVPR 2026 的 Highlight 论文。论文发现:视觉语言模型描述「主体」和「场景」很准,却常在「运动、空间构图、镜头」上出错,所以把这五个维度都强制填满,是提升描述精度最关键的一步。

为此,论文提出了一套叫 CHAI(Critique-based Human-AI Oversight,基于批改的人机协同监督) 的方法:让专业影视创作者去批改、订正模型生成的视频描述,再拿这些高质量标注训练出一个能精确描述视频的模型。

chai.png

在 OpenMontage 里,这套五维就是描述视频的一套通用词汇,读和写两头都用它:读(skills/meta/video-reference-analyst.md),是把一段视频拆成这五维(本节 CC 做的就是这件事);写(skills/creative/video-gen-prompting.md),是给视频生成模型写提示词时也按这五维来组织,保证主体、运动、场景、构图、镜头都交代清楚:

维度看什么
Subject(主体)主体类型、数量、属性,以及跨镜头的出现/消失/切换
Subject Motion(主体运动)按时间顺序的动作、交互,是位移还是手势还是表情
Scene(场景)叠加层(文字/字幕条/水印单独列)、视角、环境、时间、动态
Spatial Framing(空间构图)景别、主体位置、景深、机位高低及其变化
Camera(镜头)播放速度、镜头畸变、机位高度、角度、对焦、稳定度、运动方式

CC 就是按这五个维度,把参考视频总结成一份「解读报告」。这份报告不只是给你看,更是一份交接件:后面的提案、脚本、分镜阶段会直接按这五个维度去设计新视频,而不用再从一段散文里重新理解。这也是 skill 为什么强制要按五维来写、不许退回成一段散文:散文每个阶段都得重新解析一遍、容易走样,结构化字段才能精确一致地往下传。

回到 VOID 这个视频,CC 的判断是:它根本不是 AI 视频生成,而是 4 张 AI 静图加 Remotion 数据可视化场景、再配逐词字幕拼出来的,镜头的 motion_type 基本都是 animated_still / static_image。这意味着仿它不需要视频生成工具,省掉了最贵的一块,这也正是原片只要 0.69 美元的原因。

第二步:盘点能力

看懂参考视频之后,CC 跑了一遍启动前的能力自检(又被称为 preflight),把 VOID 的配方和我机器上的工具一一对照:

preflight.png

上图里,原片需要的 AI 静图(gpt-image-1)、单人旁白、Remotion 数据可视化场景,我这边都齐了:图片生成有 4 个 provider 可用、TTS 有 3 个(含本地的 Piper)、Remotion 也装好了;唯独免版税背景音乐是缺的,音乐生成一个 provider 都没配、本地也没有曲库,它如实标出了个缺口。

这一步的关键是不糊弄。如果参考视频需要的是生成的科幻镜头,而你一个视频生成的 key 都没配,它会直接说这条路卡住了,并给你两个选项(配一个 provider key,或者退用 stock 素材加 Remotion 动画,质感不同但能跑),而不会假装能做到、最后给你货不对板的东西。

盘出缺口之后,CC 没有自己拍板。它说在正式构思概念方案之前,有三个决定会影响后面的一切,于是回过头一条一条问我。参考视频能告诉它「原片长什么样」,但这几件事它读不出来,只能问我:

  1. 片子做成哪种形式? 题材已经定了是量子计算,这里问的是用哪种形式去表现它。它没有默认照搬原片,而是给了三个方向:虚构的量子产品广告(主角是「QUBIT ONE — 量子核心」)、量子知识讲解(keynote 风格,打「一万年 → 200 秒」这种对比)、或者纯炒作的预告剪辑(落在「Quantum, for everyone. 2027.」)。我选了第一个,虚构量子产品广告,最贴近 VOID 原片。
  2. 多长、怎么配音? 三个选项:约 45 秒、单人旁白(最忠实原片),约 30 秒、单人旁白,或者纯画面加音乐、不要旁白。我选了约 45 秒、单人旁白。skill 在这里特别强调,旁白这套「音频架构」必须在出方案之前就定死,不能拖到写脚本或合成阶段,因为它直接决定脚本怎么写、要几路配音、花多少钱。
  3. 音乐这个缺口怎么办? 这是唯一的能力缺口,它没含糊带过,而是摆出了三条路:往 music_library/ 里丢一首本地曲子、配一个音乐生成的 API key,或者先不要背景音乐、之后再补。我选了最后一个,先放一边,等成片出来再说。

三条答完,方向就定死了:一个虚构的量子产品广告、约 45 秒、单人旁白、暂不配乐。

第三步:调研,给出方案

关键决定敲定后,CC 还是没急着动手,而是又做了两件事,才把方案定下来。

先做一轮强制的联网调研。 这一步在 skill 里写明是必做的,哪怕参考视频和需求都很清楚,也不许跳过、不许只凭参考分析加自己的知识就开干。范围限定在 2~3 分钟的轻量搜索:看几条同类视频找差异化角度、查制作技法,主题有事实内容的话再搜几个具体数据点把内容做扎实。CC 这次搜的是量子计算的真材料:Google Willow 的基准成绩(同一道计算,Willow 量子芯片 5 分钟就跑完,换成经典超级计算机却要算 10²⁵ 年)、超导量子比特约 15 毫开尔文的工作温度、99.9% 的门保真度。有了这些真实数据,虚构产品的参数才显得可信,而不是瞎编。

再给 2~3 个差异化方案。 skill 在这里还有条硬规矩:绝不能给原片的复刻,参考只是灵感不是模板,每个方案都得有明确的创意差异。每个方案还必须带齐:保留什么、改什么、视觉与音频计划、时长,以及一张按 provider 分项列出的成本表(图片、视频、TTS、音乐各花多少、用哪家),并诚实说明这笔预算买得到什么、买不到什么。最后还得推荐其中一个,别让用户在几个等价选项里犯选择困难。CC 给我的三个概念是:QUBIT ONE(桌面量子核,最贴参考)、ABSOLUTE ZERO(量子即服务,偏 B 端)、SUPERPOSITION(氛围向,重情绪轻参数),整套成本估在 0.5~0.7 美元,推荐 QUBIT ONE。我选了它。

这里的 QUBIT ONE 并不是真实存在的产品,而是 CC 为这支视频现编的一个虚构概念,就像广告里那种「概念机」:一台能摆上桌的个人量子计算机,把一整个数据中心缩到桌面,主打「让量子计算走进每个人」。它的卖点也照着 VOID 的「参数轰炸」来铺。要紧的是,产品是假的,参数背后的物理却是真的:上一步搜来的那些真实数据(Google Willow 的基准、超导量子比特的工作温度、99.9% 这个关键阈值)正垫在这些卖点底下,让一个虚构产品听起来也跟真的一样。

第四步:先出样片,再渲全片

方案敲定后,CC 没有一上来就渲整片,而是先做了一段约 12 秒的样片(主角镜头加一个参数场景)让我确认风格和声音,这一步只花了约 0.17 美元。确认没问题,它才把整套分析成果当作输入,转入正常的制作流程,把完整的片子渲出来。

最后产出一条 42 秒、1920×1080 的成片,6 个场景:主角镜头、1024 量子比特 @ −273°C、99.9% 保真度、一万年 vs 200 秒、收束语、「Quantum, for everyone. 2027.」。3 张 gpt-image-1 静图加 OpenAI Onyx 旁白、Remotion 合成,全程本地渲染,总成本约 0.6~0.7 美元,和原版 VOID 一个量级。

qubit-one.png

从一句话到一条成片,CC 全程自己走完上面这套流程,只在几个创作决策点停下来等我拍板。另外值得一提的是,参考视频玩法并不是一条专门为它新建的流水线,它走的还是平时那条制作流程(研究、脚本、分镜、合成),和上一篇用到的流程没有区别。只是这些流程本就留了一个可选的「参考输入」插槽,也就是第一步那个 reference_input 块:你给了参考视频,分析结果就从这里接进去,给后面的研究、脚本、分镜当一份有依据的起点;你不给,同一条流程照样跑,只是没有这份参考垫底。

小结

今天我们学习了 OpenMontage 一个很实用的技巧:从参考视频出发生成你想要的视频。你只要丢一段喜欢的 YouTube / Short / Reel / TikTok 或本地视频,再加一句想要什么,这比从一个空白提示词把需求描述清楚更省力。收到参考后,CC 在 video-reference-analyst 这个 meta skill 的驱动下自己走完四步,只在几个创作决策点停下来等你拍板:

  1. 拆解参考视频video_analyzer 工具先机械地抽出场景、节奏、关键帧这些结构信息;至于每个镜头是真运动还是静图,画面里到底是什么,还得靠 CC 自己看关键帧补上;
  2. 盘点能力:跑一遍启动前的能力自检,把参考视频的配方和你机器上的工具一一对照,如实标出缺口,再把关键决定(做成什么形式、多长、怎么配音、缺口怎么处理)回过头问你,而不是自己拍板;
  3. 调研并给出方案:先做一轮强制的联网调研把内容做扎实,再给 2~3 个有创意差异的方案(绝不照搬原片),每个都带一张按 provider 分项的成本表,并推荐其中一个;
  4. 先出样片,再渲全片:先花几毛钱出一段样片让你确认风格和声音,确认后才开始完整的制作流程渲出全片。

通过这四步,我们将官方的 VOID 视频仿成了一个名为「QUBIT ONE」的量子产品的宣传片,这个产品是虚构的,但是物理参数却是真实的,因此看上去有模有样,整体约 0.7 美元,和原片一个量级。

到这里,我们对 OpenMontage 怎么生成视频已经有了一定的认识:从第一篇的官方 demo 视频,到第二篇的图片视频和真实素材两条零成本路线,再到今天这一篇从参考视频生成视频。但不管哪种玩法,背后真正干活的都是一个个 provider:生成图片的、配旁白的、出音乐的。你能做出什么样的视频、做到多好,恰恰由这层 provider 决定,手里的 key 越多,能用的工具越多,能挑的 provider 也越多。明天我们就来看怎么接入 provider,以及 OpenMontage 是怎么在一堆 provider 里挑出最合适那个的。

参考


学习 OpenMontage 的零成本视频制作

在上一篇的最后,我们在 AI 编程助手里各试了一句提示词:一句做「天空为什么是蓝色」的动画解说,一句做「凌晨四点的」的真实素材纪录片。当时只是让它们跑了起来,没展开讲背后发生了什么。这一篇我们就把这两个例子摊开,看看不花一分钱、不配任何付费 API key,OpenMontage 到底是怎么做出这两类视频的。

零 key 这件事值得单独拿出来讲,是因为市面上很多打着免费旗号的 AI 视频工具,本质上都是把几张静态图做成动画,也就是所谓的 animate still images。OpenMontage 的零 key 路径不止于此,既能用 Piper 配音加图片做出动起来的成片,也能从开放素材库里检索真实运动镜头,剪成一支纪录片式的片子。下面我们就来实战这两条路径。

零 key 的两条路径

上一篇里我们已经把零 key 的免费工具链盘过一遍:旁白有 Piper,素材有 Archive.org / NASA / Wikimedia 加免费图库,合成有 Remotion 和 HyperFrames,后期有 FFmpeg,字幕内置,一条完整的视频生产链路每个环节都有免费工具兜底。OpenMontage 把这些能力归纳成两条可以直接上手的路径:一条是图片视频路径,一条是真实素材纪录片路径。

two-path.jpg

两条路径的取舍,可以用下面这张表对比:

维度图片视频路径真实素材纪录片路径
视觉来源静态图片真实运动镜头
运动来源Remotion 弹簧动画、镜头运动素材本身的真实运动
典型成片解说类、数据驱动的科普视频纪录片蒙太奇、情绪短片
对应 pipelineanimated-explainer 等documentary-montage
旁白Piper 配音常用可有可无,常用纯音乐

图片视频路径

第一条路径最接近大家印象里的免费 AI 视频,但 OpenMontage 把它做得更完整:Piper 给脚本配音,Remotion 把画面做成有弹簧动画、镜头运动、字幕的成片。这里的画面既可以是生成或检索来的图片,也可以是 Remotion 纯合成的矢量动画,下面的实测里它干脆一张图都没用。

直接复制下面这句提示词到你的 AI 编程助手里:

Make a 45-second animated explainer about why the sky is blue
# 做一个 45 秒的动画解说视频,讲讲天空为什么是蓝色

这句提示词不带任何素材生成的诉求,agent 会自己走完调研、写脚本、配音、做画面、渲染这条链路,每个创作节点都会停下来等你确认。整条链路不需要付费视频生成模型。

这里的关键是 Remotion 的合成能力。它不是简单地把图片轮播,而是提供了一整套 React 场景组件:弹簧动画的图片场景、文字卡(text_card)、数据卡(stat_card)、各类图表、分节标题、大标题卡,以及抖音式的逐词字幕和场景转场。所以这条路径特别适合数据驱动的科普视频,讲一个知识点、配几张图、再用图表把数字立起来。

我用 Claude Code 把上面这句提示词实测跑了一遍。agent 先选定 animated-explainer 流水线,做了一轮联网调研,给出四个创意方向供选择:

  • 一条规律,两种天空(叙事向,agent 推荐):用同一个机制串起正午的蓝天和黄昏的红日,画面从白昼自然过渡到日落,45 秒里有个收得住的结尾
  • 天空本该是紫色(破除迷思向):用「按物理推算天空该是紫色」这个反直觉的钩子开场,再揭开它实际是蓝色的原因
  • 5.5 倍的竞赛(数据驱动向):围绕波长展开,短蓝波被空气分子弹开的概率约是红波的 5.5 倍,以数据卡为主
  • 光的障碍赛(类比向):把阳光比作穿过分子场的赛跑者,小个子的蓝波被撞得四处偏折,大块头的红波径直穿过

我选了「一条规律,两种天空」,它再据此写出一份 45 秒、115 词的脚本并通过 schema 校验。下面是这份脚本的主体(为方便阅读,略去了每段的配音指导、分镜提示等字段,只保留旁白文本和时间轴):

{
  "version": "1.0",
  "title": "Why Is the Sky Blue?",
  "total_duration_seconds": 45,
  "sections": [
    {
      "id": "s1", "label": "Hook",
      "text": "Sunlight looks white. So why is the sky above you blue, and not green, or pink?",
      "start_seconds": 0, "end_seconds": 6
    },
    {
      "id": "s2", "label": "Setup",
      "text": "That white light is really every color mixed together. As it pours into our air, it strikes countless tiny molecules of gas.",
      "start_seconds": 6, "end_seconds": 14.5
    },
    {
      "id": "s3", "label": "The Rule",
      "text": "Here's the one rule behind it all: the shorter the wave, the more it scatters. Blue scatters about five times more than red, so it ricochets across the whole sky and into your eyes.",
      "start_seconds": 14.5, "end_seconds": 27.5,
      "source_ref": "Rayleigh scattering intensity scales as 1/lambda^4; blue ~450nm scatters ~5.5x more than red ~700nm"
    },
    {
      "id": "s4", "label": "Why Not Violet",
      "text": "Violet scatters even more. But the sun sends less of it, and your eyes simply prefer blue.",
      "start_seconds": 27.5, "end_seconds": 34.5
    },
    {
      "id": "s5", "label": "The Sunset Payoff",
      "text": "Now drop the sun to the horizon. Its light cuts through far more air, the blue scatters away, and only red survives.",
      "start_seconds": 34.5, "end_seconds": 43
    },
    {
      "id": "s6", "label": "Landing",
      "text": "One rule. Two skies.",
      "start_seconds": 43, "end_seconds": 45
    }
  ],
  "metadata": {
    "concept": "One Rule, Two Skies",
    "playbook": "flat-motion-graphics",
    "word_count": 115,
    "pace_wpm_target": 153,
    "render_runtime": "remotion",
    "music": "none"
  }
}

到画面环节,它没有去生成或检索图片,而是现写了一个自定义的 Remotion 组件,用纯 SVG 动画演示瑞利散射,再配上数据卡把「蓝光散射强度约为红光的 5.5 倍」这个数字立起来。配音环节出了点岔子:agent 以为机器上配好了 ElevenLabs、OpenAI、Google、豆包几家云端 TTS,挨个尝试却全部失败(ElevenLabs 直接返回 401),于是自动回退到本地的 Piper 完成旁白。最后本地渲染出 1920×1080 的成片,并自动抽帧逐场质检、用 ffprobe 核对音画。整条链路真实花费 0.00 美元。

ffprobe 是 FFmpeg 自带的一个命令行工具,专门用来探测媒体文件的内部信息:时长、分辨率、帧率、编码格式、有没有音轨、码率多少等等,只读不改、也不重新编码。OpenMontage 在渲染后的自检里就用它来核对成片是否符合预期,比如时长对不对、音轨在不在。

这里其实藏着一个坑。我根本没配过任何付费 key,只是把 .env.example 原样拷成了 .env,可问题就出在这里。这个 .env 文件里 ELEVENLABS_API_KEY= 这些配置的等号后面虽然是空值,但是却跟着一句行内注释:

# --- Voice ---
ELEVENLABS_API_KEY=          # TTS narration, music generation, sound effects
OPENAI_API_KEY=              # OpenAI TTS fallback and DALL-E image generation
DOUBAO_SPEECH_API_KEY=       # Volcengine Doubao Speech TTS (new console API Key)
# Piper local voices do not require env vars; install `piper-tts` via pip

解析器会把这句注释错当成 key 的值读进去,OpenMontage 以为 key 配好了,于是挨个去试这些 provider,自然就 401 了。所以拷贝 .env 时,记得把每行后面的注释删掉(或者填上真实 key),否则就会像我这样平白触发一堆失败的云端调用。

抛开这个坑不谈,这次实测也说明了零 key 兜底的价值:云端 TTS 一个都用不上时,本地的 Piper 成了唯一跑得通的选择。所以哪怕你打算用付费模型,也值得先把零 key 的兜底链路配好。

成片效果如下:

sky-explainer-render.png

这条片子的画面是纯手写的 SVG 动画,说实话谈不上精致,单看有点简陋。但配上旁白和逐词字幕一路讲下来,整体看着也有模有样,拿来做个知识点的科普短片完全够用。

如果想让画面更精致一点,就该让生成模型上场了。上一篇提到的那几支只花 0.15 美元的吉卜力风动画,本质上走的就是这条路径的升级版:把免费图片换成 FLUX 生成的图,再让 Remotion 加上多图交叉淡入、镜头推拉、粒子叠加。零 key 时把图换成免费图库或开放素材即可。

真实素材纪录片路径

第二条路径才是 OpenMontage 区别于普通免费工具的地方。它对应的是 documentary-montage 这条 pipeline,做的事情是:从 Archive.org、NASA、Wikimedia Commons,以及 Pexels、Unsplash 这些免费来源,建一个 CLIP 可检索的语料库,再按语义把真实运动镜头检索出来,按叙事节拍剪成成片。

CLIP 是 OpenAI 在 2021 年开源的图文模型,它的本事是把图片和文字映射到同一个向量空间,于是一帧海浪起伏的画面,和「ocean waves at dusk」这句文字描述,会落在相近的位置。普通的文本 embedding 只能算文字和文字有多像,而 CLIP 能直接算「文字和画面」有多匹配。有了它,就能用一句话去一堆素材里检索出语义最接近的画面,这正是这条路径「按语义检索真实镜头」背后的技术。

要走这条路径,提示词里必须明确写上 use real footage only,告诉 agent 不要去生成画面,而是检索真实素材。比如:

Make a 90-second documentary montage about what a city feels like at 4am. Use real footage only, no narration, elegiac tone.
# 做一个 90 秒的纪录片式蒙太奇,表现凌晨四点城市的感觉。只用真实素材,不要旁白,挽歌般的基调。

这句提示词里有三个关键信号:documentary montage 指定了 pipeline,use real footage only 锁定真实素材,no narration, elegiac tone 定下了情绪基调。官方的提示词画廊里还给了另外几个变体,比如 Adam Curtis 风格的档案拼贴、雨中归家的梦境蒙太奇,套路都一样。

这条路径的素材全部来自开放素材库,而这些素材库分两种类型:

  • 真正零 key、连注册都不用:Archive.org、NASA、Wikimedia Commons、美国国家档案馆(NARA)、国会图书馆(LoC),直接调 API 就能搜;
  • 免费、但需要注册一个 key:Pexels、Unsplash、Pixabay,key 不要钱,但得去官网申请。

以 Pexels 为例,它是这条路径里现代实拍的主力来源:登录 pexels.com/api 点一下就能拿到免费 key,额度也宽松(每月两万次)。

pexels.jpg

这两类素材库的差别,在我实测「凌晨四点的城市」这个现代题材时体现得很明显:真正零 key 的那几个源其实相当吃力,Archive.org 偏老胶片,Wikimedia 是按松散标签匹配、返回的画面经常跑题(我搜到过苏格兰民谣乐队、算盘特写这种完全不相干的镜头)。这些源更适合做档案、复古风的纪录片;如果你要做的是现代题材,建议顺手去 Pexels 注册一个账号、申请一个免费 key,它在当代实拍上的素材量和质感都更靠谱。

和别的 pipeline 一样,documentary-montage 也是分几个阶段一路跑下来的:idea(定方向)→ scene_plan(拆成一个个镜位)→ assets(给每个镜位备素材)→ edit(排成时间线)→ compose(渲染成片)。流水线的机制我们后面会单开一篇细讲,这里只看它最有特点的素材(assets)阶段。pipeline_defs/documentary-montage.yaml 里为这一阶段提供了 direct_clip_searchcorpus_builderclip_search 三个工具,对应两条选片逻辑截然不同的子路径:

  • 标准路径:先用 corpus_builder 把候选下载下来、算好 CLIP 向量建成语料库,再用 clip_search 对每个镜位的描述算相似度、由机器打分选片。适合 50+ 镜位的大批量、无人值守;代价是 corpus_builder 依赖 torch、transformers 这些机器学习库。
  • 快捷路径:用 direct_clip_search 直接搜片下载,不算 CLIP 向量,再把每个候选抽成缩略图,让 agent(或并行的子 agent)逐张「看图」挑最贴的那个。依赖最轻,适合分幕产片、人工逐幕过审。

我这台机器没装 torch、transformers 这些库,corpus_builder 跑不起来,标准路径走不通,所以我实际走的是快捷路径:给 18 个镜位各下 6 个候选,再开 3 个并行子 agent 分头看缩略图,对照分镜描述和「凌晨 / 空旷 / 挽歌」的基调选片,还顺手标出了哪些候选不太贴(比如有个鸽子镜头偏白天、有个便利店镜头里有顾客)。快捷路径其实完全没用到 CLIP 模型,选片靠的是 agent 直接看缩略图。所以在没装 torch、transformers 的机器上,反而是这条不依赖 CLIP 的快捷路径更实用。

那么被检索、被选片的「镜位」到底长什么样?它就是 scene_plan 阶段产出的一个 slot:

{
  "id": "slot_09",
  "description": "interior of a night bus, a single passenger by the window, city lights smeared in the glass",
  "hero": true,
  "queries": ["night bus passenger window", "lone commuter bus night"],
  "preferred_sources": ["pexels", "archive_org"],
  "target_hold_seconds": 5.0
}

一个 slot,就是一句给检索用的画面描述 + 2-3 个搜索词 + 来源偏好 + 期望时长 + 是否 hero(关键镜头)。agent 拿着 description 去打分或检索,拿着 queries 去各个站点搜片。检索完,manifest 里对选片的要求写得很明确(以标准路径为例):

review_focus:
  - Every slot has exactly one picked clip       # 每个镜位恰好选一个片段
  - No clip_id is picked for two slots           # 同一片段不能用在两个镜位
  - Provenance (provider, original_url, license) present on every asset  # 每个素材都要有出处和授权
  - "Standard path: corpus size >= 8x slot count, scores >= 0.22"       # 标准路径语料库要够大、相似度达标

可以看到,它对每个镜位只选一个片段、不重复用片、每个素材都要登记来源和授权,要求得相当细。这也是它能剪出像样纪录片、而不是素材大杂烩的原因。

这条 pipeline 还有一个很有辨识度的签名动作:片尾强制以一句哲思短句收尾,官方管它叫 end-tag。它是 pipeline 的硬性要求:默认必须有,不想要的话得在配置里显式声明放弃。渲染上默认走 overlay 模式,这句话叠在最后的实拍画面上缓缓淡入。我这条「凌晨四点的城市」就收在 SOMEONE IS ALWAYS AWAKE.(总有人醒着)这句上,暖象牙白配一条动画下划线,浮现在破晓的空街上:

city-at-4am.jpg

Remotion 还是 HyperFrames

还记得前面那份脚本 metadata 里的 render_runtime: remotion 吗?这个字段指定了一支视频最终交给哪个引擎来渲染。在动画解说那条里,它是 agent 自己定的;而到了纪录片这条 pipeline,它在 documentary-montage.yaml 的 compose 阶段被直接锁定为 remotion、不让 agent 改,原因是片尾 end-tag「叠在实拍上淡入」的渲染依赖 Remotion 的 CinematicRenderer 组件。这就引出一个问题:OpenMontage 的合成引擎该怎么选?

OpenMontage 的合成引擎有两个:Remotion 和 HyperFrames。前者基于 React,后者基于 HTML/CSS/GSAP。skills/core/hyperframes.md 给了一张很清楚的决策表,我们挑几条关键的:

场景选谁原因
已有 React 场景组件栈、数据驱动的科普视频Remotion这些组件已经在 remotion-composer/ 里,复用是免费的
逐词字幕烧录、卡拉 OK 字幕Remotionremotion_caption_burn 是 Remotion 专属,HyperFrames 暂未对齐
数字人、对口型RemotionTalkingHead 合成只在 Remotion 里
动感排版、重文字动效、GSAP 原生动画HyperFramesHTML/GSAP 是天然介质,用 Remotion 的 interpolate() 表达又慢又脆
产品宣传、发布预告、营销标题卡HyperFramesCSS/GSAP 的合成语法贴合设计师思路
网页转视频HyperFrames有专门的 website-to-hyperframes 工作流

「字幕烧录」(burn-in)是把字幕直接渲染进视频的每一帧画面里、成为像素的一部分,之后既关不掉也改不了,所以也叫硬字幕;与之相对的软字幕是单独一条轨道附在视频旁边,播放器可以随时开关。这个叫法源自早年影视制作,字幕像被「烧」进画面一样。OpenMontage 走的是烧录,逐词高亮、卡拉 OK 这些字幕花样才能完全由 Remotion 控制。

简单来说,数据驱动的科普视频、需要复用已有 React 场景、要烧逐词字幕的,选 Remotion;动效密集的动态图形、动感排版、网页转视频,选 HyperFrames。

小结

今天我们把 OpenMontage 的零 key 视频制作走了一遍,要点如下:

  1. 零 key 也能做出真视频make setup 之后,旁白有 Piper,素材有 Archive.org / NASA / Wikimedia 加免费图库,合成有 Remotion 和 HyperFrames,后期有 FFmpeg,字幕内置,形成了一条完整的视频制作工具链
  2. 两条免费路径:图片视频路径用 Piper 配音加图片加 Remotion 动画,适合数据驱动的科普视频;真实素材纪录片路径走 documentary-montage,从开放素材建 CLIP 语料库检索真实运动镜头,提示词记得加 use real footage only 这句话
  3. 两个合成引擎:Remotion(基于 React)适合数据驱动的科普视频、复用已有 React 场景、烧逐词字幕;HyperFrames(基于 HTML/CSS/GSAP)适合动效密集的动态图形、动感排版、网页转视频

本篇用的都是免费素材和现成的合成组件。在这之外,如果你的机器有 GPU,还能更进一步,本地免费跑 wan2.1 这类视频生成模型、自己生成真正的视频片段。在下一篇里,我们换一种玩法:很多时候从一段你喜欢的参考视频出发,比从一句空白提示词起步要快得多,我们就来看看 OpenMontage 是怎么从一段 YouTube、Reel 或 TikTok 出发,反推出一份可落地的制作方案的。

参考


OpenMontage 快速入门

最近在 GitHub 上看到一个挺有意思的开源项目 OpenMontage。它的自我介绍很有野心:世界上第一个开源的、agentic 的视频制作系统(the first open-source, agentic video production system)。这个项目低调发育了一阵,最近一举冲上了 GitHub Trending 日榜第一,仓库首页特意挂上了一枚「#1 on GitHub Trending」的徽章,海外的 AI 媒体也跟着报道了一波,目前 star 数已经超过 1.4 万。

openmontage-github-home.png

它的定位不是又一个「输入提示词、吐出一段 4 秒小视频」的生成模型,而是把你手里的 AI 编程助手(Claude Code、Cursor、Copilot、Windsurf、Codex 这些)直接变成一间视频制作工作室。你用大白话描述想要什么,Agent 会把它拆成一条完整的生产流水线,自动完成调研、写脚本、生成素材、剪辑和合成。

Montage(蒙太奇)是个法语词,词根 monter 意为「组装、拼接」,在电影里指把一组分散的镜头按顺序剪辑、拼接成一个连贯整体的手法,这套理论由爱森斯坦等苏联电影人在 1920 年代系统化。OpenMontage 的名字就是 Open(开源)加 Montage(剪辑组接):它干的核心不是文生图、文生视频那种单点生成,而是把素材剪辑、组接成成片,项目里甚至有一条流水线就叫 Documentary Montage。

它最让我觉得有意思的一句话是这样的:

OpenMontage can make image-based videos, but it can also make a real video video for free/open-source workflows.

意思是说,市面上大多数号称「免费 AI 视频」的方案,本质上都是把几张静态图片做点 Ken Burns 推拉摇移,再配个旁白凑成视频。OpenMontage 也能做这种,但它还支持一种更实在的做法:Agent 从 Archive.org、NASA、Wikimedia Commons 这些免费开放档案里检索真实的动态素材,按语义排序后剪进时间轴,渲染成一条真正的成片。而且全程一分钱 API 费用都不用花。

Ken Burns 是一位美国纪录片导演,代表作有《内战》《国家公园》等。他特别擅长用一种手法让静态的老照片动起来:镜头在一张照片上缓慢地推近、拉远或平移,配合旁白引导观众的视线。这种「在静止画面上做缓慢推拉摇移」的效果后来就被叫做 Ken Burns 效果(Ken Burns effect),几乎成了图片转视频的标配,很多视频软件里都内置了同名的一键功能。

免费就能剪出一条真实素材的成片,这话光看项目介绍还不太敢信,得自己上手跑一遍才知道靠不靠谱。这个系列就从这里开始。

OpenMontage 是什么

先看几个数字,官方给出的规模是 12 条生产流水线(pipeline)、52 个工具(tool)、500+ 个 Agent 技能(skill)。这三个数字分别对应它的三个层次,后面讲架构时会展开。

它支持的视频类型相当全,每一条流水线就是一种完整的制作工作流:

  • Animated Explainer:AI 生成的科普解说视频,自带调研、旁白、配图、配乐
  • Documentary Montage:从免费素材库和开放档案里检索真实镜头,剪成纪录片式蒙太奇
  • Cinematic:电影感的预告片、teaser
  • Clip Factory:把一条长视频批量切成多个排好序的短视频
  • Talking Head / Avatar Spokesperson:真人或数字人出镜的讲述类视频
  • Podcast Repurpose:把播客转成视频
  • Localization & Dub:给已有视频做字幕、翻译和配音
  • Screen DemoAnimationHybridCharacter Animation

前面说的零 key 路线是完全免费的。如果你愿意接上付费模型(比如 Kling、OpenAI、FLUX),效果更好,花的钱也不多。官方仓库首页放了好几条用 OpenMontage 完整制作出来的样片,每条都标了成本:一条 60 秒的皮克斯风格动画短片《THE LAST BANANA》,用了 6 段 Kling v3 生成的动态镜头、Google Chirp3-HD 旁白、免版税钢琴曲和 TikTok 式逐词字幕,总成本 1.33 美元;一条只用了一个 OpenAI key 的产品广告《VOID》,4 张 gpt-image-1 图片加 TTS 旁白,总成本 0.69 美元;几条吉卜力风格的动画,纯用 FLUX 生成的图片加 Remotion 动画引擎,没用任何视频生成 API,单条成本只要 0.15 美元

openmontage-concept.jpg

它的几个核心特性是:

  • Agent 优先(agent-first):没有 Python 写的编排器,你的 AI 编程助手本身就是编排器,所有创作决策、流程流转、质量审查都写在指令文件里
  • 参考视频驱动:可以直接丢一个 YouTube、Short、Reel、TikTok 或本地视频给它,Agent 分析转录文本、节奏、分镜、关键帧和风格,再给你 2~3 个差异化的方案
  • 联网调研是一等公民:写脚本之前,Agent 会先跑 15~25 次以上的网络搜索,覆盖 YouTube、Reddit、新闻和学术来源,把视频建立在真实、当下的信息上,而不是凭空捏造
  • 本地与云端并存:每一种能力都同时支持开源本地方案和付费 API,有什么用什么,零 key 也能出片
  • 质量门禁与预算治理:渲染前估算成本、设花费上限,渲染后强制自检(ffprobe 校验、抽帧、音频电平分析),不合格不交付

它用的开源协议是 AGPLv3

对比其他 AI 视频工具

大多数 AI 视频工具是「一个提示词换一个片段」,OpenMontage 给你的是一条端到端的生产流水线,和真实制作团队走的流程是一样的,只不过执行者换成了你的 AI 编程助手。

理解 OpenMontage 的关键,是它的 agent-first 架构。官方文档 PROJECT_CONTEXT.md 里是这样描述它的设计理念的:

The AI agent IS the intelligence. Python exists only for tools and persistence.

也就是说,Python 在这里只负责两件事:提供工具、保存状态。真正的智能在 Agent 那里。整个流程没有 Python 编排器,没有 Python 审查器,没有 Python 流转逻辑,全部由 Agent 读取指令文件来驱动。它的运行流程大致如下:

你用大白话描述需求
  ↓
Agent 读取流水线清单(YAML,含阶段、工具、审查标准、成功门禁)
  ↓
Agent 读取阶段导演技能(Markdown,教它每个阶段怎么做)
  ↓
Agent 调用 Python 工具,按 7 个维度打分选择最优供应商
  ↓
Agent 用审查技能自检(Schema 校验、质量检查)
  ↓
Agent 保存检查点(JSON,可恢复,带决策日志和成本快照)
  ↓
呈现给你审批(每个创作决策点你都掌控)
  ↓
渲染前校验门禁(交付承诺、幻灯片风险、渲染器治理)
  ↓
渲染(Remotion 或 FFmpeg)
  ↓
渲染后自检(ffprobe、抽帧、音频分析、承诺核对)
  ↓
输出最终视频(仅当自检通过)

这套机制带来一个直接的好处:所有的编排逻辑、审查标准、质量红线都写在可读的指令文件里(YAML 清单加 Markdown 技能),你可以直接打开看、随手改。每个决策还会记录下它考虑过哪些备选项、置信度多少、为什么这么选,全程留痕。

安装与初体验

说了这么多,不如直接跑一遍。OpenMontage 的安装很轻量,核心依赖只有 pyyamlpydanticPillowrequests 这几个 Python 包。

环境准备

动手之前,先确认本机具备以下环境:

  • Python 3.10+
  • FFmpegbrew install ffmpeg(macOS)或 sudo apt install ffmpeg(Linux)
  • Node.js 18+:渲染引擎 Remotion 是基于 React 的,需要 Node 环境
  • 一个 AI 编程助手:Claude Code、Cursor、Copilot、Windsurf 或 Codex 都行

可以先验证一下:

$ python --version
Python 3.11.15

$ ffmpeg -version
ffmpeg version 8.1.1 Copyright (c) 2000-2026 the FFmpeg developers
built with Apple clang version 17.0.0 (clang-1700.6.4.2)

$ node --version
v24.12.0

克隆与安装

把仓库克隆下来,然后一条 make setup 搞定安装:

$ git clone https://github.com/calesthio/OpenMontage.git
$ cd OpenMontage
$ make setup

该命令的运行结果如下:

==> Installing Python dependencies...
pip install -r requirements.txt
...

==> Installing Remotion composer...
cd remotion-composer && npm install
...

==> Installing free offline TTS (Piper)...
pip install piper-tts || echo "  [skip] piper-tts install failed — TTS will use cloud providers instead"
...

==> Installing HyperFrames runtime (cache-warm via npx)...
    Pulls the 'hyperframes' npm package into the local npx cache so the
    first render doesn't pay a 30-60s cold-fetch penalty. ~20MB of disk.
    HyperFrames CLI cached (npx)
    HyperFrames runtime_available=True, npm=0.7.4

==> Created .env from .env.example — add your API keys there.

Done! Open this project in your AI coding assistant and start creating.
  Optional: add API keys to .env to unlock cloud providers.
  Optional: run 'make install-gpu' if you have an NVIDIA GPU.
  Optional: run 'make hyperframes-doctor' to fully validate the HyperFrames runtime.
  Optional: run 'make hyperframes-warm' anytime to refresh the npx cache to the latest hyperframes version.

可以看到,make setup 一条命令就把整套运行环境依次准备好了,每个 ==> 对应一步:

  1. 安装 Python 依赖pip install -r requirements.txt,装上 pyyaml、pydantic、Pillow 等核心库,这是工具层运行的基础
  2. 安装 Remotion 合成器:进到 remotion-composer 目录跑 npm install,Remotion 是默认的 React 渲染引擎,靠它把分镜合成最终视频
  3. 装免费离线 TTS(Piper):这一步是零 key 也能出片的关键,旁白合成不依赖云端;这里用了 || echo,意味着即便装失败也不会中断,后面会自动改用云端 TTS
  4. 预热 HyperFrames 运行时:通过 npxhyperframes 包提前拉进本地缓存,省掉首次渲染时 30~60 秒的冷启动等待;输出里的 runtime_available=True, npm=0.7.4 说明 HyperFrames 这条渲染线路也已就绪
  5. 生成 .env 配置文件:从 .env.example 拷一份 .env,以后要接付费供应商就往这里填 key

最后那几行 Optional 是可选动作:有 NVIDIA GPU 的话可以跑 make install-gpu 解锁本地视频生成,make hyperframes-doctor 能完整体检 HyperFrames 运行时。看到 Done! 这一行,就说明零 key 的免费工具链已经齐活,可以开始做视频了。

Remotion 是一个用 React 写视频的开源框架,把 React 组件和动画渲染成一帧帧画面,再用 FFmpeg 编码成视频;同一套组件传入不同的参数就能生成不同内容,OpenMontage 默认用它合成文字卡片、数据图表这类程序化画面。

HyperFrames 是另一条渲染线路,由 HeyGen 开源,思路和 Remotion 类似(底层都用无头 Chrome 加 FFmpeg 渲染),区别在于它不依赖 React,直接用 HTML / CSS / GSAP(一个主流的 JavaScript 动画库)来做动态排版和动效,更适合 motion graphics 风格、产品宣传片那类画面。

Piper 是一个完全离线的开源 TTS(文本转语音)引擎,由 Rhasspy 项目维护,发音自然、不联网也不花钱,正是零 key 出片时的默认旁白来源。

零 key 也能出片

OpenMontage 不配任何付费 API key,开箱即用就能做出真视频make setup 之后,你已经拥有这样一套免费工具链:

能力免费工具做什么
旁白Piper TTS离线免费的文本转语音,发音接近真人
开放素材Archive.org + NASA + Wikimedia Commons免费开放的档案影像、教育媒体、纪录片素材
额外图库Pexels + Unsplash + Pixabay免费图库视频和图片,开发者 key 免费申请
合成(React)Remotion基于 React 渲染,弹簧动画图片场景、文字卡、数据卡、图表、抖音式逐词字幕、数字人
合成(HTML/GSAP)HyperFrames基于 HTML/CSS/GSAP 渲染,动感排版、产品宣传、发布预告、网页转视频、SVG 角色动画
后期FFmpeg编码、字幕烧录、音频混音、调色
字幕内置自动生成带逐词时间轴的字幕

需要说明的是,Pexels、Unsplash、Pixabay 这三个虽然要 key,但都是开发者免费申请的,不涉及任何付费,所以也算在零成本范围内。

想立刻看到效果,可以跑一下零 key 的 demo,它只用 Remotion 组件渲染动画图表、文字和数据可视化,不碰任何需要联网或付费的生成模型:

$ make demo
==> Rendering zero-key demo videos (no API keys needed)...
    These use only Remotion components — animated charts, text, data viz.

Rendering: code-to-screen
Props:     remotion-composer/public/demo-props/code-to-screen.json
Output:    projects/demos/renders/code-to-screen.mp4

Downloading Chrome Headless Shell https://www.remotion.dev/chrome-headless-shell
Got Headless Shell   ━━━━━━━━━━━━━━━━━━ 132472ms
Bundled code         ━━━━━━━━━━━━━━━━━━ 2187ms
⚡️ Cached bundle. Subsequent renders will be faster.
Composition          Explainer
Codec                h264
Concurrency          4x
Rendered frames      ━━━━━━━━━━━━━━━━━━ 79491ms
Encoded video        ━━━━━━━━━━━━━━━━━━ 3666ms
Done: projects/demos/renders/code-to-screen.mp4 (3.6 MB)

Rendering: focusflow-pitch
...
Rendered frames      ━━━━━━━━━━━━━━━━━━ 72604ms
Done: projects/demos/renders/focusflow-pitch.mp4 (4.0 MB)

Rendering: world-in-numbers
...
Rendered frames      ━━━━━━━━━━━━━━━━━━ 75020ms
Done: projects/demos/renders/world-in-numbers.mp4 (4.1 MB)

可以看到,这条命令一口气渲染了三条 demo 视频:code-to-screenfocusflow-pitchworld-in-numbers,分别对应代码上屏、产品路演和数据可视化三种风格。每条视频的数据都来自 demo-props/ 下的一个 JSON 文件,套用的是同一个名为 Explainer 的 Remotion 合成(composition),用 h264 编码、4 路并发渲染。

有几个点值得留意:

  • 首次渲染会先下载无头 Chrome:Remotion 底层是用无头 Chrome 把页面一帧帧截下来,所以第一次跑会先拉一个 chrome-headless-shell,这是一次性的,之后走缓存。同理 Bundled code(打包)第一次要完整构建,后两条直接命中缓存(⚡️ Cached bundle
  • 纯本地、纯 CPU:整个过程没有调用任何付费 API,产物是 3.6~4.1 MB 的 mp4,落在 projects/demos/renders/ 目录下

这一步其实就把「零 key 出片」这条链路完整验证了一遍:Remotion + 无头 Chrome + FFmpeg,不花一分钱也能渲出真视频。

打开渲染出来的 mp4,效果如下:

from-code-to-screen.png

零 key 视频的本质

我们顺便看一眼源码,看看一支零 key 视频在落地时到底长什么样。上面截图里这条 code-to-screen,数据就来自 remotion-composer/public/demo-props/code-to-screen.json,我们打开看看结构(只截了前两个镜头):

{
  "theme": "flat-motion-graphics",
  "cuts": [
    {
      "id": "code-hook",
      "type": "hero_title",
      "in_seconds": 0,
      "out_seconds": 3.5,
      "text": "From Code to Screen",
      "subtitle": "How a small system turns work into a polished release"
    },
    {
      "id": "code-tip",
      "type": "callout",
      "in_seconds": 3.5,
      "out_seconds": 7.5,
      "title": "Shipping Rule",
      "text": "Start with one visible win, then automate the repeatable path."
    }
  ]
}

这份 props 的结构一目了然:

  1. theme:整体风格,这里用的是 flat-motion-graphics 风格手册
  2. cuts:一个数组,每一项是一个镜头,按时间轴排开
  3. type:镜头类型,hero_title 是大标题,callout 是提示卡,这条片子后面还用了 comparison(对比卡)、progress_bar(进度条)、kpi_grid(KPI 网格)等
  4. in_seconds / out_seconds:这个镜头在时间轴上的起止秒数

除了 cuts,这份 props 里还有 overlays(叠加层,比如分节标题、数字浮现)、captions(字幕)和 audio(音频)几个字段。

说穿了,一支零 key 视频的本质,就是一个 Remotion React 组件接收这么一份 JSON props,再把它渲染成 MP4。刚才 make demo 渲出来的那几条,背后就是这么一回事。

跑你的第一条视频

真正的玩法是在 AI 编程助手里跑。用你的编程助手打开 OpenMontage 项目目录,然后像聊天一样把需求说给它听:

Make a 45-second animated explainer about why the sky is blue

Agent 会先选定流水线(这里是 Animated Explainer),读取清单和阶段技能,联网调研「天空为什么是蓝色」,写脚本、配旁白、生成配图、自动找免版税背景音乐、烧录逐词字幕,最后渲染成片。在你看到成片之前,它还会跑一轮多点自检。整个过程中的每个创作决策点,它都会停下来问你是否同意。

如果你想做的是真实素材的纪录片式视频,记得在提示词里明确说 use real footage only

Make a 90-second documentary montage about what a city feels like at 4am.
Use real footage only, no narration, elegiac tone.

想解锁更多工具,就往 .env 里加 key,每个 key 都是可选的,加得越多能用的供应商越多:

# .env —— 每个 key 都是可选的,有什么填什么

# --- 图片 + 视频网关 ---
FAL_KEY=your-key               # FLUX 图片,Google Veo、Kling、MiniMax 视频,Recraft 图片

# --- Google(一个 key 同时解锁图片生成和 TTS)---
GOOGLE_API_KEY=your-key        # Google Imagen 图片,Google Cloud TTS(700+ 音色、50+ 语言)

# --- 配音 ---
ELEVENLABS_API_KEY=your-key    # TTS 旁白、AI 音乐、音效
OPENAI_API_KEY=your-key        # OpenAI TTS、DALL-E 图片
XAI_API_KEY=your-key           # Grok 图片生成/编辑、Grok 视频生成
DOUBAO_SPEECH_API_KEY=your-key # 火山引擎豆包语音 TTS
# Piper 本地音色无需 key,pip 装上 piper-tts 即可

# --- 音乐 ---
SUNO_API_KEY=your-key          # Suno AI 音乐生成(整曲、伴奏、各种曲风)

# --- 视频生成 ---
HEYGEN_API_KEY=your-key        # HeyGen(一个 key 调 VEO、Sora、Runway、Kling、Seedance)
RUNWAY_API_KEY=your-key        # Runway Gen-4 直连 API
VIDEO_GEN_LOCAL_ENABLED=true   # 设为 true 启用本地视频生成(需 GPU + diffusers)
VIDEO_GEN_LOCAL_MODEL=wan2.1-1.3b  # 本地模型:wan2.1-1.3b / wan2.1-14b / hunyuan-1.5 / ltx2-local / cogvideo-5b

# --- 库存素材 ---
PEXELS_API_KEY=your-key        # Pexels 免费库存视频/图片
PIXABAY_API_KEY=your-key       # Pixabay 免费库存视频/图片
UNSPLASH_ACCESS_KEY=your-key   # Unsplash 免费库存图片(开发者 key 免费申请)

# --- 分析 ---
HF_TOKEN=your-key              # HuggingFace token,开启转写时的说话人分离

小结

今天我们认识了 OpenMontage 这个近期冲上 GitHub Trending 第一的开源项目。简单回顾一下要点:

  1. 定位:世界上第一个开源的 agentic 视频制作系统,把 AI 编程助手变成一间端到端的视频工作室,覆盖 12 条流水线、52 个工具、500+ 个技能
  2. agent-first 架构:没有 Python 编排器,Agent 读取 YAML 清单和 Markdown 技能来驱动整条流水线,所有决策留痕
  3. 零 key 出片:靠 Piper、Archive.org、Remotion、HyperFrames、FFmpeg 这套免费工具链,不花一分钱也能做出真视频

不过今天我们只是把它装好、用零 key 渲出了几条 demo。OpenMontage 真正有意思的地方在于它那套流水线和三层知识架构,以及 Agent 是如何一步步读懂清单、调用工具、自我审查的。这些细节我们留到后面的文章里慢慢展开。上面「跑你的第一条视频」里,我们已经分别用一句提示词试了图片视频和真实素材纪录片两种做法。下一篇,我们就把这两种做法摊开来细讲,看看不花一分钱、不配任何付费 API key,OpenMontage 到底能做出什么样的视频。

参考