简介AI短剧生成平台源码包围绕一句创意描述自动构筑完整短剧生产链路。输入一句台词或故事雏形系统即可完成剧本改写、角色与场景提取、分镜拆解、配音合成及视频导出显著降低AI视频创作门槛。资源共九十四份文件以TypeScript源码为骨架辅以Vue前端组件、Markdown说明文档、JSON配置、Docker部署清单等压缩包仅六百三十四KB体量小巧但模块完整。核心模块包括后端服务、前端管理界面、语音分配器、脚本改写器、分镜拆分器并支持AI生成角色形象与场景背景、TTS配音、基于文生图与图生视频的镜头生成以及FFmpeg合成剪辑。已有三百零五人学习适合短视频创作者、独立开发者与AI应用学习者参考可据此快速搭建自己的短剧生成工作流也是学习多模态生成与自动化视频制作的实用范例。1. 一句话到成片这个AI短剧生成平台到底做了什么做AI短视频内容的朋友应该都有同感脚本、配音、画面、剪辑每一样都是时间黑洞。我自己之前手动做过一条2分钟的AI漫剧光调角色一致性就花了三个晚上最后出来的视频自己都没眼看。所以当我看到这个AI短剧生成平台输入一句话就能在本地把剧本、角色、场景、分镜、配音、视频全链路跑通时第一个反应是这玩意儿到底靠不靠谱。实际拆完源码和部署流程后我的结论是它把AI短视频生成平台的完整流水线做成了可复现的工程化项目不是Demo是能跑通全流程的源码包。对于做短剧矩阵的内容团队、想接AI视频生成的开发者、以及正在选型AI视频工具的运营来说这份资源值回票价。后面我会从剧本抽取、角色生成、分镜拼装、配音合成到部署踩坑一条线拆给你看。2. 剧本与要素抽取一句话变成结构化台本2.1 提示词模板与结构化输出先定JSON schema再写Prompt整个平台的第一步是把用户输入的一句话扩展成完整剧本。这里最关键的工程决策是不要用自然语言对话式的输出而是要限制LLM返回严格结构化JSON。我第一次跑的时候提示词里没约束输出格式结果模型给了我一篇带小标题的散文分镜模块根本没法解析后面全崩了。先看核心代码这决定了剧本生成的质量上限import json from openai import OpenAI client OpenAI(api_keyAPI_KEY, base_urlAPI_BASE) def generate_script(idea: str) - dict: prompt f 你是短剧编剧。根据用户创意产出一个3分钟短剧的完整台本。 必须输出JSON不要输出任何额外文字。JSON结构如下 {{ title: 短剧标题, logline: 一句话梗概, characters: [ {{name: 角色名, gender: 男/女, age: 25, appearance: 外形描述, personality: 性格}} ], scenes: [ {{scene_id: 1, location: 场景地点, time: 日/夜, lines: [ {{character: 角色名, text: 台词, emotion: 情绪提示, action: 动作描述}} ]}} ] }} 用户创意{idea} resp client.chat.completions.create( modelgpt-4o, messages[{role: user, content: prompt}], temperature0.4, max_tokens4096, response_format{type: json_object} ) return json.loads(resp.choices[0].message.content)这段代码的逻辑很直白先把剧本的Schema用JSON示例完整地写在提示词里再让模型填充。response_format强制输出JSONtemperature控制在0.4我一般不建议超过0.6短剧剧本要的是稳定性不是发散性。max_tokens4096是经验值3分钟的短剧大概20到30句台词加上角色和场景描述4000个token基本够用。如果你输入的故事线特别复杂可以放宽到8192但要注意很多国内大模型API的默认最大输出是4096调大了有可能报错。2.2 角色与场景抽取实体去重和全局一致性LLM输出的原始JSON不能直接用有两个脏数据问题在工程上必须处理。第一个是角色名不一致同一个角色在剧本里可能被写上外卖员小陈陈师傅三种叫法第二个是场景描述冗余一个场景有12句台词每句台词里都重复一遍下午三点的老旧小区门口。下面是角色合并的常规做法def merge_characters(script: dict) - dict: char_map {} for scene in script[scenes]: for line in scene[lines]: role line[character] # 用别名表做归一化规则比模型更可控 alias normalize_role(role) if alias not in char_map: char_map[alias] { name: alias, lines_count: 0, scenes: [] } char_map[alias][lines_count] 1 if scene[scene_id] not in char_map[alias][scenes]: char_map[alias][scenes].append(scene[scene_id]) script[characters] [ {**char_map[k], scenes: sorted(char_map[k][scenes])} for k in char_map ] return scriptnormalize_role内部就是一张别名映射表人工维护成本很低。角色出现次数和所在场景列表这两个字段很重要后面生成角色形象和分镜时都要用。特别是角色出现在哪几个场景直接决定了要给这个角色生成多少张不同机位的图。场景抽取我习惯按地点时间段来合并场景比如小区门口-白天和小区门口-傍晚是两个不同镜头语境的场景。合并结果存入场景列表每个场景分配一个全局唯一的scene_id后面配音、分镜、合成全部依赖这个ID做关联我在这个ID上的教训是用字符串拼接结果排序时scene_10跑到了scene_2前面全片画面顺序乱了。3. 角色形象与分镜生成从文本到画面的关键取舍3.1 角色一致性固定seed和参考图是底线模板里**关键词AI生成角色形象**对应的就是这个模块。做过AI漫剧的人都知道最痛苦的不是画得丑而是同一个角色上一帧长这样下一帧换了张脸。平台的方案是提取角色描述中的外形描述交给文生图模型同时用固定seed和参考图来约束人物一致性。核心逻辑看代码import io import base64 import requests def generate_character_image(role: dict, reference_image_path: str None): prompt f{role[appearance]}全体照高清细节丰富 电影级打光半身构图人物居中 negative_prompt 变形手指畸形多余肢体模糊低分辨率水印 payload { prompt: prompt, negative_prompt: negative_prompt, steps: 30, cfg_scale: 7.0, width: 512, height: 768, seed: role[seed], # 固定seed角色每次生成都是同一张脸 batch_size: 4 } if reference_image_path: with open(reference_image_path, rb) as f: img_b64 base64.b64encode(f.read()).decode() payload[init_image] img_b64 payload[strength] 0.4 # strength越低越贴近原图 resp requests.post(SD_API_URL /sdapi/v1/txt2img, jsonpayload) return resp.json()[images]关键在于每个角色生成时把seed固定下来同时把上一次生成的图片作为init_image传进去strength设在0.3到0.5之间。strength太低画面跟前一张几乎一样没有姿态变化太高又容易跑脸。这个参数我没少折腾最终确定0.4在画风和动作自由度之间最平衡。还有一个容易被忽略的细节角色描述里要带上半身构图因为短剧的对话镜头绝大多数是近景和半身全身图放到16:9的画面里人脸占比太小观众根本看不出是哪个人物。512x768的尺寸也别乱改这是给视频拼接留的余量后面合成时还要统一裁剪。3.2 分镜生成台词时长决定镜头节奏分镜模块是整个平台里最接近导演的地方。处理逻辑是把每一句台词估算成秒数再按秒数决定镜头的总长度。常见的做法是中文台词按每字0.3秒估算加上0.6秒的情绪停顿这就是这个分镜的基础时长。这一段代码很实用def build_storyboard(scene: dict, char_images: dict) - list: shots [] for idx, line in enumerate(scene[lines]): text line[text] # 中文文本按字符估算含标点约0.3秒/字 duration round(len(text) * 0.3 0.6, 1) if idx len(scene[lines]) - 1: duration 0.8 # 场景末句多加停留时间 shot { shot_id: f{scene[scene_id]}-{idx}, character: line[character], text: line[text], emotion: line[emotion], duration: duration, image_path: char_images[line[character]] } shots.append(shot) return shotsduration的计算别看简单它是后面音画同步的基准。TTS生成的音频实际时长和估算值会有偏差因此真正合成时要以渲染出的音频文件的真实时长为准这里只是分镜的第一步估算。emotion字段我建议直接用开心愤怒惊讶这种极简词不要用内心涌现出一阵复杂的情绪这类描述。文生图和TTS对这种复杂情绪词的理解是黑匣子翻车概率极大。短剧镜头语言本来就要直给情绪标签越具体下游模块越不容易跑偏。4. 配音合成与视频成片TTS参数与音画对齐4.1 TTS配音语速、音调、停顿三个参数决定像不像真人配音环节经常被当成生成个音频就行实际上参数调不好出来的就是AI朗读腔。平台里TTS模块的做法是按角色性别和性格选不同的音色语速控制在0.95到1.1之间音调一般直接复制平台默认只有角色是小孩或者老人时才动。实际调用代码片段import edge_tts import asyncio async def generate_voice_line(shot: dict, role_name: str, voice: str, output_path: str): text shot[text] rate 10% if shot[emotion] 开心 else -5% if shot[emotion] 难过 else 0% communicate edge_tts.Communicate(text, voice, raterate) await communicate.save(output_path)edge_tts优势是免费且音色列表齐全缺点是网络不好时容易超时重试所以项目源码里一般会搭配一个失败重试装饰器。rate参数里10%这个值我是踩过坑的刚开始用50%希望让整段显得活泼结果语速快到像开倍速配合画面时观众根本来不及看清字幕。选音色的经验是男角色选zh-CN-YunjianNeural这种低沉音色女角色选zh-CN-XiaoxiaoNeural情绪激烈的场景换成zh-CN-YunxiNeural。不要给所有角色配同一个音色AI短视频里最出戏的就是两个人对话听起来是同一个人在自言自语。多角色短剧配音文件命名一定要带shot_id合成模块是按这个ID去匹配的。4.2 视频合成moviepy里必须处理的三个对齐问题视频合成用moviepy就够了不需要上Premiere。这里最核心的是把图片、台词音频、字幕三者按时间轴对齐。我一开始直接set_duration(shot_duration)结果画面和声音对不上原因就是TTS的实际音频长度和估算时长不一致。正确的做法是先解析音频文件拿到真实时长再决定画面时长。from moviepy.editor import ImageClip, AudioFileClip, CompositeVideoClip from mutagen.mp3 import MP3 def assemble_scene(scene_shots: list, output_path: str): clips [] cursor 0 for shot in scene_shots: audio_path shot[audio_path] duration MP3(audio_path).info.length # 以真实音频时长为准 clip ( ImageClip(shot[image_path]) .set_duration(duration) .set_audio(AudioFileClip(audio_path)) .set_start(cursor) ) clips.append(clip) cursor duration scene_video CompositeVideoClip(clips, size(1024, 576)) scene_video.write_videofile(output_path, fps24)size(1024, 576)是短发竖屏素材横屏展示的折中方案。你要做抖音那种竖屏短剧尺寸要改成(576, 1024)但注意生成的角色图是512x768直接拉伸会变形得在合成时先resize再居中裁剪。字幕模块没写在上面的代码里原因是很多版本会把字幕和画面绑定在一层调试起来来回返工。我一般推荐单独生成一个SRT文件让剪辑阶段或者平台内置播放器来加载。SRT生成规则就是按一模一样的cursor游标逻辑每句台词字幕独立成段时间格式是HH:MM:SS,mmm -- HH:MM:SS,mmm。这个文件虽然简单但字幕时间戳和音频对不上是短视频平台最常见的违和感来源。5. 部署与排查从源码包到跑通全流程的五个深坑这份资源带了安装部署流程但源码包依赖的组件比较多LLM接口、图片服务、TTS服务、Python环境每个环节都可能出问题。以下五条是我实际跑过程中遇到过的按现象-原因-解决记录。5.1 现象torch.cuda.is_available()返回False部署完跑图片生成模块提示CUDA不可用但nvidia-smi明明能看到显卡。原因PyTorch的CUDA版本和显卡驱动不匹配。常见的情况是源码包里锁定的torch版本默认是CPU版或者CUDA编译版本与驱动不兼容。解决先确认显卡驱动支持的CUDA版本再安装对应版本的PyTorch。我的环境是CUDA 11.8执行的是pip install torch2.1.0cu118 torchvision0.16.0cu118 -f https://download.pytorch.org/whl/torch_stable.html装完以后在命令行里跑一次python -c import torch; print(torch.cuda.is_available())输出True再继续。5.2 现象调用LLM接口时requests超时剧本生成模块卡在API调用上等了十几秒直接抛超时异常。原因默认timeout值设置偏短加上国内直连国外模型服务的网络延迟不稳定尤其是长提示词场景下模型推理时间本身就长。解决把timeout从默认的10秒改成60秒同时在OpenAI客户端初始化时设置max_retries3。如果你们用的是国内大模型服务商就把base_url换成服务商官方地址不要沿用默认地址这个地址改不对前面的剧本生成百分之百跑不通。5.3 现象合成视频里的字幕全部是方框乱码视频能合成但字幕显示成???或者方框。原因moviepy的TextClip依赖ImageMagick和字体文件Linux环境下默认没有中文字体英文和数字能正常渲染中文直接从字体库中缺失。解决安装fonts-wqy-microhei文泉驿微米黑然后设置环境变量IMAGEMAGICK_BINARY指向全局bin路径。我踩完这个坑后直接把字体文件msyh.ttc复制到了项目根目录在代码里显式font./msyh.ttc声明彻底摆脱系统字体依赖。5.4 现象图片生成到一半显存溢出OOM一次性批量生成角色图时进程直接被系统杀掉。原因batch_size设置过大显存不够用。前面我代码里写了batch_size4在消费级显卡上4张一步出图很容易爆显存。解决显存小于12GB的机器把batch_size改到1或2然后关掉不需要的显卡缓存。更稳妥的做法是循环单张生成把每次出图结果直接落盘不要让多张图驻留在显存中。5.5 现象长剧本的LLM输出总是被截断台词到一半突然断掉JSON解析失败报Expecting value错误。原因max_tokens不够用。3分钟短剧的完整台词加角色描述实际token消耗比预估高尤其当用户输入的是长场景故事生成的内容经常超过4096的上限。解决把max_tokens往上调到8192同时在做剧本解析时加一层JSON截断修复逻辑常见的做法是定位最后一个完整的}括号丢弃后续不完整片段。这个兜底逻辑必须有你永远不知道模型哪天会抽风在JSON后面补一句以上就是本短剧的完整剧本。6. 进阶用法提示词模板库和成片验收清单整套流程跑通以后我建议你把精力花在角色一致性验收和提示词模板固化上。这两个事情不做好平台跑出来的每条视频质量波动很大。角色一致性验证成片出来后逐帧抽查角色面部。我的做法是每个角色挑3个不同场景的截图做对比如果两张图放一起能明显看出不是同一个人就去调那个角色的reference_image_path和strength。角色是第一优先级场景和光线都可以往后放。提示词模板管理也很关键。平台源码里剧本生成的提示词是写死的我习惯把它改成从外部JSON读取把你是短剧编剧这种定位描述、JSON Schema、额外的风格要求分字段配置。这样换题材时只改配置不动代码比如做甜宠剧时加上台词要细腻暧昧做悬疑剧时加每场戏结尾留钩子平台的核心能力没变但产出内容的针对性完全不同。验收项检查方式通过标准角色一致性多帧截图对比同一角色至少3个场景可辨认为同一人音画同步逐句比对台词时长与字幕字幕出现和朗读结束误差不超过0.5秒转场完整性连续播放全片无明显黑屏、跳帧、静音段字幕准确率对照剧本检查错别字不超过总字数的1%这套验收清单帮我省下大量返工时间。以前成片要全片看完才发现角色在第40秒就换脸了现在每出完一条视频就按表过一遍5分钟能确认是否可用。从那以后我每次跑AI视频生成流水线无论多急都强制走一遍这个验收流程动作已经形成肌肉记忆了。这个平台的核心价值就在于把AI短剧生成全流程的源码和部署方案打包好剩下的变数全靠你在角色的seed和提示词模板上花心思。希望这些记录能帮你在绕弯时少走几步。本文还有配套的精品资源点击获取