
简介AI短剧创作教程源码包面向短视频创作者与AI工具开发者演示了利用AiPy工具完成短剧自动化生成的完整流程先通过提示词明确故事主题、镜头设计与风格要求再生成剧本、旁白和分镜头视频并借助工具保证人物一致性最终合成音视频成片。整套资源包含3个文件HTML教程页梳理了每一步操作与提示词示例inscode配置文件和.gitignore为代码环境提供支撑压缩包仅7KB轻量且便于直接查看学习。目前已有1247人学习适合零基础尝试AI短剧的用户也适合希望研究AI内容生成落地逻辑的开发者。通过源码不仅能快速复现一键成剧的创作流程还能理解剧本拆解、镜头连贯性控制、音视频合成等环节的具体实现思路为自主搭建或二次开发同类工具提供参考。1. AI短剧创作教程[源码]不懂拍摄的人怎么把短剧产能跑起来“AI短剧创作教程[源码]”这个标题看着像又一份收割好奇心的课程包但真正在短视频投流圈里跑过一轮的人会明白它背后是一条已经能算清账的生产方式一个人不会拍、不会剪、不会写剧本用大模型批量生成脚本用视频生成模型出画面再用自动化剪辑拼成一条60到90秒的竖屏短剧。周期从传统实拍的两周压到两天单条素材成本从几万元压到几十元量级。这个方向适合三类人想做短剧但没团队没设备的编导、被重复剪辑压垮的后期、需要批量测投流素材的运营。难点从来不是“AI能不能用”而是流程怎么拆、参数怎么设、源码里的脚本怎么改成自己的东西。这篇就把完整落地路径讲透。2. 用大模型批量生成短剧剧本提示词模板与落地代码2.1 短剧剧本和传统剧本不一样先理解它的三个硬约束短剧剧本不是给演员看的是给算法和观众一起看的。传统剧本讲起承转合短剧只讲三件事前三秒抓人、中段给反转、结尾留付费卡点。大模型默认写故事的能力太“正”你不约束它它就会给你一份三幕剧结构的小说而不是短剧脚本。第一个硬约束是黄金三秒。观众刷到视频的瞬间画面信息密度和第一句台词决定了是否划走。所以剧本第一句必须是冲突或悬念不能是“阳光明媚的早晨林晚晴坐在窗前”。第二个硬约束是付费卡点。短剧通常在15到25秒之间设置第一次付费卡点直播间投放的短剧素材更短卡点往往在14到18秒。这意味着脚本必须在第14秒左右把主角逼到绝境然后戛然而止。第三个硬约束是角色池极小。一条测试素材通常只有两到三个角色AI很容易在生成过程中新造角色名导致续集永远接不上。理解这三个约束之后提示词就不是简单一句话了而是把约束格式化。我发现最好用的办法是让模型直接输出JSON结构把台词的场景、时间区间、角色名全部结构化这样剧本生成完可以直接喂给后面的分镜和视频生成环节不需要人肉二次整理。这也是标题里“源码”二字的真正价值把创作经验变成可复用的代码。2.2 把创作经验转成提示词模板角色锁定与输出约束写提示词之前先做一件小事定人设表。我一般会在项目根目录放一个persona.json里面写死主角姓名、年龄、性格、口头禅、服装特征。短剧里角色一致性比文笔重要得多。AI一旦被允许新造角色画面一致性就直接崩了。示例{ personas: [ {name: 苏晴, age: 28, personality: 隐忍但倔强, costume: 白色连衣裙, trait: 说话轻声细语关键句会停顿}, {name: 周沉, age: 32, personality: 冷酷资本家, costume: 黑色西装, trait: 台词短压迫感强} ] }提示词模板里直接引用这个人设表并明确告诉模型“只能使用该表内角色”。模板我会写成这样你是短剧编剧。根据题材「{topic}」和立意「{premise}」写一部时长约75秒的竖屏短剧脚本。 要求 1. 第1句台词必须抛出冲突或悬念禁止场景描写开头。 2. 在第14到18秒设置第一次反转把主角处境彻底改变。 3. 结尾停在最想让人付费的卡点上不展开结局。 4. 只能使用给定人设表里的角色禁止新造角色。 5. 输出合法JSONschema如下 {title: 标题, acts: [{act: 1, time: 0-15s, scene: 场景, dialogue: [{char: 角色名, line: 台词}]}]}这个模板看起来简单但里面每一个约束都在和模型的本能对抗。禁止场景描写开头否则模型一定会给你来一段环境描写限定反转时间否则剧情会平均用力限定JSON否则后续流程没法自动化。2.3 批量生成脚本的最小Python脚本可直接替换模型与接口如果只是生成一条剧本网页对话框就够了。但做投流素材的核心是批量同题材换立意、同立意换反转、同反转换台词一次要几十条。我一般用一个兼容OpenAI接口的SDK脚本批量跑代码里只依赖openai库模型名和接口地址都留成变量想换哪个模型就换哪个。import json import time from openai import OpenAI client OpenAI( base_url你的兼容接口地址, api_key你的密钥 ) PERSONAS json.load(open(persona.json, encodingutf-8)) def gen_script(topic, premise, seed): prompt f你是短剧编剧。根据题材「{topic}」和立意「{premise}」写一部时长约75秒的竖屏短剧脚本。 要求 1. 第1句台词必须抛出冲突或悬念禁止场景描写开头。 2. 在第14到18秒设置第一次反转把主角处境彻底改变。 3. 结尾停在最想让人付费的卡点上不展开结局。 4. 只能使用给定人设表里的角色禁止新造角色。 5. 输出合法JSONschema如下 {{title: 标题, acts: [{{act: 1, time: 0-15s, scene: 场景, dialogue: [{{char: 角色名, line: 台词}}]}}]}} 人设表 {json.dumps(PERSONAS, ensure_asciiFalse)} resp client.chat.completions.create( model你的模型名, messages[ {role: system, content: 你只输出合法JSON不要输出任何解释。}, {role: user, content: prompt} ], temperature0.7, max_tokens2500, seedseed ) raw resp.choices[0].message.content # 部分模型返回代码围栏剥掉之后再解析 raw raw.strip().removeprefix(json).removeprefix().removesuffix() return json.loads(raw) ideas [ (都市情感, 被赶出家门的妻子发现结婚证是假的), (逆袭复仇, 被同事陷害的设计师拿到了行业最高奖), (战神归来, 退役兵王发现女儿住的医院被收购), ] for idx, (topic, premise) in enumerate(ideas): script gen_script(topic, premise, seed1000 idx) out fscripts/{idx:02d}_{topic}.json with open(out, w, encodingutf-8) as f: json.dump(script, f, ensure_asciiFalse, indent2) print(f[OK] {out}) time.sleep(1)这里有两个参数值得单独说。temperature0.7是给创意留空间如果你发现剧本套路感太重往下降到0.5反转点会更稳定如果台词变得干瘪往上升到0.9。seed在兼容接口上有玄学成分支持seed的模型会稳定复现场景不支持的模型忽略该参数所以我把seed设计成随想法序号变化而不同而不是全部用同一个固定值这样同题材不同批次之间的剧本不会高度雷同。2.4 批量生成后必做的一次校验把JSON当数据检查大模型生成JSON不可能百分百合法。我见过最多的三种问题台词里出现未定义角色名、总时长超过90秒、acts只有两幕导致反转点缺失。所以源码工程里一定要有一个validate_scripts.py把生成目录里所有剧本当作数据处理一遍而不是用人眼通读。import glob import json import re PERSONA_NAMES {p[name] for p in json.load(open(persona.json, encodingutf-8))[personas]} def parse_time(t): nums list(map(int, re.findall(r\d, t))) return nums[0], nums[1] for path in sorted(glob.glob(scripts/*.json)): s json.load(open(path, encodingutf-8)) errs [] duration 0 for act in s.get(acts, []): start, end parse_time(act[time]) duration max(duration, end) for d in act[dialogue]: if d[char] not in PERSONA_NAMES: errs.append(f未定义角色: {d[char]}) if not 60 duration 90: errs.append(f时长异常: {duration}s) if len(s[acts]) 3: errs.append(分幕少于3段反转点可能缺失) if errs: print(f[FAIL] {path}) for e in errs: print( , e) else: print(f[PASS] {path})这个脚本的价值不是检查语法而是把“剧本创作经验”沉淀成机器可执行的规则。适合短剧的AI编程提示词本质就是把审核标准前置到生成阶段。3. 从脚本到画面视频生成模型选型与三个必调参数3.1 三条路线选哪条文生视频、图生视频、数字人拿到剧本JSON之后下一步是把每一幕变成画面。选视频生成方案之前先明确一个前提没有任何一款模型能一次生成一条完整短剧所有成片都是多镜头拼接。所以你需要的是“能稳定生成单个镜头”的工具而不是一个想象中的全能视频大模型。三条路线各有分工。文生视频适合空镜、转场和氛围镜头比如“雨夜的城市天桥”它不需要人物一致性反而擅长铺环境。图生视频是短剧主力适合有人物的对话戏你提供一张角色参考图模型让画面动起来人物长相和服装能保持统一。数字人方案适合口播剧情或者大段对白表情自然但动作范围小不适合动作戏。我的选型经验是一部短剧混用三条路线。角色对话用图生视频场景过渡用文生视频片头片尾用数字人口播。不要期望一条模型通吃全片拼素材本来就是短剧生产的常态。3.2 三个必调参数运动幅度、提示词相关度、固定seed视频生成模型的黑匣子程度比大模型高得多但它对外暴露的关键参数其实就几个调好它们出片成功率能翻倍。第一个是运动幅度。多数图生视频模型用类似motion或speed的字段控制画面动态强度。短剧对话戏通常不需要大动作幅度调到0.4到0.6就够面部表情自然动作戏或反转戏需要冲击力调到0.7到0.8。不建议超过0.8画面扭曲率会随动作幅度非线性上涨手部、脸部首当其冲。第二个是提示词相关度也就是俗称的scale或guidance scale。它控制画面服从提示词的程度。经验值在5到8之间。人物特写镜头要严格服从服装、表情描述风格化后期另说。如果生成结果里背景频繁闪烁或物体形态漂移先提高相关度而不是换提示词。很多新手把画面不清晰归咎于模型其实是指标没调到位。第三个就是那个有点玄学的seed。固定seed能让画风、构图在多次生成之间保持相对一致。对图生视频而言同一个seed配合同一张参考图输出的人物面孔能保持很高的相似度。批量生成素材时留意这个参数能少掉一多半的后期返工。3.3 一个批量生成分镜描述的小函数把剧本变成每镜头的prompt剧本JSON里的acts是叙事段落不是分镜。需要一个转换脚本把每一幕拆成“镜头描述 角色状态 画面风格”再传入视频生成接口。这个小函数是源码工程里最不起眼但最实用的部分。import json import csv def build_shot_prompts(script_path): script json.load(open(script_path, encodingutf-8)) rows [] for act in script[acts]: scene_text act[scene] dialogue_summary .join(d[line] for d in act[dialogue][:2]) prompt ( f竖屏电影感光线{scene_text}。 f角色保持人设表服装表情与台词情绪一致。 f当前台词{dialogue_summary}。 f镜头缓慢推近人文质感电影调色。 ) rows.append({ act: act[act], time: act[time], prompt: prompt, negative_prompt: 字幕, 水印, 变形, 多余手指, 模糊, 低分辨率, motion: 0.5, seed: 2000 act[act] }) return rows with open(scripts/00_都市情感.json, encodingutf-8) as f: shots build_shot_prompts(f.name) with open(shots.csv, w, newline, encodingutf-8) as f: w csv.DictWriter(f, fieldnames[act, time, prompt, negative_prompt, motion, seed]) w.writeheader() w.writerows(shots)这段代码的逻辑核心是“不重新发明画面而是从剧本里对齐画面”。提示词里的场景、台词都是直接从剧本带过来的确保分镜不脱离剧情。我见过不少源码工程在分镜这一步单独让模型重新发挥结果画面和台词对不上这是最隐蔽的一类坑。negative_prompt里必须带上“字幕、水印、变形、多余手指”视频生成模型对文字和手部的渲染缺陷至今没有完全解决。3.4 镜头一致性为什么频频翻车参考图比提示词可靠不少人花大量精力堆提示词描述角色长相结果角色换个机位就换了一张脸。血泪经验是提示词写“左眼角有颗痣”这种细节完全没用图生视频模型对人的面部特征编码能力有限。正确做法是给每个角色建独立的参考图目录每个镜头都以该角色的正脸图为输入。实际操作中我把角色参考图统一裁剪成竖屏构图配合固定seed一起传入生成接口。生成完成后不要马上拼接先抽帧看两个关键位置角色面部和手部。面部崩了就换seed重生成手部崩了就降低motion再试。这几个位置出问题几乎是必然的真正可控的是你是否在批量生成前就设好检查环节而不是等拼完片再痛苦返工。4. 从画面到成片ffmpeg 自动化剪辑与字幕配音流水线4.1 源码工程的目录结构各环节产物的组织方式一个能跑的AI短剧源码工程目录结构通常是流水线的映射。拿到手先看布局别急着跑脚本。典型的组织方式如下表目录/文件作用scripts/剧本JSON、分镜描述CSVpersonas/各角色参考图segments/视频生成模型产出的单个镜头片段audio/按角色拆分后的TTS配音output/合成完成的成片pipeline.py串联全部环节的主控脚本这个结构把生成、配音、剪辑拆成了独立缓冲池任何一步失败都不需要推倒重来。优化可以逐段重跑这是AI创作流水线能落地的前提。4.2 画面对齐脚本用ffmpeg统一转码再拼接绕过黑屏跳帧拿到一批视频片段后最容易犯的错误就是直接拼接。不同视频生成接口输出的编码格式、分辨率、帧率、音频通道数各不相同直接concat会导致中间出现黑屏、音画不同步甚至整个输出文件损坏。我的固定做法是先统一转码再使用concat解复用器拼接。#!/usr/bin/env bash set -euo pipefail rm -f list.txt segments_all/*.mp4 # 第一步统一转码为 H.264 yuv420p 30fps for f in segments/*.mp4; do ffmpeg -y -i $f \ -vf scale1080:1920,fps30,formatyuv420p \ -c:v libx264 -preset veryfast -crf 20 -an \ segments_all/$(basename $f) done # 第二步用 concat demuxer 顺序拼接 for f in segments_all/*.mp4; do printf file %s\n $f list.txt done ffmpeg -y -f concat -safe 0 -i list.txt -c copy output/concat.mp4-an这一步很多人看不懂。视频生成模型产出的片段通常没有可用音频即使有也大概率是环境音噪声后面要统一替换为配音所以转码时直接丢弃原音轨可以避免拼接时音频轨混乱。crf 20是画质与体积的平衡点再高画质会损失再低体积会膨胀。4.3 字幕生成别直接用ASR识别文本用剧本原文替换字幕是短剧里绝对不能省的一环但直接用ASR语音识别的文本做字幕会出大问题。ASR对短剧台词里的专有名词、人名、情绪化口语识别极差“苏晴”被识别成“苏清”“周沉”被识别成“轴沉”字幕错字在投流审核里几乎是必挂点。我的方案是用ASR做时间轴对齐用剧本JSON原文做文本内容。先让ASR识别出每句话在视频里的起止时间再拿这个时间窗口去匹配剧本原文。台词总是那一句所以不需要语义级匹配简单的相似度对齐就够了。import json from difflib import SequenceMatcher def align_subtitles(script_path, asr_segments): script json.load(open(script_path, encodingutf-8)) lines [] for act in script[acts]: lines.extend(d[line] for d in act[dialogue]) subs [] idx 0 for seg in asr_segments: if idx len(lines): break # 用文本相似度确认ASR片段对应哪句原文 best max(lines, keylambda l: SequenceMatcher(None, seg[text], l).ratio()) subs.append({ start: seg[start], end: seg[end], text: best }) idx 1 return subs这是一个简化版但思路已经体现ASR只提供时间戳文本以原稿为准。生成ASS字幕时还要注意字幕断句每行不超过12个汉字过长会影响完播率。这一步在源码工程里通常对应subtitle.py跑完会输出一个.ass文件和subs.srt。4.4 TTS配音与口型先出音频再按音长微调画面配音顺序是整个流水线里争议最大的点。先配音还是先剪画面都会遇到问题我的习惯是“先粗剪画面再配音最后微调画面”。粗剪稳定了叙事结构配音带上了真实时长微调只需要把镜头切换点挪到音轨间隙上。TTS方案在短剧场景里推荐本地部署的开源方案按角色拆分配置。配音有个容易被忽略的参数情绪。短剧台词的情绪浓度比新闻配音高很多所以我会在台词文本前加上情绪标签比如“低声隐忍地说”“突然爆发”TTS模型对这些标签敏感度极高。批量生成音频时逐角色逐句合成避免把整幕台词合成一个长音频否则后续微调会非常痛苦。4.5 多AI协作的主控编排让Agent管理环节而不是人肉切换到了这一步你会发现自己其实在充当主编排Agent跑剧本脚本、导出分镜、喂给视频生成、等异步回调、再跑ffmpeg、再检查字幕。这就是所谓多AI协作的落地形态——剧本模型、分镜模型、视频生成模型、配音模型各司其职由一个主控脚本来调度。源码工程里的pipeline.py通常就是一个完整的Agent流程编排核心逻辑是每个环节独立失败重试而不是全部串在一条长链路里。def run_pipeline(script_path): shots build_shot_prompts(script_path) for shot in shots: clip_path generate_video(shot) # 视频生成接口回调 if not clip_path: continue # 失败重试由外层循环控制 merge_clips() # ffmpeg 拼接 generate_subtitles() # 字幕与其他 synthesize_voices() # TTS 合成 mux_final() # 封装输出编排层面最重要的原则是容错。视频生成接口的失败率远高于大模型文本接口主控脚本必须支持断点续跑即已生成的片段直接复用不要从头开始重跑。彻底贯彻这个思路之后一次批量生成10条素材人要做的事就只剩看结果和替换坏片。5. AI短剧源码落地最容易翻车的 5 个坑现象、原因与解决5.1 角色长相前后判若两人镜头接不上现象同一条短剧里同一个角色第1幕和第3幕的面孔明显不同观众在评论区直接指出“换人了吧”。原因图生视频的输入参考图不一致。很多新手生成第1个镜头时用的是一张清纯正面照第2个镜头随手换了张带滤镜的侧脸照模型把滤镜风格误认为角色特征。此外没有固定seed也是帮凶。解决每个角色只保留一张经过裁剪统一的正脸参考图所有该角色镜头都以这张图为输入。批量生成时固定seed后续对比角色是否一致时抽帧并排查看五官轮廓。不要依赖提示词补描述参考图才是唯一的角色锚点。5.2 批量拼接后黑屏跳帧成片没法过审现象ffmpeg拼完的视频在某一幕结束后黑屏2秒或者画面突然卡顿一下投流审核直接判为低质素材。原因原始片段编码参数不统一。不同视频生成接口输出的帧率、分辨率、编码色度抽样各不相同直接concat时解码器切换导致画面异常。解决先把所有片段统一规整为1080x1920、fps30、yuv420p编码统一为H.264再走concat流程。不要图省事直接-c copy拼接未经转码的文件。转码这一步时间成本十几秒但返工成本是一小时。5.3 字幕文本与台词对不上审核和完播同时崩现象成片字幕里人名和专有名词错漏“苏晴”写成“苏清”台词语义完全对不上审核判为字幕不规范观众也觉得制作粗糙。原因直接使用了ASR识别结果作为字幕。短剧台词依赖语境和人物设定ASR本身就是受损压缩它给出的文本是“它听到的”不是“我们写下的”。解决坚持“ASR只给时间轴字幕文本用剧本原文”的原则。用相似度匹配把ASR时间戳对应到JSON台词再生成字幕。跑字幕脚本时留意专有名词命中率理想状态是字幕文件里出现的人名全部来自人设表。5.4 同题材批量生成脚本千篇一律连续投放后跑不出量现象用同一个提示词模板跑出来的20条剧本人物名字不同但冲突套路、反转点、台词语气几乎一模一样。素材铺量之后没有一条能跑出质量分。原因模板过于严格导致的“约束过拟合”。固定了场景、固定了反转时间、固定了情绪走向模型每次都在同一路径上输出。对话的种子随机性被模板压制了。解决把模板拆成固定部分与可变部分。固定部分只保留结构约束可变部分抽出题材库、立意库、反转类型库每条生成前随机组合这些变量。同时将temperature回调到0.8在可控结构内给台词留出多样性。5.5 视频生成接口超时导致流水线中断一觉醒来任务没跑完现象批量生成到了第7条接口返回超时异常进程直接退出。由于没有断点续跑前6条也已经生成的片段全部被浪费。原因主控脚本没有为本环节设计隔离和重试机制。视频生成接口的单次调用时长普遍在30秒到几分钟网络抖动、排队高峰都非常容易超时但代码里直接抛出异常中断了整条流水线。解决所有视频生成调用组件必须包装成“任务队列 重试 断点缓存”。已成功的片段结果立刻落盘写缓存下次运行跳过已存在文件。把单次调用超时时间放宽到生成接口要求的2倍并设置指数退避的重试次数。我有一次批量跑120个镜头中间断了两轮全靠断点续跑最终跑完这是整个流水线里最值得提前投入的部分。6. 验证一部AI短剧值不值得投流4个必须看的指标到了这一步成片已经躺在output/里。但一部AI短剧到底能不能投不能靠自我感觉。我给自己定了一套验证动作每次生成完都先过这四个指标再谈投放。第一个是前3秒完播率。把成片放到本地播放器连续看三遍只回答一个问题如果我在信息流里刷到这条第1秒会停吗判断标准是画面里有没有“动态变化 情绪悬念”同时出现。一条合格的素材第1帧就要有人物动作或镜头运动第1句台词就要带冲突。做不到这一点后面做得再好也没有展示机会。第二个是付费卡点的动机强度。播放到第14到18秒暂停问自己这个位置观众会为了看一个后续结果而付费吗卡点前必须让主角陷入一个“观众能共情且必须知道结果”的困境而不是剧情自然推进到一半停住。第三个是画风一致性。随机抽三帧检查一帧是开场画面一帧是反转点一帧是结尾画面三帧拼接成一张图看风格是否统一。画面色调跳变会直接拉低专业感投流审核也会对运镜不稳定的素材降权。第四个是生成日志与复盘习惯。我在源码工程里固定保留一份run_log.jsonl每跑一批素材就记录整批的脚本模板、视频生成参数、seed、接口耗时、失败重试次数、最终卡点位置。时间久了就能看到这批素材跑不动到底是提示词问题还是画面问题。这个习惯帮我避开了很多重复踩坑相当于给自己留后悔药。实话说AI短剧创作这个方向上决定胜率的从来不是哪个模型更聪明而是你是否把每次翻车的参数固定在日志里把每个能复用的环节拆成脚本。做到这一步你跑的就不再是一条素材而是一条可以反复校准的流水线。希望帮到你。本文还有配套的精品资源点击获取