ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AI短剧工业化生产:从剧本到成片的完整流水线搭建

AI短剧工业化生产:从剧本到成片的完整流水线搭建 简介面向希望借助AI工具快速创作短剧的开发者与内容创作者这套代码包含用于演示AiPy生成短剧的完整流程覆盖提示词构建剧本大纲、镜头与风格设计、旁白及分镜头视频生成直至最终合成音视频适合无专业编剧背景但想尝试AI影视化制作的用户参考学习。压缩包共3个文件以HTML教程页为主要内容附带inscode项目配置文件与gitignore忽略文件便于在不同环境中快速查看和复用配置整体仅7KB非常轻量。当前已有1084人学习浏览内容被验证为实用。教程内提供具体操作步骤和丰富提示词示例读者不仅能掌握从剧本到成片的完整制作方法还能通过源码理解AI短剧背后的内容生成逻辑与算法包括人物一致性处理、视频编辑和音频合成等关键环节对入门AI内容创作或二次开发具有实际参考价值。 做AI短剧这件事我从去年底开始断断续续折腾了大半年。坦白讲早期用文生视频工具只能产出零星几条“特效片段”真正能串成一部有剧情、有台词、有节奏的短剧靠的是把剧本生成、分镜拆解、角色一致性控制、批量视频合成这些环节串成一条工业流水线。这篇教程把我最终跑通的一套完整流程和源码结构拆给你包含提示词模板、Python脚本、参数配置以及我踩过的真实坑位。适合已经试过AI视频工具、想认真做系列短剧的创作者也适合想用AI做批量内容测试的团队参考。1. 项目概述与整体设计思路1.1 为什么这个时间点做AI短剧短剧本身就是快节奏内容三秒一个钩子、八秒一个反转单镜头时长普遍在3到8秒。而目前主流的文生视频模型单次生成时长集中在5秒到10秒恰好落在短剧镜头的舒适区间内。也就是说模型能力和内容形态天然匹配这不是硬凑出来的玩法。另一个现实是短剧对画面精细度的要求远低于电影和广告片观众更在意的是剧情密度、角色辨识度和情绪节奏。AI生成视频常见的细节崩坏、手指异常、透视不稳等问题在快切镜头下反而容易被忽略。我实测下来只要分镜切得够快、情绪铺垫到位AI画面的瑕疵对观看体验的影响会被压到很低。但这里有一个关键认知AI短剧的难点根本不在“生成画面”而在于“组织画面”。一部60集的竖屏短剧按每集30个镜头算就是1800个镜头。如果靠网页工具一个个手工生成、手工拼接效率低到根本不具备可落地性。所以这个项目从一开始就被我定义成一个工程问题而不是一个创意问题。1.2 五段式工作流从剧本到成片的管线设计我最终跑通的工作流分成五段每一段都有明确的输入输出边界方便单独调试和替换模型剧本生成用大模型产出分集梗概、台词、角色关系并输出结构化字段。分镜拆解把每一场戏拆成“镜头级”脚本包含景别、机位、动作、台词、情绪、时长。角色一致性为每个主要角色生成统一设定描述和参考图并在所有镜头提示词中固定使用。视频生成调用文生视频接口逐镜头生成视频片段。配音合成将TTS配音、背景音乐、音效和字幕通过FFmpeg拼合成成片。这五段里前两段追求的是“结构清晰”让机器能读懂剧本中间两段追求的是“参数统一”保证角色不漂移最后一段追求的是“批量可控”让30集内容能一次性合成而不是一集集手动剪。1.3 为什么必须配源码而不是纯靠网页工具市面上绝大多数讲AI短剧的内容都停留在“用工具点两下”的层面。那种路子做一个短片可以做一部完整的剧不行。原因很简单网页操作无法统一管理几百个镜头的参数很容易出现同一个角色在不同镜头里描述不一致。文生视频接口有频率限制和超时风险纯手工操作时一旦失败就要重新点一遍没有断点续跑能力。后期合成需要按镜头编号精确拼接纯剪辑软件手工对轨一集还能忍三十集就完全失控。所以我把项目落成了一组Python源码把所有环节串联起来。这不是炫技而是内容规模到达一定程度后的唯一选择。源码的意义在于参数可复现、过程可回溯、失败可重试。2. 核心细节解析与实操要点2.1 提示词设计让大模型输出可直接执行的JSON分镜剧本生成阶段最忌讳让大模型自由发挥成一段散文那样后期根本没法加工。我用的方法是给模型定义一个强约束的输出格式让它必须返回JSON数组每个元素包含固定字段。我常用的System Prompt是这样设计的你是一名短剧编剧。请根据以下故事梗概生成一集完整的分镜脚本。 要求 1. 每场戏拆成3-5个镜头每个镜头输出一个JSON对象。 2. 字段必须包含scene场次、shot镜头序号、scale景别、camera机位运动、action角色动作、line台词、emotion情绪、duration预估时长秒。 3. 文本禁止出现解释性文字只输出JSON数组。加上输出格式约束之后大模型返回的内容可以直接被json.loads()解析省去了大量清洗工作。我这里加了response_format{type: json_object}如果你用的API不支持这个参数就在Prompt里反复强调“只输出JSON”。这里有个非常实用的细节景别描述一定要用行业黑话比如“特写”“中景”“过肩”“俯拍”不要用“画面近一点”这种模糊表达。因为后续这些字段会直接拼进生视频提示词里模型对“close-up shot”的理解远好于对“画面近一点”的理解。2.2 角色一致性AI短剧最大的拦路虎角色长相漂移是AI短剧最劝退的问题。同一角色上一集还是圆脸下一集变成方脸观众立刻出戏。我实测下来有三套方案可以解决按成本从低到高排列方案原理成本效果固定描述词固定seed视频模型里角色外观主要由提示词决定seed控制随机性最低中等适合镜头跨度小的情况角色参考图先生成一张标准人设图后续所有视频提示词里引用该图中高能保证五官和服装稳定LoRA微调用角色图片集微调一个专属模型高最高适合量产商业剧我最常用的组合是“固定描述词角色参考图”。具体操作是先用文生图模型生成一张角色正面照固定住发型、发色、服装颜色、配饰这四个核心特征然后把这张图的编码ID或URL写进后续每个视频生成请求里同时在提示词里保持角色描述完全一致。注意事项角色描述词一旦定稿就不要频繁改动每改一次就等于给模型换了一个人物设定。我习惯把每个角色的描述词放在一个characters.json文件里所有脚本统一读取从源头避免“一稿一改”的灾难。2.3 视频生成参数那些必须抠死的细节同样是文生视频接口参数不同出片效果天差地别。我列一份自己常用的参数表你可以直接抄参数推荐值说明分辨率竖屏9:16短剧默认竖屏比例校准为1080x1920或对应模型支持的上限单次时长5秒5秒最容易出高质量片段10秒以上模型容易崩帧率25fps国内视频平台的主流播放帧率运动幅度中低幅度太大容易产生形变和残影负面提示词模糊、变形、多余手指、水印所有生成请求统一追加这里尤其要强调单次时长。目前大多数视频模型的10秒生成效果都不如5秒稳定而且10秒片段一旦某个部分崩了整段都要重新生成。我的策略是所有动作戏、转场戏一律用5秒生成然后用FFmpeg拼接宁可多生成两个镜头也不赌一次生成十秒。2.4 配音和字幕容易被低估的体验关键画面AI化了但如果配音还是机械TTS观众一眼就能感觉出“廉价感”。我前期踩过最大的坑是直接用基础款TTS结果旁白和对话完全分不出层次。后来调整为旁白用男声低音版本女主角用甜美女声反派用略带沙哑的音色每一条音轨单独渲染后再混音。字幕方面我不用剪辑软件手动打字而是让LLM把台词按时间轴切分好生成SRT字幕文件再通过FFmpeg烧录进视频。这一步看似不起眼实际上能把后期时间压缩掉70%。3. 源码结构核心实现3.1 项目目录与职责划分这组源码我按职责拆成了六个模块结构很清晰你可以直接照搬ai_short_drama/ ├── config/ │ ├── settings.py # 全局配置API地址、密钥、默认参数 │ └── characters.json # 角色描述词统一管理 ├── core/ │ ├── script_generator.py # 剧本分镜JSON生成 │ ├── compile_prompts.py # 分镜JSON转视频提示词 │ ├── video_generator.py # 批量调用文生视频接口 │ └── audio_mixer.py # TTS配音与混音 ├── pipeline/ │ ├── batch_generate.py # 批量执行入口支持断点续跑 │ └── render_final.py # FFmpeg合成剪辑 ├── output/ │ ├── scripts/ # 生成的剧本JSON落盘 │ ├── videos/ # 原始视频片段 │ └── final/ # 合成后的成片 └── requirements.txt这个目录不是拍脑袋设计的。config层解决角色一致性和参数统一core层解决各个AI接口的调用细节pipeline层解决流程编排和失败重试output层解决产物管理。每层之间通过文件路径传递数据不用数据库原因是文件日志足够直观出问题一眼能看出是哪一步断了。3.2 剧本生成模块从LLM接口拿到结构化分镜script_generator.py的核心逻辑就是调用大模型接口并对返回结果做健壮性处理。我贴一段简化版import json from openai import OpenAI client OpenAI( api_keysettings.API_KEY, base_urlsettings.API_BASE_URL, ) def generate_script(synopsis: str) - list[dict]: prompt f 你是一名短剧编剧。请根据故事梗概生成一集分镜脚本。 故事梗概{synopsis} 要求只输出JSON数组每项包含 scene, shot, scale, camera, action, line, emotion, duration 字段。 resp client.chat.completions.create( modelsettings.LLM_MODEL, messages[{role: user, content: prompt}], temperature0.7, response_format{type: json_object}, ) raw_text resp.choices[0].message.content.strip() # 从返回文本中提取第一个 [ 到最后一个 ] 之间的内容 start raw_text.find([) end raw_text.rfind(]) 1 shots json.loads(raw_text[start:end]) return shots实际使用中大模型偶尔会在JSON前后夹带注释文字所以我用find/rfind做了截断。另外temperature不能拉太高0.7已经足够太高容易产出不合理的分镜。3.3 分镜转视频提示词从中文脚本到英文视频Prompt不同视频模型对提示词语言的理解能力差异很大我统一用英文拼装因为英文提示词在大部分模型上的表现更稳定。compile_prompts.py负责把中文分镜JSON转换成符合目标模型的英文提示词def compile_video_prompt(character_desc: str, shot: dict) - str: scale_map { 特写: close-up shot, 中景: medium shot, 全景: wide shot, 过肩: over-the-shoulder shot, 俯拍: high-angle shot, } camera_map { 固定: static camera, 推: dolly in, 拉: dolly out, 摇: panning shot, 跟: tracking shot, } scale scale_map.get(shot[scale], medium shot) camera camera_map.get(shot[camera], static camera) action shot[action] emotion shot[emotion] template ( f{character_desc}, {action}, {emotion}, f{scale}, {camera}, cinematic lighting, f9:16 vertical frame, film grain, photorealistic ) return template这个模块是整条流水线里最容易出效果差异的地方。提示词里描述角色时必须放最前面模型会优先关注前置信息镜头语言和光线统一收尾避免干扰主体。3.4 批量生成与断点续跑多镜头生成的稳定性保障批量调用视频接口时最常见的问题就是中途断掉。要么是网络超时要么是API频率限制总之跑两分钟断了就得全部重来。所以我把批量生成做成了“先记录进度、后生成”的模式import json import time from pathlib import Path def run_batch(shots, output_diroutput/videos): manifest_path Path(output_dir) / manifest.json manifest {} if manifest_path.exists(): manifest json.loads(manifest_path.read_text(encodingutf-8)) for index, shot in enumerate(shots): shot_id f{shot[scene]}_{shot[shot]} if shot_id in manifest: continue video_path generate_single_video(shot) manifest[shot_id] { path: str(video_path), status: done, } manifest_path.write_text( json.dumps(manifest, ensure_asciiFalse, indent2), encodingutf-8, ) time.sleep(2) # 控制请求频率避免触发限流这样即使跑到第200个镜头时崩了重启后也会从第201个继续前面生成好的素材不会被浪费。manifest.json文件就是你的工程保险单。3.5 FFmpeg合成批量拼接、加字幕、混音所有镜头生成完毕后用FFmpeg一次性完成拼接、字幕烧录和配音混合。我分享两条用得最多的命令# 1. 按镜头顺序拼接所有视频片段 ffmpeg -f concat -safe 0 -i filelist.txt -c copy merged.mp4 # 2. 烧录ASS字幕并混入配音音轨 ffmpeg -i merged.mp4 -i final_mix.m4a \ -vf asssubtitle.ass -c:v libx264 -preset veryfast \ -c:a aac -shortest final_episode.mp4我习惯先生成一份filelist.txt按第几集第几镜头的顺序排列再执行第一条命令拼接。字幕我不用简单的SRT而是转成ASS后用asssubtitle.ass烧录因为ASS可以统一设置字体、描边和位置竖屏字幕如果不加描边白色字很容易被高光背景吃掉。4. 常见问题与排查技巧实录我把实际跑项目中遇到最高频的问题整理成了一张速查表问题排查思路解决方法同一角色换个镜头就变脸检查是否每次请求都携带同一张参考图角色参考图固定复用描述词严禁改动5秒生成的画面卡在半途播放速度不流畅可能是运动幅度参数太高把运动幅度从high降到medium/low视频带水印或平台Logo检查生成接口的商用权限和默认输出使用官方无水印API别用免费解析站提示词里要求的动作没出现提示词太长时模型会忽略后半段动作描述提前到角色描述之后越靠前越重要字幕和配音对不上台词切分时间轴不准让LLM按“每行不超过10个字”重新切分SRT批量生成跑到一半断掉先查频率限制再看网络超时用manifest.json断点续跑请求间隔至少2秒生成出明显违规内容缺乏审核环节加入关键字过滤规则敏感词自动跳过该镜头这里我要特别强调一个容易忽略的坑AI生成内容的版权和素材合规问题。批量生产时必须确认你用的视频模型API允许商用角色形象尽量不要模仿真实艺人或未授权IP背景音乐要使用可商用曲库。别等成片要上架了才发现素材来源有问题那是整个项目里最麻烦、也最没必要踩的坑。关于角色一致性的排查再补充一个经验如果你用的是文生视频接口但没有显式传入参考图的能力那就退而求其次把角色描述词固定成一段“角色身份证”每次都在提示词最开头完整粘贴不改一个字。实测下来的效果比不写强很多至少发型和服装能稳定住五官漂移概率会大幅下降。5. 最后再分享一个实操习惯最后分享一个我个人的实操习惯每跑完一批镜头我会把提示词、参考图路径、生成结果文件名和参数设置整理成一个HTML报告一集一个页面。这样后续哪条视频出问题我能直接对着报告回溯而不是在一堆文件名里猜。这个习惯帮我省掉了大量重复生成的时间建议你也试试。AI短剧创作的核心竞争力其实并不在于某个模型有多强而是你能不能把模型稳定地组织成一条生产线让每一集都能按同样的标准交付。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进