使用指南
使用 HiAPI API 上的 flux-3-max/text-to-video 构建短视频
端到端工作流:分镜规划、提示词编排、镜头运动、原生音频以及一个可运行的请求
为什么短视频是一个提示词编排问题
大多数在文本生成视频上失败的团队都出于同一个原因:他们写一条巨大的提示词来描述整个场景,并期望模型返回一段已完成的三十秒视频。生成并不是这样工作的。模型每次调用只生成一个连续镜头,而每次调用都是一次关于主体、动作、构图和声音的小型、自包含的决策。
真正站得住脚的心智模型是编排。你不是在提示一段视频,而是在导演一系列镜头,然后把它们组装起来。一个短视频作品——产品预告、社交钩子、旁白讲解——通常由四到八个镜头组成。每个镜头只承担一项任务:建立、展示、转场、收尾。一旦你接受这种分解方式,API 就不再是一台老虎机,而变成了你所控制的流水线中的一个渲染步骤。
这一点很重要,因为文本生成视频的失败模式大多是连续性失败,而不是质量失败。单个镜头可能看起来很美,但如果下一个镜头里的角色不同、光线方向不同,或者摄像机突然飘移,那么这个镜头仍然不可用。这些问题在请求发出之前就能解决,靠的是你如何规划和描述镜头——而不是靠给一条巨型提示词添加形容词。
本指南的其余部分将带你端到端地走完这套工作流,基于 HiAPI 调用 flux-3-max/text-to-video:把剧本拆分为镜头、编写逐镜头提示词、把镜头运动当作一个受控维度来处理、使用原生音频以跳过单独的音频处理环节,并把一切封装进一个小巧、可复现的请求循环中。
在调用 API 之前规划镜头
在编写任何代码之前,先把剧本变成一份镜头列表。镜头列表是一种纯数据结构:每次生成调用对应一个条目,每个条目都有明确的目的。下面这种结构很适合作为中间表示:
[
{
"id": "s1",
"role": "establish",
"subject": "ceramic pour-over coffee dripper on a wooden counter",
"framing": "medium close-up, three-quarter angle",
"durationIntent": "short",
"camera": "slow push in",
"audio": "quiet room tone, soft steam"
},
{
"id": "s2",
"role": "demonstrate",
"subject": "hot water spiraling over coffee grounds",
"framing": "tight overhead macro",
"durationIntent": "short",
"camera": "locked off",
"audio": "water pouring, gentle hiss"
}
]
几条可以为后续节省重试次数的规划规则:
- 每个镜头一个想法。 如果你的镜头描述包含“然后”,就把它拆开。模型处理单个连续动作的能力远好于处理一连串节拍。
- 表达时长意图,而不是精确秒数。 决定一个镜头是快速切换还是较长的停留,并将其表达为意图。精确的时间点属于你的剪辑/拼接阶段,在那里你可以获得帧级精度的控制。
- 尽早固定构图词汇表。 选择
wide、medium、close-up、overhead、low angle这类术语,并在各个镜头中原样复用。一致的词汇表会产生更一致的结果。 - 规划连续性锚点。 决定哪些内容保持不变:角色描述、服装、色调、一天中的时间、光线方向。把这些一次性写成共享前缀,并在每条提示词中复用。
- 审核时顺序很重要。 按剧本顺序生成,这样你就可以按照最终播放的顺序来审核,而不是把片段当作孤立片段来看。
一旦镜头列表存在,API 调用就变得机械化了——这正是你想要的,因为它使调用可重试、可复现。
为 flux-3-max/text-to-video 编写逐镜头提示词
一条好的逐镜头提示词是有结构的,而不是对话式的。不要写一条很长的自由格式字符串,而是用少量带标签的段落来组成每条提示词。这使得提示词可 diff、可复用,并且在某个单一元素出错时易于调整。
五段式结构
- 主体 —— 是谁或是什么,包含你决定好的连续性细节(外观、服装、产品特征)。
- 动作 —— 一个连续的运动或状态,用现在时描述。
- 环境 —— 地点、一天中的时间、光线质感、色调。
- 镜头 —— 构图加运动,使用你固定的词汇表。下一节会详细展开。
- 音频 —— 这个镜头的环境声和拟音意图。
按固定顺序组合它们,这样你自己的调试也能保持一致:
CONTINUITY = (
"a minimalist ceramic pour-over coffee dripper, matte white, "
"on a warm oak counter, soft morning window light from the left, "
"muted natural palette"
)
def shot_prompt(subject, action, setting, camera, audio):
return (
f"{subject}. {action}. {setting}. "
f"Camera: {camera}. Audio: {audio}."
)
prompt = shot_prompt(
subject=f"{CONTINUITY}",
action="steam rising steadily as water slowly blooms the coffee grounds",
setting="kitchen counter at dawn, shallow depth of field",
camera="medium close-up, slow push in, no shake",
audio="quiet room tone, soft water pour, faint steam hiss",
)
保持镜头视觉一致
最具杠杆效应的单一习惯是共享连续性区块。把它放在每个主体段的最前面,在整个序列的所有镜头中保持不变。当某个镜头出现视觉漂移时,你就可以二分定位问题:是连续性区块的问题,还是镜头特定动作的问题?
还有两个能减少漂移的习惯:
- 避免矛盾的形容词。 “电影感纪录片手持静止”是三个互相冲突的指令。选一个。
- 只描述一次光线。 如果连续性区块写的是左侧晨光,就不要让后面的镜头引入顶部荧光灯——除非那个切换是有意为之。
提示词中应省略的内容
把宽高比、输出长度和其他技术参数从文字描述中拿出去,在 API 暴露这些参数时作为请求参数传入。文字描述用于说明镜头是什么;参数用于说明它如何交付。把两者混在一起会让它们都更难修改。
控制镜头运动
镜头运动是最容易被交给偶然性的维度,也是最能影响一个序列是否感觉被导演过的维度。如果你不指定,模型会以某种方式移动镜头;未指定的运动会表现为漂移,而漂移正是让生成素材看起来像是意外拍出来的原因。
把运动当作一个小的封闭词汇表
不要为每个镜头即兴创造镜头语言。定义一小套运动方式并复用:
- 固定机位 —— 不移动。产品细节和特写最安全的选择。
- 推近 / 拉远 —— 朝主体移动或远离主体。适合强调和揭示。
- 向左摇 / 向右摇 —— 水平旋转。用于建立空间感。
- 向上仰 / 向下俯 —— 垂直旋转。谨慎使用;它读起来很有戏剧性。
- 跟拍 —— 随主体移动。需要一个明显运动的主体作为锚点。
把它们写在镜头段中,后面跟一个抑制其余运动的否定指令:Camera: slow push in, no shake, no handheld drift.
否定从句很重要。只说“推近”会给模型留下添加晃动的空间;说“推近,不晃动”则收窄了范围。
让运动服务于镜头角色
运动应该服务于剪辑。一个实用的映射:
- 建立镜头 —— 一个清晰的运动(缓慢推近或轻柔摇镜),给视线一个落点。
- 细节镜头 —— 固定机位。细节本身视觉信息就很密集;运动会和它竞争。
- 转场 —— 相邻镜头使用一致的运动(都推近,都朝同一方向摇),即使没有转场特效,也能让切换感觉是有意为之。
- 主视觉镜头 —— 一个刻意的运动,绝不要两个组合。
每个镜头只保留一个运动
组合运动(“向右摇的同时推近并向上仰”)会产生浑浊的结果。如果一个节拍需要复杂的镜头运动,就把它拆成两个镜头。你的拼接阶段可以把它们接起来,同时你还能对切换保持帧级控制。
序列中的运动一致性
事先决定整个作品的主导运动——例如“所有镜头都缓慢推近”——只在需要效果时才偏离。运动方向一致的序列读起来像是有作者意图的;运动随机的序列读起来像是生成的。
在流水线中使用原生音频
原生音频生成改变了短视频流水线的架构。在传统流程中,你先生成无声视频,然后运行一个单独的音频处理环节——要么是文本生成音频模型,要么是授权的拟音和音乐库——然后在编辑器中把两者对齐。每个阶段都是另一个服务、另一份凭证、另一种失败模式,以及另一个可能发生时间偏差的地方。
当视频模型内联生成音频时,声音和画面在同一次推理步骤中生成,因此它天然与屏幕上发生的事情对齐。水倒出来的那一刻,倒水声就和倒水动作对上了。这几乎完全消除了对齐工作。
两条流水线,一个差异
Separate audio stage: Native audio:
shot -> video (silent) shot -> video + audio
-> audio generation -> assemble
-> alignment / mixing
-> assemble
实际的好处是活动部件更少。实际的约束是你需要在提示词中规划声音,而不是事后补。
围绕声音规划镜头
因为音频是生成的一部分,所以把它作为镜头的一部分来写,而不是事后补充:
- 点名主导声音。
Audio: water pouring, gentle hiss比Audio: pleasant kitchen sounds更好。 - 保持稀疏。 每个镜头一到两个清晰的元素。分层音频描述往往会糊在一起。
- 有意识地决定音乐。 如果你计划在编辑器中给整个作品铺一条音乐底轨,就让镜头音频只保留环境声,这样它不会和音乐轨打架。
- 考虑声音的连续性。 和视觉连续性一样,跨切换的音频连续性也有帮助——相邻镜头中相同的房间底噪会让一个序列感觉像是在同一个地方。
编辑器仍然胜出的地方
原生音频并没有取代编辑器。它取代的是对齐步骤。你仍然需要最终的响度归一化,如果你使用音乐,还需要一个混音环节,把对话和拟音在底轨下压低。在你的流水线中为这些留出预算,但相比使用单独生成阶段,预算要少得多。
一个可运行的请求与组装流程
有了镜头列表和提示词构建器,请求层就很薄了。关键决策是:如何调用模型、如何处理顺序和重试,以及如何把结果交给拼接。
编排循环
import time
SHOTS = [
# your planned shot list from the earlier step
]
def generate_shot(shot, attempt=0):
payload = {
"model": "flux-3-max/text-to-video",
"prompt": build_prompt(shot),
# pass delivery parameters here, not in the prose:
# aspect ratio, length, etc. per the API reference
}
try:
return client.generate(payload)
except TransientError:
if attempt >= 3:
raise
time.sleep(2 ** attempt)
return generate_shot(shot, attempt + 1)
def run_sequence(shots):
results = {}
for shot in shots:
results[shot["id"]] = generate_shot(shot)
return [results[s["id"]] for s in shots]
三件事让这个循环具备生产安全性,而不只是一个演示:
- 有序迭代。 按剧本顺序生成意味着部分失败会留下一个你可以审核的前缀,而且只重新运行缺失的镜头也很直接。
- 以键存储的结果。 按镜头 id 而不是列表位置存储输出。如果第三个镜头失败并重新生成,你要按 key 覆盖,而不是重新追加。
- 有界重试与退避。 瞬态失败在任何生成 API 中都很正常。限制重试次数,这样单个坏镜头不会卡住整个任务。
交接给拼接
你的生成循环应该产出一个清单——附上输出引用的镜头列表——然后到此为止。拼接是一个消费该清单的独立步骤:它把每个片段裁剪到预期时长、应用转场、铺音乐底轨,并归一化响度。
{
"sequence": [
{"id": "s1", "clip": "out/s1.mp4", "trim": "keep_first_portion"},
{"id": "s2", "clip": "out/s2.mp4", "trim": "keep_first_portion"}
],
"audioStrategy": "native_bed_plus_music"
}
把拼接和生成分开,才能让整条流水线可复现:你可以重新生成一个镜头,把它放进清单,然后重新渲染最终剪辑,而不触碰其他任何东西。
生产检查清单与常见陷阱
当无聊的部分变得无聊时,短视频流水线就是可靠的。在扩大产量之前,先跑一遍这些检查。
一致性
- 连续性区块在一个序列的每个镜头中完全一致。
- 镜头词汇表是封闭且复用的,而不是即兴发挥的。
- 光线方向和色调只声明一次,后面不再矛盾。
- 按顺序审核镜头——孤立地看片段时,连续性问题不可见。
重试与幂等性
- 结果按镜头 id 作为键,这样重新生成会覆盖而不是重复。
- 重试是有界的并使用退避;一个永久失败的镜头应该响亮地失败,而不是静默失败。
- 镜头清单是所生成内容的唯一真相来源——把它和输出一起持久化。
成本控制
生成按模型产生的工作量计费,所以你主要的杠杆是你生成多少个镜头以及重新生成它们多少次。实用控制手段:在生成前锁定镜头列表,在渲染其余镜头之前先审核每个序列的一个代表性镜头,避免对已经通过审核的镜头进行投机性重掷。在规划产量时,查看网站价格面板上的当前定价。
输出审核
- 以真实播放速度端到端观看每个序列,而不是逐个片段地看。
- 对照画面检查音频:声音是否与那一刻匹配?
- 特别检查前两秒——短视频的注意力正是在那里赢得或失去的。
- 保留一小套已知良好的参考提示词,当质量似乎下滑时,把新输出与它们比较。
常见陷阱
- 巨型提示词。 一条提示词描述整个场景会产生一个冗长、失焦的镜头。把它拆开。
- 在文字描述中写时长。 在剪辑阶段表达时间点,而不是在提示词文本中。
- 随机的镜头运动。 未指定的运动会漂移;指定运动并抑制其余部分。
- 把音频当作独立的产品决策。 在镜头中规划声音,然后在编辑器中混音。
本指南中的工作流——规划镜头、结构化提示词、控制镜头运动、使用原生音频、用清单进行编排——把 flux-3-max/text-to-video 从一个不可预测的生成器变成了你所拥有的流水线中一个可靠的渲染步骤。