motion-choreographer 是做什么的?
将已锁定的静态图像与12格场景蓝图转化为针对目标视频适配器的运动提示。包含摄像机编排、主体运动、环境二次运动、物理约束,以及当适配器声明
audio: native时的同步音频方向块。 从adapter-contract.md读取适配器能力;绝不调用网络 API。
使用时机
- 图像已锁定(操作者通过
operator-pick.sh选定了一个候选帧),下一步是为视频适配器生成运动 + 音频方向。 - 蓝图已存在于
scenes/<id>/blueprint.json,但尚未输出运动提示。 - 提供商切换(Veo → Kling, Sora → Higgsfield)需要为同一场景针对新适配器的能力配置重新调整输出。
不要在以下情况使用:
- 蓝图仍为纯文本——先运行
scene-expander→parse-blueprint.sh。 - 尚未锁定静态图像——必须先完成操作者选择检查点。
- 输出是静态图像——请使用
canvas-design。
流程
第0步:检查
- 读取
scenes/<id>/blueprint.json—— 如果缺失则报错。 - 读取
scenes/<id>/selection.json—— 如果缺失则报错;锁定图像路径是运动锚点的必需项。 - 通过
scripts/ai-video/adapters/<id>.sh capability读取目标适配器的能力。缓存audio=*以用于第3步。 - 如果存在
character.json锁定,则逐字加载——身份令牌不可更改。 - 询问了连续拍摄或连接器?首先读取模型的
start_frame/end_frame——scripts/ai-video/adapters/<id>.sh capability --model <m>。null表示未知,从不设为true。无法锁定帧的模型将被一行理由拒绝,绝不替换(参见adapter-contract.md#end_image)。
第1步:摄像机编排
输出一个 CAMERA MOTION 块,包含移动类型、距离、速度(秒)和起始-结束取景。
- 移动类型:lock-off, pan, tilt, dolly-in, dolly-out, truck, pedestal, push, pull, handheld, gimbal-glide, crane, whip。
- 速度:每秒节拍(
0.4s push, hold 1.6s, 0.4s pull)。 - 起始和结束取景命名(
MS → CU,WS → MS)。
蓝图意图类解码——蓝图的 CAMERA 块命名了六个提供商无关的意图类之一;在编码前将其映射到上述移动类型:
| 意图类 | 移动类型映射 |
|---|---|
| static hold | lock-off |
| push-in | push / dolly-in |
| pull-back | pull / dolly-out |
| lateral track | truck / pan |
| handheld drift | handheld / gimbal-glide |
| orbit | crane / arc via truck+pan |
适配器特性(每个适配器对映射移动的编码)。这些未注明日期且未经提供商文档验证——在信任前请检查模型能力条目(verified, recheck_by):
- Veo —— 接受命名移动;偏好 ≤ 8s 的片段。
- Kling —— 运动强度 0–1 token;将我们的速度映射到该值。
- Sora —— 自然语言描述移动 + 时长;无 token。
- Higgsfield —— 预设驱动;选择匹配移动的预设;在运动提示中记录预设 ID。
- LENS 处理 —— 蓝图中的 mm + 光圈转换为提供商最近的镜头 / FOV 表达方式;切勿将原始 mm 转发给缺乏镜头语法的提供商。
- 时长处理 —— 蓝图值为自由值;在此处限制到提供商上限,并在
review.md中记录限制(静默限制是漂移缺陷)。
第2步:主要 + 次要运动
两个块:
- PRIMARY MOTION —— 主体的动作,按节拍计数,带有物理锚点(质量、接触点、动量)。复用蓝图的
ACTION;根据适配器偏好的动词密度进行调整。 - SECONDARY MOTION —— 环境的动态(头发、织物、树叶、水、灰尘、粒子、呼吸)。每行一层。
- TIMED SEGMENTS(可选,当片段有多个节拍时) ——
0–3 s: …,3–7 s: …,覆盖整个时长且无间隙;每个段命名变化的内容,从不描述情绪。
第3步:音频方向(条件性)
如果适配器能力为 audio: native 且蓝图的 audio.enable_native_audio 为 true:
输出一个 AUDIO DIRECTION 块,包含:
DIALOGUE TIMING——speaker @ 0.4s: "line"每个对话条目。提示本身为英语;每句口语保留其原始语言和文字,并加标签([de] "…")。绝不翻译用户写的台词。AMBIENT LAYERS—— 从蓝图复制;每行一层。SYNC CUES—— 哪个动作节拍对应哪个音频提示(footstep @ 1.2s,door close @ 2.1s)。
如果适配器能力为 audio: none:
- 输出一个
# AUDIO: ffmpeg-mux fallback注释,包含蓝图中的音频路径,队列用于拼接时复用。 - 在运动提示 JSON 中设置
enable_native_audio: false。 - 蓝图包含 DIALOGUE → 复用回退无法播放文本台词。在
motion-prompt.txt和adapter-notes.md中输出强制的AUDIO DOWNGRADE警告块,列出所有无法渲染的对话台词。该决定是否可接受属于编排器关卡(adapter-contract § 音频所有权)——此技能负责翻译,决不验证,也绝不静默删除对话。
第4步:物理约束
输出 PHYSICS —— 模型必须遵守的简短列表:重力方向、接触摩擦力、流体行为、头发/布料惯性、镜头视差。每行一个约束。
然后输出 NEGATIVE LOCKS —— 必须避免的事,每行一个:身份漂移、蓝图未要求的可读文字、多余肢体或手指、镜头列表中不存在的切、不是用户所有的标志。仅锁定蓝图提供理由的内容。
第5步:输出运动提示 JSON
写入 scenes/<id>/motion-prompt.json,格式为适配器合约的标准输入形状。编排器将其管道传递到视频适配器的 submit 子命令。
第6步:验证
- JSON 可解析(
jq .)。 requires.audio_native与所选适配器的能力一致。- 运动提示中的时长与蓝图时长完全一致(±0)。
- 身份令牌(如果
character.json存在)逐字保留。
输出格式
scenes/<id>/motion-prompt.json—— 适配器合约标准输入。scenes/<id>/motion-prompt.txt—— 带标签的散文块(CAMERA MOTION · PRIMARY MOTION · SECONDARY MOTION · AUDIO DIRECTION · PHYSICS),供操作者审查。scenes/<id>/adapter-notes.md—— 使用的适配器、其能力、所选预设/模型及理由。
注意事项
- 模型倾向于“改进”蓝图的
SUBJECT块——身份令牌不可更改;抵制诱惑。 - 在返回
audio: none的适配器上选择audio: native会产生静默视频——始终先读取能力,切勿根据适配器名称猜测。 - Higgsfield 预设 ID 必须记录;否则重新运行时会漂移到模型下次选择的任意预设。
- Sora 时长超过 8s 通常会退化——在适配器表限制处截断;将截断情况告知操作者。
禁止事项
- 不要为未在当前轮次查询过能力的适配器输出运动提示。
- 不要跳过静态图像锁定检查——没有锚定图像的运动方向每次调用都会发散。
- 不要改述
character.json中的身份令牌。 - 不要调用任何网络 API——此技能仅进行提供商调节的文本生成。
策略
路径、执行模型及完整集合:请参阅媒体策略前言。
运动提示继承上游蓝图携带的所有约束。在输出提供商调节的散文之前:
disclosure—— 每个分发的片段都带有不可移除的 AI 生成披露;拒绝可能抑制该披露的适配器标志。transparency—— 保留提供商来源(C2PA / SynthID);拒绝其效果是去除来源的重新编码标志。voice-cloning—— 当运动提示请求在命名声音中使用audio: native旁白时。brand-impersonation—— 当运动提示复制了已知品牌的字幕/吉祥物/标志性转场时。
拒绝并告知;运动提示不能洗白上游技能本应捕获的策略漏洞。