尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI短剧生成平台:一句话到成片的全流程自动化制作实战

AI短剧生成平台:一句话到成片的全流程自动化制作实战 简介AI短剧生成平台源码包附安装部署流程面向短视频创作者、独立开发者和AI应用爱好者解决短剧制作中剧本、分镜、配音、合成等环节碎片化、流程冗长的问题。只需一句话输入即可借助大语言模型完成剧本改写、角色与场景提取、分镜拆解并通过AI绘图生成角色形象和场景背景最终以文生视频/图生视频、TTS配音及FFmpeg合成自动产出成片。包体共94个文件约634KB主要包含56个TypeScript服务端与脚本文件、8个Vue前端页面、6个JSON配置、Docker部署编排及README说明功能涵盖项目与剧集管理、角色与场景编辑、音频生成及视频导出目录结构清晰便于二次开发与本地部署。已有327人学习下载。读者可获得完整前后端源码、部署所需的docker-compose与Dockerfile、AI角色批量生成与分镜管理逻辑以及从项目创建到整集导出的全流程实现参考。1. AI短剧生成平台一句话输入到成片输出的全流程拆解短剧生产最贵的是人力编剧写本、导演分镜、配音配乐、剪辑合成四五个角色凑齐了才能出片一条 60 秒的片子往往要磨一整天。这份资源把整条链路压缩成一个单入口的自动化平台——你输入一句剧情梗概它就依次完成剧本扩展、角色和场景提取、分镜生成、配音合成、视频合并最后交出一段可播放的 MP4。它不是单点功能的 demo而是自带源码和安装部署流程的完整系统。适合做短视频矩阵的运营、想批量验证剧情创意的团队以及想在 AI 视频生成方向做二次开发的工程师。2. 平台架构与数据链路剧本、分镜、配音、合成四段怎么串2.1 输入提示词是怎么拆成剧本、角色、场景的我拆这份源码时第一印象是它没有把AI 生成做成一个大黑匣子。入口main.py接收--input参数后先走modules/script_gen.py把一句话丢给大模型要求它返回固定结构的 JSON 剧本。这个 JSON 是后面所有环节的数据源角色列表、场景标签、每一幕的台词都写在里面。这里最关键的一点是提示词模板。模板里写死了只输出 JSON不要解释文字。我听很多做过类似工具的人说不写死这一步模型就会在 JSON 前后夹带自然语言说明json.loads()直接崩。所以我在自己的项目里学了这个习惯给大模型的 system 提示词里永远附一个 JSON Schema 示例并要求只输出 JSON。这算是少踩一半解析坑的诀窍。# modules/script_gen.py import json DRAMA_TEMPLATE 你是短剧编剧。用户会给出一个剧情梗概请把它扩展成 4 幕短剧剧本。 只输出 JSON不要输出任何解释文字。JSON 结构必须为 { title: 剧名, characters: [{name: 角色名, role: 主角}], location: [主要场景], acts: [ {title: 幕名, summary: 这一幕概要, dialogue: [台词1, 台词2], scene_tags: [场景标签]} ] } def generate_script(user_input: str, llm_client) - dict: resp llm_client.chat( systemDRAMA_TEMPLATE, useruser_input, temperature0.7, max_tokens1500 ) script json.loads(resp) if len(script[acts]) 4: raise ValueError(剧本幕数不足 4 幕重新生成或提高 max_tokens) return script提示temperature0.7 是本平台的默认值。想要稳定复现同一个剧本改到 0.5 以下想探索不同情节分支才调到 0.9 以上。max_tokens 低于 900 时长剧情经常被截断导致最后一幕缺失。这段代码的实际作用是把用户的--input作为user消息把模板作为system消息一次性拿回结构化剧本。temperature0.7是我常用的折中值——剧情要有点随机性但台词不能离谱到没法用。max_tokens1500保证 4 幕剧带台词回复完整不会因为输出长度限制被腰斩。拿到剧本之后modules/scene_extract.py做角色和场景的抽取。它不直接生成视频而是先把有哪些角色、有哪些场景、每一幕需要的画面提示词列成清单。角色抽取靠读取characters字段场景抽取靠遍历每一幕的scene_tags随后把二者合并成文生图提示词。这一步决定了后面分镜的素材质量。# modules/scene_extract.py def build_image_prompts(script: dict, style: str) - list: prompts [] for idx, act in enumerate(script[acts]): tags ,.join(act[scene_tags]) chars ,.join([c[name] for c in script[characters]]) prompts.append( f{style}, 场景{tags}人物{chars}镜头中景短剧画面 ) return prompts参数说明style来自配置里的video.style默认为电影感冷色调。你可以把风格改写成明亮暖色、甜宠剧或昏暗、惊悚这直接影响分镜生成画面的质感。中景是默认镜头在后续分镜干预时才会细化到特写、俯拍、跟拍。如果你想给某个固定场景预设镜头可以在配置里加一个scene_tags.camera_map比如把便利店映射成手持近景、楼道映射成低角度广角这样生成的提示词会自动带出对应镜头。2.2 分镜、配音、合成之间的数据契约分镜、配音、合成三段不是各干各的最后硬拼而是通过一个统一的manifest.json串联。每一段生成的内容都带shot_id合成器按shot_id顺序拼装。下面是分镜清单里一个镜头的结构{ shot_id: shot_003, scene: 凌晨的便利店, characters: [店员, 神秘顾客], camera: 中景低角度, dialogue: 你每天凌晨三点都来买同一瓶牛奶, image_file: storyboard/shot_003.png, audio_file: audio/shot_003.wav, duration: 4.5 }看到这个结构就清楚整个时间线是怎么对齐的dialogue用来生成配音audio_file是配音模块的输出duration是这一镜头的时长合成器把每个镜头的画面和音频按shot_id顺序写入输出队列。如果配音生成失败audio_file缺失合成器会标记这一镜并跳过不会把整个视频搞崩这就是中间产物落盘的意义。使用这套契约还有一层好处你可以在不重跑模型的情况下单独替换某一个镜头的画面或音频文件只要保持文件名和原有shot_id对应合成器就会拾取新文件。我两次遇到配音口型对不上的情况都是直接把 wav 换掉而不是重新整段合成。2.3 断点续跑为什么中间产物全落盘我拆到pipelines/short_drama.py时发现一个值得抄的设计五个阶段script、scenes、storyboard、audio、video全部落盘重跑时若发现某个阶段的 manifest.json 已存在就直接跳过。这个设计在实际跑片时特别省时间尤其是 storyboard 阶段每张图都是一次模型推理要是配音阶段挂了就得从头再抽图能把人搞到怀疑人生。# pipelines/short_drama.py from pathlib import Path import json STAGES [script, scenes, storyboard, audio, video] def _load_stage(stage: str, out_dir: str): mf Path(out_dir) / stage / manifest.json return json.loads(mf.read_text(encodingutf-8)) if mf.exists() else None def run_pipeline(user_input: str, cfg: dict): out_dir Path(cfg[video][output_dir]) done {} for stage in STAGES: cached _load_stage(stage, str(out_dir)) done[stage] cached if cached else run_stage(stage, done, cfg) return str(out_dir / video / final.mp4)这段是平台最核心的编排代码。STAGES定义了流水线顺序_load_stage检查某个阶段是否已产出done把前一阶段的产物传给下一阶段。我一般会保留这个落盘机制它带来的好处不是多一点磁盘空间的事而是让整个系统可以随时中断、随时续跑。实际跑片时我经常在 storyboard 生成一半时看到角色形象不对直接改掉提示词后从 storyboard 阶段恢复之前抽好的图不受影响。3. 安装部署流程环境、配置与首次跑通一条样例3.1 环境要求与依赖安装这份源码的依赖集中在requirements.txt核心是 PyTorch、diffusers、openai 兼容客户端、edge-tts、ffmpeg-python。部署前我建议先确认三件事Python 版本、CUDA 驱动、FFmpeg 可执行文件。Python 用 3.10 或 3.11 都行3.12 上个别依赖会出现编译问题没必要冒险。nvidia-smi python --version ffmpeg -version三条命令分别确认 GPU 驱动、解释器版本和 FFmpeg。如果nvidia-smi显示 CUDA 12.x后续装 PyTorch 就选 cu121 的安装源如果机器没有 NVIDIA GPU那只能跑 CPU 模式速度会慢很多分镜生成阶段从分钟级变小时级基本只适合验证流程不适合真正出成片。接下来创建虚拟环境并安装依赖。我习惯把所有 Python 依赖都锁在 venv 里不用系统环境否则后面装其他项目时 torch 版本互相打架翻车概率很高。git clone 你的仓库地址 ai-short-drama cd ai-short-drama python -m venv venv source venv/bin/activate python -m pip install --upgrade pip pip install -r requirements.txt逻辑说明python -m venv venv创建隔离环境source venv/bin/activate激活Windows 下用venv\Scripts\activatepip install -r requirements.txt把依赖一口气装完。如果网络源不稳定可以在 pip 后面加-i https://pypi.tuna.tsinghua.edu.cn/simple这是国内常见的加速做法能省掉很多等待时间。装完先做一次冒烟测试确认 torch 能调用 GPUpython -c import torch; print(torch.__version__, torch.cuda.is_available())如果输出True说明 GPU 路径通了。输出False但也不报错说明装的是 CPU 版需要重装 GPU 版。这里有个坑requirements.txt 里如果只写torch不带索引pip 往往默认装 CPU 版因为官方源里 GPU 版体积太大很多镜像站只有 CPU 版。解决办法是明确指定 cu118 或 cu121 安装源。这块我会在第 5 章展开讲。3.2 配置文件模型服务、配音引擎与视频参数平台提供一个config.example.yaml模板复制成config.yaml后按自己环境改。核心配置是三个块llm剧本/分镜文本生成、tts配音、video画幅与帧率。配置项示例值说明llm.provideropenai_compatible本地模型服务或云端兼容接口都行llm.base_urlhttp://127.0.0.1:8000/v1本地大模型服务的地址llm.modelqwen2.5-14b-instruct剧本生成模型tts.engineedge-tts当前免费且稳定的配音引擎tts.voicezh-CN-XiaoxiaoNeural中文女声video.width / height720 / 1280竖屏短剧画幅video.fps30输出帧率llm: provider: openai_compatible base_url: http://127.0.0.1:8000/v1 model: qwen2.5-14b-instruct api_key: sk-local tts: engine: edge-tts voice: zh-CN-XiaoxiaoNeural rate: 8% video: width: 720 height: 1280 fps: 30 output_dir: ./outputs style: 电影感冷色调 batch_size: 1参数怎么改如果你用的是云端兼容接口base_url换成服务商地址api_key换成真实密钥tts.voice想换男声就改成zh-CN-YunxiNeuralrate是语速正数加快负数放慢改成-4%适合悬疑剧的压抑感。batch_size务必先设成 1显存不够时再批量会直接 OOM。api_key填sk-local是因为本地服务通常不做密钥校验但字段不能留空否则客户端请求会报鉴权错误。3.3 首次启动一条命令行把链路跑通配置写好后跑一个最小的样例。这句话是实践中最希望有人提前告诉我的不要上来就跑长剧先用一个 30 到 60 秒的短剧把链路打通确认五个阶段全部 done再谈参数调优。python main.py --input 外卖骑手在暴雨夜接到最后一单 --duration 60命令含义--input是那一句话剧情梗概--duration是目标时长。脚本执行时日志会依次打出[stage script] done、[stage scenes] done、[stage storyboard] done、[stage audio] done、[stage video] done。等看到outputs/外卖骑手/video/final.mp4就说明部署成功。输出目录结构大概是这样的outputs/ 外卖骑手/ script/manifest.json scenes/manifest.json storyboard/shot_001.png storyboard/shot_002.png audio/shot_001.wav video/final.mp4检查这个目录是部署后的标准动作。我要确认 manifest 里没有error字段storyboard 里图片数量大于等于 4audio 目录下每个 wav 都能播放。做到这步平台就能真的用了后面才是调提示词、调画质、调配音语速的活。4. 实战参数与产物调整提示词、分镜干预与导出细节4.1 提示词设计人物、地点、冲突三要素平台对输入那句话的要求不高但也不是随便写一行就有好效果。我拆项目时看到的结果是包含人物、地点、冲突三个要素的提示词生成的剧本完成度远高于只写一个人遇到了奇怪的事这种空洞描述。示例结果倾向外卖骑手在暴雨夜接到最后一单有冲突点结局能落地女主播下播后收到十年前自己发来的私信能自动生成悬疑反转一个人发现了秘密剧情发散角色和场景抽取不稳定一个合格输入的写法是[人物] [具体地点] [一件打破常规的事]。打破常规越具体剧本越不容易被大模型生成成流水账。比如暴雨夜和最后一单这两个限定词比都市和一个订单更能触发强冲突。我第一次试的时候输入两个人吵架产出的剧本平平无奇改成夫妻在小区门口因为一袋垃圾吵架路过的保安认出女方是小时候的邻居剧本直接出现了反转结构。python main.py \ --input 女主播下播后收到十年前自己发来的私信 \ --style 悬疑轻惊悚 \ --duration 90 \ --scene-density high--style覆盖配置文件里的全局风格--scene-density控制分镜密度high表示同一个场景拆成更多镜头适合情绪戏low减少镜头数适合对话密集的短场景。第一次跑建议先用默认值跑完看分镜数量再决定要不要调。分镜数量太多会直接拉高生成时长一条 90 秒的片子high 密度下 storyboard 阶段可能要跑十几分钟而 low 密度可能三五分钟就完事。4.2 不重新生成也能改的地方直接改分镜清单平台的优势是中间产物全落盘所以你想改某一镜的台词、镜头角度、时长不用重新生成整个剧本。直接改storyboard/manifest.json里对应镜头的字段即可。这里有个小坑改duration后必须删掉audio阶段的 manifest让配音重新生成否则新时长和老配音会错位。我只改台词不改时长的时候也习惯把 audio manifest 一起删掉重跑因为文本一变配音的重音和停顿就变了硬留着旧配音会显得声音情绪和台词对不上。手动改完分镜重新运行并指定从 storyboard 之后继续python main.py --input 女主播下播后收到十年前自己发来的私信 --resume-from storyboard--resume-from storyboard会让平台跳过剧本和场景抽取直接从分镜开始。注意这里--input必须和最初那次一致因为平台按输入文本生成输出目录名文本变了会新建目录导致找不到原来的中间产物。这个机制很笨但很可靠我改脚本时保留了同样的逻辑。4.3 视频合成与导出合成器到底做了什么到了最后一步合成器把分镜图和配音按时间线拼起来。它内部其实封装了 FFmpeg只是把拼接、加字幕、转码这些繁琐命令统一成了对 manifest 的读取。看日志时你会看到类似下面的命令被打印出来ffmpeg -f concat -safe 0 -i concat_list.txt -c:v libx264 -pix_fmt yuv420p video/final.mp4参数说明-f concat -safe 0 -i concat_list.txt是按清单拼接-safe 0允许非 ASCII 路径-c:v libx264指定 H.264 编码-pix_fmt yuv420p是兼容性最好的像素格式手机上也能直接播。如果合成后无法在微信里播放先检查是不是漏了yuv420p。如果你拿到的中间产物不是单张 PNG而是多个 ts 视频片段合成器同样可以用 concat 把它们合成一个完整成片。ts 片段在拼接时不需要重新编码命令会用-c copy速度更快但只适用于同编码、同分辨率的片段。合成器还有一个字幕开关配置里的video.burn_subtitles设为 true它会在合成时把dialogue烧录进画面。烧字幕走的是硬编码而不是外挂字幕轨好处是所有播放器都能看到字坏处是后期想改字幕就得重新合成一遍。我实际跑片时习惯先不开字幕等确认台词没问题后再开否则改一次字幕就等于重新合一次视频。5. 避坑指南部署和跑片阶段最常见的六个坑5.1 torch 依赖冲突GPU 版和 CPU 版混着装现象按requirements.txt装完后运行torch.cuda.is_available()返回 False或者直接报CUDA driver initialization failed。原因requirements.txt里写的torch没有绑定 CUDA 版本pip 从默认源装了 CPU 版还有一种情况是机器上装了多套 CUDAPyTorch 找到的库和驱动版本对不上。解决先敲nvidia-smi看驱动支持的 CUDA 版本然后按对应版本重装。我常用的组合是 CUDA 11.8 配torch2.1.2cu118CUDA 12.1 配torch2.2.2cu121。装完再跑一次torch.cuda.is_available()直到输出 True 再继续。5.2 显存不足分镜批量生成直接 OOM现象单条提示词跑没问题--scene-density high后进程在生成第三四张分镜时被杀日志末尾是CUDA out of memory。原因video.batch_size被默认调到了 2 以上多个画面同时推理显存峰值成倍增长。我的显卡是 8G 显存一次只能扛住 512x512 的单张生成。解决在config.yaml里把batch_size改成 1width/height从 720x1280 降到 512x512 试跑。确认稳定后再逐步往上加。另外Linux 下可以设CUDA_VISIBLE_DEVICES0让进程只认一张卡避免多卡调度带来的额外开销。跑长剧时把--scene-density保持默认等整体稳定再开 high否则很容易跑到一半被系统杀进程。5.3 配音和画面不同步时长对不上导致一刀切现象生成的视频里台词说到一半画面已经切到下一个镜头或者画面停在那里等台词说完。原因分镜manifest里的duration是预估时长配音引擎真实生成的 wav 比它长或短时合成器按duration硬切声音被切掉或留白。解决先删掉audio/manifest.json再跑一次让配音重新按分镜生成同时在config.yaml里确认tts.rate没有设置得过慢。经验值是语速0%到8%时15 字以内的台词和 45 秒镜头基本同步。实在要对齐就把duration改成max(duration, audio_duration) 0.3给留白一点余量。我早期跑悬疑剧时把 rate 调成-20%结果每条配音都比画面长两秒后来统一改成在合成器里做时长自适应才彻底摆脱这个问题。5.4 角色形象前后不一致同一人物每张图长得都不一样现象第一个镜头里主角穿红色外套第二个镜头里变成蓝色人脸也明显不是同一个人。原因文生图模型只看单帧提示词没有记忆。平台里如果没启用角色参考图那么同一角色在每个分镜里都会重新生成一张脸。解决尽量在提示词里固定角色的服装和发型描述比如红色外套、短发、圆脸。更彻底的做法是配一张角色参考图在config.yaml里指定character_refs让分镜生成时以参考图作为条件这个我在第 6 章展开。特别是短剧里主角出场镜头多没有参考图的方案跑出来就是换脸剧根本没法治。5.5 合成黑屏RGB 与 BGR 颜色通道翻转现象final.mp4能打开、有声音但画面是全黑或者颜色完全失真。原因Python 侧用 PIL 读图得到的通道顺序是 RGBFFmpeg 解码时按 BGR 处理接缝处颜色被翻转某些解码器直接出黑屏。常见触发点是转场帧用了透明通道的 PNG。解决在合成脚本里读图后统一做一次cv2.cvtColor(img, cv2.COLOR_RGB2BGR)输出前再用-pix_fmt yuv420p转码。如果项目里用的是imageio读图后也多做一步通道转换。这个问题最气人的地方是它不报错日志全绿打开视频才发现坏了所以我现在每次合成完都会先抽一帧看颜色再整片播放。5.6 中文路径和字符编码问题现象Windows 下输出目录带中文FFmpeg 报找不到文件或者生成的 MP4 文件名乱码。原因平台默认用 UTF-8 写路径而 Windows 控制台编码是 GBK传到 FFmpeg 后路径匹配不上。解决把output_dir改成纯英文比如outputs/drama_run_001在bash里启动前设export PYTHONUTF81。输出文件名里的中文只保留在manifest.json内部不要硬塞进文件名。我在 Windows 上跑过两次全栽在这个坑里后来不管在哪台机器上部署第一件事就是把输出目录改成纯英文路径。6. 进阶用法角色形象一致性与批量短剧流水线6.1 让角色形象跨镜头一致参考图与负向提示词短剧最怕的是主角每换一幕就换一张脸。涉及 AI 生成角色形象时参考图是最实用的解法。平台支持在config.yaml里指定角色参考图让分镜生成时参考固定形象。做法是把角色的一张半身照放进refs/目录再在配置里登记角色名和图片路径。character_refs: - name: 女主播 image: ./refs/wang_mian.png traits: 波浪长发红色耳环浅蓝衬衫 negative: 模糊脸, 五官变形, 多余手指, 低画质traits是给文生图模型的固定形象描述每次生成该角色时自动拼进提示词negative是负向提示词专门排除畸变和画质问题。用上参考图后同一角色在不同分镜的平均相似度明显提升至少不会一个镜头一个样。6.2 批量短剧流水线从手动一条到一跑一批当你通过了第 4 章的实操下一步自然是想批量出短剧。平台源码里没有内置批量模式但原结构很容易扩展。我通常写一个简单的tools/batch_pipeline.py读一批提示词循环调用main.py。这套改法一旦跑通平台就从单条短剧的工具变成一条 AI 短视频生成平台级别的批量链路。# tools/batch_pipeline.py import json import subprocess cases [ {prompt: 外卖骑手在暴雨夜接到最后一单, style: 都市}, {prompt: 女主播下播后收到十年前自己发来的私信, style: 悬疑}, {prompt: 修表匠发现顾客送来的手表倒着走, style: 奇幻}, ] for case in cases: print(running:, case[prompt]) subprocess.run( [python, main.py, --input, case[prompt], --style, case.get(style, 都市)], checkTrue, )参数说明checkTrue保证任何一条失败都会中断整批避免后面全跑空cases可以换成从 CSV 读入批量维护文案。跑批时建议--scene-density用默认等整体稳定后再开高密度否则 OOM 会打断整批任务。批量跑的另一个好处是你可以在文案里统一加人物、地点、冲突结构让每一批的产出质量都在及格线以上。从那以后我每次把平台架到新机器上都强制先走一遍三件事看nvidia-smi确认驱动版本检查五个阶段的 manifest 是否齐全最后才允许自己点下合成按钮。这套顺序帮我排掉了八成的环境类报错。希望帮到你。本文还有配套的精品资源点击获取
返回列表