简介:Toonflow 是一套面向短剧创作者与 AI 应用开发者的开源 AI 短剧生成工具,核心定位是「自动化导演助理」,负责把小说或剧本自动拆分为分镜、生成固定人设卡并转化为视频,解决 AI 画图「千人千面」与重复劳动的问题。它并非简单的文生视频,而是能保证主角形象一致的工业化管线,涵盖角色卡生成、智能分镜与视频转化三大模块,适合想跑通「文本→分镜→出片」全流程的中高级开发者研究源码与二次开发。资源包共 170 个文件,以 139 个 TypeScript 源码为主,辅以 jpg、png 图片素材、yml 配置、json 数据及 Dockerfile、docker-compose 等部署文件,压缩包约 8.86MB,目录结构完整便于按模块阅读。目前已有 1783 人学习下载,读者可从中获取角色特征提取、SDXL 分镜生成、SVD 视频转化等关键实现思路,以及可本地部署运行的完整工程代码。
1. Toonflow 到底解决什么问题:从一句梗到一集短剧的自动化流水线
短剧赛道卷到今天,真正的瓶颈早就不是"有没有创意",而是"创意到成片之间的重复劳动"。Toonflow 这个 AI 短剧生成工具瞄准的正是这段流水线:把剧本拆成分镜、把分镜转成画面、把画面配上配音和字幕,最后拼成一条能直接发布的竖屏视频。它不是一个"输入一句话就出大片"的魔法盒子,而是一套把大模型、文生图、TTS、视频合成串起来的工程化编排层。源码开放意味着你可以改提示词模板、换模型供应商、调分镜节奏,而不是被某个 SaaS 的固定套路锁死。
适合谁?一是想批量做短剧内容的自媒体团队,二是想把 AI 生成能力接进自己产品的开发者,三是想研究多 AI 协作编排(agent 编排)的工程师。如果你只是偶尔做一两条视频,手动剪映可能更快;但当你需要一天出十条、还要保持角色一致性时,Toonflow 这类工具的价值才会真正显现。下面我按"能跑起来、能改得动、能避坑"的顺序,把整套方案拆开讲。
2. 拆解 Toonflow 的技术栈:多 AI 协作是怎么串起来的
2.1 从剧本到分镜:LLM 负责结构化,不负责创作
Toonflow 的第一段流水线是"剧本 → 分镜脚本"。核心思路是让大语言模型把一段自然语言剧情,输出成结构化的 JSON:每个镜头包含场景描述、角色、台词、时长、镜头类型。这里的关键不是让模型"写得好看",而是让它"输出稳定可解析"。
常见做法是用 system prompt 强约束输出格式,再配合 JSON schema 校验。我一般会把分镜的字段固定成下面这样,方便后续环节直接消费:
{ "scene_id": 1, "shot_type": "close_up", "duration_sec": 3.5, "character": ["女主"], "dialogue": "你到底瞒了我多久?", "visual_prompt": "年轻女性,特写,眼眶泛红,室内暖光,电影感", "bgm_mood": "tense" }逻辑说明:visual_prompt是给文生图模型的输入,必须和dialogue解耦——台词归 TTS,画面归图像模型,两者不要混在一个字段里,否则后期改一句台词就得重生成整张图。duration_sec决定这条镜头在时间轴上的长度,直接影响成片节奏。参数上,shot_type建议限定枚举值(wide/medium/close_up),否则模型会自由发挥出"中近景偏左"这种没法程序化处理的值。
提示:分镜生成阶段一定要做 JSON 解析失败的重试。模型偶尔会在 JSON 外面裹一层解释文字,用正则先截取第一个
{到最后一个}再解析,比直接json.loads稳得多。
2.2 角色一致性:短剧翻车的头号重灾区
短剧最怕的就是"同一个角色,第一集是圆脸,第三集变方脸"。Toonflow 这类工具通常用两种手段控制一致性:一是固定角色参考图(reference image),二是固定随机种子(seed)。
具体做法是给每个角色建一张"角色卡",包含参考图、外貌描述、固定 seed。生成该角色的所有镜头时,都把参考图作为 image-to-image 的输入,或者用 IP-Adapter 这类角色保持方案。参数上,参考图权重(类似ip_adapter_scale)建议在 0.6~0.8 之间:太低角色会漂移,太高画面会僵化、动作不自然。
# 角色一致性生成的核心参数(伪代码,按你实际用的推理框架替换) gen_params = { "prompt": shot["visual_prompt"], "reference_image": character_card["ref_img"], "ip_adapter_scale": 0.7, # 0.6~0.8 是甜区 "seed": character_card["seed"], # 同角色固定 seed "negative_prompt": "变形, 多手, 多指, 模糊" }逻辑说明:seed固定能保证同一提示词下画面基底稳定,但换了提示词后 seed 的作用会减弱,所以真正扛一致性的是参考图。ip_adapter_scale是那个"玄学参数",不同底模差异很大,必须自己试。血泪经验是:别指望一次生成就完美,角色脸崩了要允许单镜头重生成,而不是整集重跑。
2.3 配音、字幕与合成:把零件拼成成片
画面有了,接下来是 TTS 配音、字幕对齐、视频拼接。Toonflow 的编排层在这里做的是"时间轴对齐":每条镜头的时长由duration_sec决定,配音生成后如果实际音频比镜头长,要么压缩镜头,要么拉伸音频,要么重新生成更短的台词。
常见做法是用 FFmpeg 做最终合成,把图片序列 + 音频 + 字幕烧成一条 MP4。字幕建议用 SRT 而不是硬烧,方便后期微调。合成命令大致长这样:
# 把分镜图片按顺序合成视频,再叠加配音和字幕 ffmpeg -y -framerate 1/3.5 -i shot_%03d.png \ -i voice.wav -i subtitle.srt \ -c:v libx264 -pix_fmt yuv420p -c:a aac \ -vf "subtitles=subtitle.srt" output.mp4逻辑说明:-framerate 1/3.5表示每张图停留 3.5 秒,这个值要和分镜里的duration_sec对齐,否则音画会错位。-pix_fmt yuv420p是兼容性保险,不加的话某些播放器会黑屏。参数上,竖屏短剧记得在合成前把图片统一 resize 到 1080x1920,别指望 FFmpeg 自动帮你裁。
3. 本地跑通 Toonflow 的最小路径:环境、配置与第一次生成
3.1 环境准备与依赖安装
Toonflow 作为一套 Python 为主的生成编排工具,本地跑通的第一步是把依赖装干净。我一般用 conda 建独立环境,避免和系统里的包打架。核心依赖通常包括:大模型调用 SDK、图像生成推理库、TTS 库、FFmpeg。
conda create -n toonflow python=3.10 -y conda activate toonflow pip install -r requirements.txt # FFmpeg 建议用系统包管理器装,别用 pip 的 ffmpeg-python 代替二进制 ffmpeg -version逻辑说明:Python 版本建议锁 3.10,很多图像推理库对 3.11+ 支持还不稳。requirements.txt里如果混了 GPU 版和 CPU 版的 torch,会出现"装了却用不了显卡"的情况,装完务必跑一句python -c "import torch; print(torch.cuda.is_available())"验证。参数上,显存低于 8G 的话,文生图环节要么降分辨率,要么改用 API 而不是本地推理。
注意:不要把所有模型都堆在本地。LLM 和 TTS 用 API、文生图用本地,是性价比最高的组合;反过来本地跑 LLM 对显存要求高得多,新手容易在这一步劝退。
3.2 配置文件怎么填:模型、密钥、路径三件套
Toonflow 的配置一般集中在一个config.yaml或.env里,核心就三块:模型供应商、API 密钥、输出路径。下面是一个典型结构:
llm: provider: openai_compatible base_url: "https://your-endpoint/v1" model: "your-llm-model" api_key: "${LLM_API_KEY}" image: backend: local_sd model_path: "./models/sd_base" width: 1080 height: 1920 tts: provider: edge # 或你用的其他 TTS voice: "zh-CN-female" output: dir: "./output" fps: 24逻辑说明:base_url用兼容 OpenAI 协议的端点,方便随时换供应商,不用改代码。api_key走环境变量而不是写死在文件里,避免提交到仓库泄露。width/height直接定成竖屏 1080x1920,省得后期再裁。参数上,fps对图片序列合成的短剧影响不大,24 或 30 都行,但一旦定了就别中途改,否则时间轴会乱。
3.3 第一次生成:从一条分镜到一条成片
建议第一次别跑整集,先跑一条分镜,把链路打通。流程是:输入一小段剧情 → 生成分镜 JSON → 生成一张图 → 生成一段配音 → 合成一条 5 秒视频。
from toonflow import Pipeline pipe = Pipeline(config_path="./config.yaml") # 只跑一条分镜,验证链路 script = "女主发现男主手机里的秘密,质问对方。" shots = pipe.generate_storyboard(script, max_shots=1) for shot in shots: img = pipe.generate_image(shot) audio = pipe.generate_voice(shot["dialogue"]) pipe.assemble(img, audio, shot, out="test_shot.mp4")逻辑说明:max_shots=1是关键,先控制成本和时间。generate_storyboard内部会调 LLM 并做 JSON 校验,如果这一步就报错,问题在提示词或模型,不在后面的图像环节。assemble负责把单镜头拼成视频,跑通它意味着 FFmpeg 路径没问题。参数上,第一次生成把图像分辨率调低(比如 540x960)能快很多,链路通了再拉满。
4. 避坑与排查:Toonflow 落地时最容易翻车的 5 个点
4.1 分镜 JSON 解析失败,整条流水线卡死
现象:脚本跑到分镜生成就抛异常,日志里是JSONDecodeError。原因:大模型在 JSON 前后加了"好的,以下是分镜:"这类自然语言,或者字段值里带了未转义的引号。解决:解析前先用正则截取{...}区间,再对字段值做转义清洗;同时把 system prompt 里的"只输出 JSON,不要任何解释"写死,并开启重试(建议 3 次)。
4.2 角色脸崩、服装跳变
现象:同一角色在不同镜头里长相、衣服颜色对不上。原因:只固定了 seed,没上参考图,或者ip_adapter_scale设太低。解决:给每个角色建角色卡,固定参考图 + seed,把参考图权重提到 0.7 左右;服装颜色写进visual_prompt的固定前缀里,别每镜头重写。
4.3 音画不同步,越到后面越明显
现象:前几条镜头还行,后面台词和口型/画面完全错位。原因:每条镜头的实际配音时长和duration_sec不一致,误差累积。解决:合成前先探测每条音频的真实时长,用它反推镜头时长,而不是硬用分镜里的预设值;或者统一把音频拉伸到镜头时长。
4.4 显存爆了,生成到一半进程被杀
现象:跑到第 N 张图时进程突然消失,系统日志显示 OOM。原因:图像模型没释放显存,或者分辨率开太高。解决:每生成一批图后手动torch.cuda.empty_cache();分辨率从 1080x1920 降到 720x1280 先跑通;批大小设为 1,别贪心。
4.5 输出视频在部分播放器黑屏
现象:本地能播,发到某些平台就黑屏或没声音。原因:像素格式不是yuv420p,或音频编码不兼容。解决:FFmpeg 合成时强制-pix_fmt yuv420p -c:a aac,字幕尽量用软字幕或单独上传,别硬烧。
5. 进阶玩法:把 Toonflow 从"能用"调到"好用"
链路跑通只是起点,真正决定成片质量的是几个进阶技巧。第一是分镜节奏的批量调优:把duration_sec做成可配置的节奏模板,比如"悬疑剧平均 2.5 秒一镜、情感剧 4 秒一镜",整集套用同一模板,观感会统一很多。第二是多 AI 协作的提示词分层:把"角色设定""场景风格""镜头语言"拆成三层提示词,分别维护,生成时拼接,改风格时只动一层,不用全量重写。
第三是建立"重生成白名单"。不是每条镜头都值得重跑,我一般只对三类镜头重生成:含角色正脸的、含关键台词的、转场镜头。其余背景镜头崩一点无所谓,观众注意力不在那。这个策略能把重生成成本压掉一半以上。
| 调优项 | 默认值 | 推荐值 | 影响 |
|---|---|---|---|
| ip_adapter_scale | 0.5 | 0.6~0.8 | 角色一致性 vs 画面自然度 |
| 图像分辨率 | 1080x1920 | 720x1280 起 | 显存占用与速度 |
| 分镜时长 | 固定 3s | 按剧型模板 | 成片节奏 |
| 重试次数 | 1 | 3 | 稳定性 vs 成本 |
验证方法很简单:同一段剧本,用默认参数和调优参数各跑一遍,把两条成片并排看,重点看角色脸、音画同步、整体节奏。我自己的习惯是每改一个参数只跑一条分镜做 A/B,别一次改五个参数然后不知道是哪个起了作用。这套东西踩坑最多的永远是角色一致性和音画同步,把这两块磨顺,Toonflow 才算真正能投产。希望帮到你。
本文还有配套的精品资源,点击获取