
国内首部 AIGC 长剧《后西游记》今日开播并且以“边审边播”方式上线。对普通观众来说这是一条“AI 做了一部剧”的新鲜新闻对技术团队来说它真正值得关注的地方在于AIGC 不再只生成单张海报、单段短视频而是进入了需要连续叙事、统一角色、可控质量、可追溯审核的长剧制作链路。本文从工程实现角度梳理一套可以落地的 AIGC 长剧生产流水线覆盖文本分镜、关键帧生成、视频合成、一致性控制、质量治理以及“边审边播”背后的审核状态机和版本管理。如果你正在做 AIGC 短视频、AI 内容平台或者准备进入 AIGC 提示词设计、AI 内容优化相关岗位这套流程可以直接迁移使用。1. 从单张图片到长剧AIGC 生产环节发生了什么变化1.1 AIGC 长剧不只是“视频拼接”AIGC 是 AI Generated Content 的缩写指由大模型生成的文本、图像、音频和视频内容。之前大家更熟悉的是 AIGC 生成一张图或者利用文本模型生成一段文案但“长剧”这两个字改变了问题的复杂度。通俗地说一张图片生成失败可以重新抽卡一个短视频生成崩了也可以重来但一部长剧要求在几十个镜头、几个连续剧集里主角始终是同一张脸道具始终是同一个造型背景里的山、云、光照风格也不能前后冲突。观众可以容忍一个镜头里有轻微瑕疵但很难容忍主角在第 5 分钟和第 6 分钟变成了完全不同的两个人。从技术定义来看AIGC 长剧是一套在多维一致性约束下完成内容生成与交付的多模态流水线。它不只依赖单个生成模型还依赖任务编排、资产库、提示工程、视频后处理、质量审核和版本管理。一个常见的误解是只要接入一个视频生成模型输入一段提示词就能得到一集剧。实际项目中模型输出只是半成品它只是流水线中间的一环。视频生成模型擅长生成有视觉冲击力的片段但对剧情连续性的记忆能力有限需要外部系统把角色设定、场景设定、镜头参数、前后文关系作为约束重新注入。所以AIGC 长剧真正要解决的不是“生成”问题而是“生成出来之后内容如何被管理和持续修正”的问题。1.2 长剧生产流水线包含哪些节点可以把一条 AIGC 长剧生产线拆成下面这些节点。阶段输入输出关键工具/模型需要关注点剧本与分镜剧情梗概、人物关系场次列表、分镜表、对白文本生成模型、提示工程行文结构、叙事逻辑、镜头拆分角色与场景资产人物描述、场景关键词角色一致性模型、场景底图LoRA、IP-Adapter、超分工具角色五官、服装、道具、场景风格统一关键帧生成分镜文本、设定图一批关键帧图片Stable Diffusion / 商业绘图模型构图、景别、光线、负面提示视频生成关键帧、运动描述短视频片段图生视频/视频生成模型运动幅度、闪烁、时长、帧率配音与对白台本、演员音色语音文件TTS 引擎、声音克隆音色稳定、语气、停顿、口型辅助字幕与合成对白文本、时间轴字幕文件、剪辑时间线ffmpeg、剪辑工具错字、时间轴偏移、音画同步质检与审核生成片段、元数据审核结论、修改意见机审模型、人工审核后台合规性、AIGC 痕迹、质量评分发布与分发成片、封面、推荐语线上播放链接媒资系统、播放器状态流转、转码、回滚表格中每一行在真实工程里都可能对应独立的微服务和任务队列。不要把表格理解成“每个阶段用一个开源脚本跑完”它是流程骨架。真正的生产系统需要把每个节点串起来并记录所有中间产物。1.3 学习环境和生产环境的区别如果只是自己尝试 AIGC可以在一台带 NVIDIA GPU 的开发机上跑通上面的流程。生产环境则完全不同。生产环境至少要做四件事任务异步化、容错重试、素材版本化和审核可追溯。学习环境可以这样做直接在前台同步生成生成失败就重新运行。生产环境则是提交一个分镜任务到队列后台多台 GPU 机器消费任务某个节点失败后自动重试生成完毕写入对象存储同时把素材元数据记录到数据库然后进入审核流程。这个差异最终决定了架构设计。接下来的最小闭环示例会保留生产环境的骨架但把细节简化到可以在本地运行。2. 搭建一个可运行的 AIGC 生成流水线最小闭环2.1 环境与依赖选择假设你使用 Python 3.10 以上版本。建议在一个新的虚拟环境里安装依赖避免把全局环境弄乱。python -m venv aigc-longdrama source aigc-longdrama/bin/activate pip install openai diffusers transformers accelerate safetensors ffmpeg-python这里需要说明OpenAI SDK 用于调用兼容 OpenAI 接口的文本生成模型来产出分镜元数据。diffusers 用于加载开源图像生成模型。ffmpeg-python 只是 Python 封装最终合成视频仍然依赖系统安装的 ffmpeg。在 Ubuntu 上可以执行sudo apt install ffmpeg。依赖版本在实际项目里会变化落地时先固定 diffusers 和 transformers 的版本再评估升级不要直接安装最新版因为最新版可能破坏已有调用方式。组件用途备注openai调用文本模型生成分镜 JSON可对接兼容端点diffusers加载扩散模型生成图像需要 PyTorch 和 CUDAtransformers加载 tokenizer、文本编码器与 diffusers 联动ffmpeg图片序列转视频、音量归一系统命令行工具accelerate多 GPU/半精度推理简化分布式调用2.2 先生成结构化分镜 JSON长剧生产流水线里文本模型不直接生成最终画面而是先输出分镜元数据。这样后面的图像模型知道每个镜头拍什么后续审核系统也知道每个镜头对应哪段文本。下面这段代码读取一段剧情摘要返回 JSON 格式的分镜列表。import json from openai import OpenAI client OpenAI( api_keyYOUR_API_KEY, base_urlYOUR_LLM_ENDPOINT ) def build_shot_plan(synopsis: str, shot_count: int 6) - list[dict]: prompt f 你是一名影视分镜师。请根据剧情摘要输出 {shot_count} 个镜头。 每个镜头必须包含以下字段 scene_id: 场景编号 shot_id: 镜头编号 subject: 主体角色或物体 action: 动作描述 environment: 环境描述 camera: 景别和运动方式 duration: 镜头时长单位秒 dialogue: 对白若无则填空字符串 style_ref: 风格参考词比如水墨、写实、赛博 negative: 不希望出现的元素 seed: 随机种子整数 只输出 JSON 数组不要输出解释。 剧情摘要 {synopsis} response client.chat.completions.create( modelyour-model-name, messages[{role: user, content: prompt}], temperature0.4, top_p0.9, max_tokens2000 ) content response.choices[0].message.content # 生产环境要处理模型返回内容不完整或包含代码块的情况 if content.startswith(): content content.strip() if content.startswith(json): content content[4:] return json.loads(content) if __name__ __main__: synopsis 孙悟空在花果山遇见将来要取经的唐僧先试探后收徒。 shots build_shot_plan(synopsis, shot_count4) print(json.dumps(shots, ensure_asciiFalse, indent2))这段代码的关键点有三个。第一使用temperature0.4而不是 0 或 1太低会导致模式固化太高会导致镜头描述不稳定。第二在提示词里明确要求 JSON 字段和类型避免解析失败。第三对返回内容做一次去掉 markdown 代码块的容错处理因为很多模型会在 JSON 外层自动套 json 代码块。运行后预期输出类似这样[ { scene_id: S01, shot_id: S01-001, subject: 孙悟空, action: 站在山岩石上眺望远方, environment: 花果山瀑布云雾, camera: 中景缓缓推进, duration: 3.0, dialogue: , style_ref: 水墨写实高饱和度, negative: 现代建筑电线现代服饰, seed: 42 } ]这个 JSON 是整条流水线的元数据锚点。后面每个环节都围绕它展开。这个做法特别适合长剧它会强迫前期把叙事拆碎后续即使某一镜头生成失败也不需要重新生成整集。注意分镜 JSON 里的字段一旦确定尽量保持向后兼容。后期接入新模型时只新增字段不要删除已有字段否则历史版本无法回放。2.3 从分镜到关键帧批量生成拿到分镜 JSON 后使用图像生成模型批量绘制关键帧。import json import torch from diffusers import StableDiffusionXLPipeline def load_pipeline(model_id: str stabilityai/stable-diffusion-xl-base-1.0): pipe StableDiffusionXLPipeline.from_pretrained( model_id, torch_dtypetorch.float16, variantfp16 ) pipe pipe.to(cuda) return pipe def generate_keyframes(pipe, shots: list[dict], output_dir: str frames): import os os.makedirs(output_dir, exist_okTrue) for shot in shots: positive_prompt ( f{shot[subject]}, {shot[action]}, {shot[environment]}, f{shot[camera]}, {shot[style_ref]} ) negative_prompt f{shot.get(negative, )}, lowres, watermark, deformed, blurry generator torch.Generator(devicecuda).manual_seed(shot[seed]) image pipe( promptpositive_prompt, negative_promptnegative_prompt, num_inference_steps30, guidance_scale7.5, width1280, height720, generatorgenerator, ).images[0] image.save(f{output_dir}/{shot[shot_id]}.png)seed这里被刻意从分镜 JSON 传到图像模型。在长剧生产中如果某一帧画面不满意固定其他参数只调整提示词或参考图可以更稳定地控制变化。没有固定 seed生成结果难以比对也很难定位问题。生成关键帧时常见的报错是 GPU 内存不足。可以先降到 1024x576或者把num_inference_steps从 30 降到 20。这不是直接牺牲质量而是先验证流程流程跑通后再提高分辨率。2.4 用 ffmpeg 把关键帧合成片段关键帧不是最终视频。先用一组关键帧合成 MP4可以提前验证镜头顺序、剪辑节奏和配色问题。这里使用 concat demuxer按明确文件顺序排列。cat frames.txt EOF file frames/S01-001.png file frames/S01-002.png file frames/S01-003.png file frames/S01-004.png EOF ffmpeg -f concat -safe 0 -i frames.txt -vf fps1,scale1280:720 -c:v libx264 -pix_fmt yuv420p preview.mp4真正的 AIGC 长剧中每个镜头会由图生视频模型生成运动。但先用静态帧合成一遍成本低、速度快能提前暴露分镜顺序错误和风格不统一问题。注意这个命令只是预览不要把它当作成片发布。3. 人物一致性与内容质感控制 AIGC 的“高级机械感”3.1 长剧的“一致性”四种类型及解决思路长视频生成最棘手的问题是“一致性”不统一。把一致性拆开常见有四类。类型失败现象常用手段适用场景角色外观脸部每次生成不同LoRA 微调角色特征IP-Adapter 引用参考图固定 seed主要角色服饰与道具衣服颜色飘忽不定角色设定图作为参考提示词绑定关键词重要道具、服装场景环境建筑物结构变化ControlNet 深度图或线稿约束使用同一底图修图固定场景叙事逻辑前后情节矛盾分镜 JSON 统一管理反推或对比文本摘要整剧