小说到短剧的工程难点,几乎从不发生在“生成”这一步。把一个章节丢给模型,它总能写出看起来像剧本的东西。真正让流水线卡住、让返工反复发生的,是改编即压缩所带来的结构性丢失:72 万字的小说在短剧中要被浓缩到几对戏剧关系,灶房烧火、月下煮茶这类酝酿温情的闲笔必须被砍掉。压缩本身不是问题,问题是压缩的规则散落在编剧的直觉里,而直觉无法被下一集复用,也无法被另一个 Agent 审计。Dramake 的 SKILL.md 之所以把“剧情、身份、物理和声音检查”写在生成之前,正是因为改编的边界如果不先于生成存在,生成的结果就无法被判定对错。
小说文本与视频生成之间,需要一个比“剧本”更硬、比“提示词”更可检查的中间层。阿里云流水线的做法是先把 markdown 分镜解析为结构化 JSON,后续批量生图和生视频脚本直接读取这份配置,而不是让人反复复制提示词。这个 JSON 的字段设计本身就是改编契约:shot_id、frame_type、action_prompt、dialogue、camera、atmosphere、duration 共同声明了“这一镜要生成什么、生成到什么程度算完成”。以下解析器是这一层的可运行骨架,它的价值不在于正则本身,而在于把非结构化的分镜文本强制收束为后续节点只能按字段消费的对象:
import json, re
PATTERN = re.compile(
r"镜头(\d+)|(.+?)|(.+?)|台词:(.+?)|运镜:(.+?)|氛围:(.+)"
)
def parse_script(script_text: str) -> list[dict]:
shots = []
for line in script_text.splitlines():
m = PATTERN.match(line.strip())
if not m:
continue
sid, frame, action, line_, camera, atmosphere = m.groups()
shots.append({
"shot_id": int(sid),
"frame_type": frame, # 景别:中景/近景/特写
"action_prompt": action, # 画面与动作描述
"dialogue": line_, # 台词,受字数门禁约束
"camera": camera, # 运镜:固定/缓慢微推等
"atmosphere": atmosphere,
"duration": 4, # 默认单镜时长,可被上游覆盖
"width": 720, "height": 1280, # 竖屏契约
})
return shotsparse_script 不负责判断分镜写得好不好,它只负责把“写得好不好”变成下游可检查的字段。台词单句超过 25 字、爽点间隔超过 3 集、钩子缺失,这些规则在 Dramake 和短剧工厂 Skill 中都是以机检清单的形式存在的,而不是留给模型“自觉”。没有这一层结构化,下一节的角色锁定就无从谈起——因为模型无法在一个非结构化的文本里判断“这一镜的角色”和“上一镜的角色”是不是同一个人。
短剧集一集十几个镜头,主角配角来回切。早期只写“女孩站在店门口”,不同镜头模型各自发挥,出来的脸一个样一个样,整批素材作废重出。根因不是模型画得不够好,而是提示词里缺少一个跨镜头稳定的身份标识。WorkBuddy 的解法是把编号拆成两套:出场顺序编号(主体1、主体2……)等于图片列表的索引,决定这一镜谁在前谁在后;全剧固定 ID(S1、S9……)是角色贯穿全剧的唯一身份证,每个固定 ID 配一张锚定图,进分镜必挂。两套编号同时出现在提示词里,模型才不会把“这一镜的女孩”和“上一镜的女孩”当成两个人。
以下构造器把双编号和锚定图绑定为强制字段,缺少 anchor_ref 的镜头直接拒绝进入生成队列:
def build_shot_prompt(shot: dict, cast: dict) -> str:
"""
shot 至少包含:order_index, fixed_id, action_prompt
cast[fixed_id] 至少包含:anchor_ref, visual_desc
"""
fid = shot["fixed_id"]
if fid not in cast or not cast[fid].get("anchor_ref"):
raise PermissionError(
f"角色 {fid} 缺少锚定图,禁止生成。先补齐 cast 中的 anchor_ref。"
)
c = cast[fid]
return (
f"主体{shot['order_index']}(出场顺序):{c['visual_desc']},"
f"站在{shot.get('scene', '')}。\n"
f"{fid}(全剧固定ID):{c['visual_desc']},参考锚定图 {c['anchor_ref']}。\n"
f"镜头:{shot.get('camera', '中景')},{shot['action_prompt']}"
)anchor_ref 是一个硬约束,而不是“建议挂载”。在 ComfyUI 侧,IP-Adapter 的权重需要控制在 0.6–0.75 之间:太高会压制画风,太低锁脸失效。这意味着一致性是参数契约,不是“调出感觉”的经验活动。双编号解决的是语义身份,IP-Adapter 权重解决的是像素级身份,两者缺一不可。
从小说到短剧的链路一旦进入发布环节,就受到明确的监管约束。自 2026 年 4 月 1 日起,AI 漫剧正式纳入网络微短剧监管体系,实行“先备案、后上线”,未履行备案程序的存量作品会被全网强制下架。《微短剧发展管理办法》进一步要求 AI 参与制作的微短剧在每集明显位置添加提示标识。这意味着合规不是内容完成之后的外挂步骤,而是生成流水线在输出前必须满足的前置条件。一个可执行的放行门禁至少应覆盖三项:备案号是否存在、每集显著位置是否已嵌入 AI 提示标识、AI 素材的版权核验是否完成。以下函数把这三项写成机械判定,未通过的成片不进入发布队列:
def compliance_gate(episode: dict) -> list[str]:
errors = []
if not episode.get("filing_no"):
errors.append("MISSING_FILING: 无备案号,禁止上线")
if not episode.get("aigc_label_embedded"):
errors.append("MISSING_AIGC_LABEL: 每集显著位置未嵌入 AI 提示标识")
if not episode.get("assets_rights_cleared"):
errors.append("RIGHTS_UNCLEARED: AI 素材版权未核验")
return errors
if errors := compliance_gate(ep):
raise PermissionError(f"合规门禁未通过:{errors}")资产台账的缺失是另一个容易被低估的工程问题。当项目并行、外包和渠道合作方介入之后,“最终版”“修改版”混杂存储,成片交付后需要修改字幕时经常调取旧版本工程,造成重复渲染返工。五大资产域的划分——策划脚本、原始素材、工程源文件、成片输出、投放运维——本质上是在为每一次生成和每一次修改建立可回溯的基线,让短剧不是“一次性的效率”,而是可复用、可审计的生产资产。腾讯云山海的 Harness 体系同样把资产层和审校反馈层作为独立架构层,强调“Skill 不是 Prompt”,方法必须被封装为系统可调用的能力,而不是停留在个人经验里。
从小说到短剧的工程成熟度,最终不以“生成片段看起来像不像”来衡量,而以三件事是否同时成立来衡量:改编被压缩为结构化分镜 JSON,使后续节点只能按字段消费;角色身份由双编号和锚定图强制绑定,缺少锚定图的镜头被代码拒绝;备案、标识和资产台账作为放行条件先于发布生效。当这三条边界都由代码持有、模型无法绕过时,小说到短剧才从一次灵感驱动的改编,变成一条可以被审计、被复用、被继续推进的生产链路。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。