做视频生成这两年,我最大的体会是:模型能力的上限,往往被提示词的下限锁死。同样一段"咖啡馆里一个人在煮咖啡",有人跑出来是广告大片,有人跑出来是模糊抖动的三秒切片。差别不在模型,而在你怎么"说"。这篇文章就聊 Veo 这类文生视频模型的提示词工程(Prompt Engineering),以及一套可复用的创意工作流。
一、Veo 到底能做什么
Veo 是谷歌的文生视频 / 图生视频模型。它的核心能力可以拆成四块:一是文本到视频 ,直接把自然语言变成一段动态画面;二是图像到视频 ,给一张静态图,让模型在保持主体不变的前提下驱动运动;三是镜头语言控制 ,能理解"缓慢推近""环绕运镜""低角度仰拍"这类电影术语;四是原生音轨(Veo 3 起支持),可以直接生成与环境匹配的环境声,甚至对白。
理解这一点很重要:它不是"输入一句话、吐出成片"的黑箱,而是一个需要被精确指挥的"虚拟摄影机 + 虚拟导演"。提示词的质量,直接决定了这一台虚拟摄影机知不知道该往哪拍。

二、提示词的结构:别再写一句话了
新手最容易犯的错,是把提示词写成一个长句:"一个帅哥在海边跑步,阳光很好,很酷"。这种写法信息密度低、可控性差。更有效的做法是把提示词拆成段落式结构,每一段负责一个维度:
-
景别(Shot Size):特写 / 近景 / 中景 / 全景 / 远景,先框定取景范围。
-
主体与动作(Subject & Action):谁、在做什么,动词要具体("研磨""倾倒""蒸汽升腾"优于"做咖啡")。
-
场景(Scene):在哪里,什么光线条件(黄金时刻、阴天、霓虹夜)。
-
镜头运动(Camera Motion):缓推、拉远、横移、环绕、手持------这是视频区别于图片的关键维度。
-
风格与情绪(Style & Mood):电影感、赛博朋克、水彩;宁静、紧张、欢快。
-
时长与声音:几秒,是否要原生环境音。
下面是一个结构化的提示词模板,它把上面六个维度串成一段模型友好的英文描述:
extreme close-up. a vintage brass coffee grinder is turning slowly,
fresh beans tumbling. The scene is a sunlit wooden counter at golden hour.
Camera: slow dolly-in. Visual style: cinematic, anamorphic, shallow DOF.
Mood: warm, unhurried. Duration: 8s. Audio: ambient natural sound.
实践心法:动词具体 + 镜头运动明确 + 风格锚定,三者齐全,成片可控性会肉眼可见地提升。这也是
veo_prompt_builder.py这个可执行 Demo 自动拼装的逻辑。

三、受控词库:把"创意语言"翻译成"摄影语言"
为什么需要词库?因为同一个意思,人和模型的"词汇表"不一样。你说"镜头动一下",模型不知道是推还是拉。你建立一张受控词表,就相当于给团队和模型之间立了一本"翻译词典"。下面是我常用的三类核心词:

这套词库的价值在于可复现。同一支团队,今天和三个月后做同一个产品短片,只要引用同一张词表,出来的镜头质感是一致的。这比每次"凭感觉写一句"靠谱得多。
四、分镜工作流:从一句话到一组镜头
单个镜头跑通后,真正的创意工作在"分镜"层面。一个 15 秒的产品故事,通常要拆成 3--5 个镜头,每个镜头换景别、换运动,但保持同一主体。比如咖啡研磨的故事:镜头 1 用远景交代清晨厨房的光,镜头 2 用特写推近手柄转动,镜头 3 用中景横移把研磨和成品并置。三个镜头各写一条提示词,主体始终是那台黄铜磨豆机。
这种"同一主体 + 多镜头运动叙事"的方法,正是 veo_prompt_builder.py 里 build_storyboard 函数做的事情:传入一个基础简报,再传入一个镜头覆盖列表(每个镜头改景别、运动、动作),它就批量产出一组风格统一、主体一致的分镜提示词。
可执行 Demo:veo_prompt_builder.py
这是一个零依赖的纯 Python 脚本,运行后你会看到:单镜头提示词编译、三镜头分镜表自动生成、受控词库速查。它把本文讲的"结构化 + 词库 + 分镜"三件事直接变成可运行代码,跑通一条"想法 → 指令"的工程链路。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
veo_prompt_builder.py
=====================
这个脚本把"一句模糊的创意想法"翻译成 Veo 友好的结构化提示词,
并提供镜头运动词库、景别词库、风格词库,以及把一个创意简报
展开成多镜头分镜表的能力。它不调用任何外部 API,仅用于演示
提示词工程(Prompt Engineering)在视频生成中的实践方法。
运行:
python veo_prompt_builder.py
"""
from dataclasses import dataclass, field
from typing import List
# ---------------------------------------------------------------------------
# 1. 词库:把"创意语言"映射到"模型语言"
# ---------------------------------------------------------------------------
# Veo 对画面运动、景别、光线、风格的描述越具体,可控性越强。
# 下面三张表是实践中高频有效的"受控词汇"。
CAMERA_MOTIONS = {
"静态": "locked-off static shot, no camera movement",
"缓推": "slow dolly-in, camera moves gently toward the subject",
"拉远": "slow pull-back, revealing the surrounding environment",
"横移": "smooth lateral tracking shot, camera glides sideways",
"环绕": "slow 360 orbit around the subject",
"升降": "crane up, camera rises to reveal a wider vista",
"手持": "handheld, subtle organic camera shake",
"俯拍": "high-angle overhead shot looking down",
"仰拍": "low-angle shot looking up, subject feels monumental",
}
SHOT_SIZES = {
"特写": "extreme close-up, fill frame with the subject's detail",
"近景": "close-up, head and shoulders framed",
"中景": "medium shot, subject framed from waist up",
"全景": "wide shot, subject within a full environment",
"远景": "establishing shot, vast landscape with tiny subject",
}
STYLES = {
"电影感": "cinematic, anamorphic lens, shallow depth of field, film grain",
"纪录片": "documentary style, natural light, available ambience",
"赛博朋克": "neon-noir cyberpunk, rain-slick streets, volumetric fog",
"水彩": "soft watercolor illustration, paper texture, pastel tones",
"极简": "minimalist, clean negative space, muted palette",
}
# ---------------------------------------------------------------------------
# 2. 结构化提示词:Veo 友好的"段落式"模板
# ---------------------------------------------------------------------------
@dataclass
class CreativeBrief:
subject: str # 主体:谁 / 什么
action: str # 动作:在做什么
scene: str # 场景:在哪里
shot_size: str = "中景" # 景别(取自 SHOT_SIZES)
camera: str = "缓推" # 镜头运动(取自 CAMERA_MOTIONS)
style: str = "电影感" # 风格(取自 STYLES)
mood: str = "宁静而专注" # 情绪氛围
duration_s: int = 8 # 时长(秒)
audio: str = "ambient natural sound, no dialogue" # 声音(Veo 3 支持原生音轨)
def to_prompt(self) -> str:
"""把简报编译成一段 Veo 优化提示词。"""
cam = CAMERA_MOTIONS.get(self.camera, self.camera)
sz = SHOT_SIZES.get(self.shot_size, self.shot_size)
st = STYLES.get(self.style, self.style)
parts = [
f"{sz}.",
f"{self.subject} {self.action}.",
f"The scene is {self.scene}.",
f"Camera: {cam}.",
f"Visual style: {st}.",
f"Mood: {self.mood}.",
f"Duration: {self.duration_s}s. Audio: {self.audio}.",
]
return " ".join(parts)
# ---------------------------------------------------------------------------
# 3. 分镜表生成:把一个创意简报展开成多条镜头
# ---------------------------------------------------------------------------
@dataclass
class Shot:
idx: int
brief: CreativeBrief
note: str = ""
def build_storyboard(brief: CreativeBrief, shots: List[dict]) -> List[Shot]:
"""shots: [{camera, shot_size, action, note}, ...] 覆盖简报中的字段。"""
out: List[Shot] = []
for i, s in enumerate(shots, 1):
b = CreativeBrief(
subject=brief.subject,
action=s.get("action", brief.action),
scene=brief.scene,
shot_size=s.get("shot_size", brief.shot_size),
camera=s.get("camera", brief.camera),
style=brief.style,
mood=s.get("mood", brief.mood),
duration_s=s.get("duration_s", brief.duration_s),
audio=brief.audio,
)
out.append(Shot(idx=i, brief=b, note=s.get("note", "")))
return out
# ---------------------------------------------------------------------------
# 4. 演示
# ---------------------------------------------------------------------------
def main() -> None:
print("=" * 64)
print(" 谷歌 Veo 创意提示词构建器 · 演示")
print("=" * 64)
# --- 单镜头提示词 ---
print("\n[1] 单镜头结构化提示词")
brief = CreativeBrief(
subject="a vintage brass coffee grinder",
action="is turning slowly, fresh beans tumbling and releasing aroma",
scene="on a sunlit wooden kitchen counter at golden hour",
shot_size="特写",
camera="缓推",
style="电影感",
mood="warm, unhurried, tactile",
duration_s=8,
)
print(" 简报 ->", brief.to_prompt())
# --- 多镜头分镜 ---
print("\n[2] 多镜头分镜表(同一主体,运动叙事)")
story = build_storyboard(brief, [
{"shot_size": "远景", "camera": "静态",
"action": "sits quietly on the counter, morning light pouring in",
"note": "建立镜头:交代环境与光线"},
{"shot_size": "特写", "camera": "缓推",
"action": "handle rotates, beans crack and fall",
"note": "细节镜头:突出机械质感"},
{"shot_size": "中景", "camera": "横移",
"action": "steam rises from the cup beside the grinder",
"note": "关系镜头:把研磨与成品并置"},
])
for sh in story:
print(f" 镜头 {sh.idx} [{sh.brief.shot_size}/{sh.brief.camera}] {sh.note}")
print(f" {sh.brief.to_prompt()}")
# --- 词库速查 ---
print("\n[3] 受控词库速查(节选)")
print(" 镜头运动:", " / ".join(CAMERA_MOTIONS.keys()))
print(" 景别:", " / ".join(SHOT_SIZES.keys()))
print(" 风格:", " / ".join(STYLES.keys()))
print("\n[完成] 提示词工程的核心:用受控词汇把模糊意图转成可复现指令。")
if __name__ == "__main__":
main()
输出:

五、总结
提示词工程不是"玄学调参",而是一套把模糊创意翻译成精确指令的方法论:用六段式结构保证信息密度,用受控词库保证可复现,用分镜工作流保证叙事连贯。当你把这些沉淀成像 veo_prompt_builder.py 这样的工具,团队里每个人都能稳定产出高质量的 Veo 提示词------这才是"创意工作流"真正落地的地方。