简介:BigBanana AI Director 是一套面向短剧与漫剧创作者的工业级本地化 AI 制作平台,主打从故事构思到成片输出的一站式工作流,数据全程留在本机,兼顾隐私安全与知识产权归属。它整合剧本生成、角色设定、分镜设计、语音合成与画面渲染等能力,覆盖真人短剧与二次元漫剧两大形态,适合希望低成本搭建 AI 内容生产线的创作者与开发者。资源包共 261 个文件,约 17.97MB,以 tsx、ts 前端与逻辑代码、md 说明文档为主,辅以 png 素材、json 配置、css 样式及 Dockerfile、nginx.conf 等部署文件,目录结构清晰,便于二次开发与本地部署。目前已有 112 人学习下载。借助完整源码与配套文档,读者可快速理解模块化工作流设计、模型替换与推理加速思路,并在此基础上扩展题材风格包与自定义模板,具备较高的实践与改造价值。
1. 从灵感到成片:BigBanana AI Director 到底在解决哪一段工程问题
很多做 AI 短剧、AI 漫剧的团队,卡点从来不在“能不能生成一张好看的图”,而在“从一句灵感变成一集能看的片子”这条链路上。BigBanana AI Director 这个标题里最值钱的词不是“AI”,而是“Director”——它把 AI 短剧、AI 漫剧、AI 导演平台三件事收束成一个工业级一站式命题:剧本拆解、分镜生成、角色一致性、镜头调度、配音配乐、批量出片,这些环节原本散落在十几个工具里,靠人肉搬运。真正做过一集三分钟短剧的人都懂,最耗时的不是生成,而是对齐——角色脸对不上、场景跳变、分镜和台词错位,这些才是血泪经验堆出来的坑。这篇笔记面向的是想搭一套可复现 AI 漫剧工作流的创作者和工程师,我会把“一站式”拆成能落地的模块、参数和排错路径,而不是停在概念层。
2. 拆解一站式 AI 导演平台:从剧本到分镜的四个核心模块
2.1 为什么“导演层”比“生成层”更决定成片质量
先把一个反直觉结论摆出来:在 AI 短剧制作里,生成模型的能力差异,对最终成片的影响往往小于导演层的调度逻辑。原因很简单,单张图的画质已经卷到边际收益很低,但一集短剧是几十上百个镜头的序列,任何一个环节的漂移都会在成片里被放大。所谓导演层,本质是四件事的编排:剧本结构化、分镜切分、角色与场景锚定、镜头语言参数化。
剧本结构化是把自然语言灵感转成机器可调度的数据结构。常见做法是用大模型把一段故事拆成「场次 → 镜头 → 台词 → 动作描述」四层,每层带稳定 ID。这一步的产出不是给人看的,是给后续生成模块消费的,所以字段命名要克制,别塞太多自由文本。
分镜切分决定节奏。AI 漫剧和真人短剧的节奏逻辑不同,漫剧更依赖定格感和分镜切换,一个情绪点可能用三个连续特写而不是一个长镜头。这里我一般会把每个镜头的预估时长写进结构里,作为后续配音对齐的依据。
角色与场景锚定是整条链路最容易翻车的地方。角色一致性靠的是固定 seed、参考图 embedding、以及跨镜头复用的角色描述模板三件套。场景锚定则靠场景 ID 加风格标签,避免同一场戏里背景风格突变。
镜头语言参数化是把“推拉摇移”翻译成生成模型能吃的参数,比如景别、机位角度、焦段倾向。这部分不需要精确到电影级,但至少要能区分特写、中景、全景,否则成片会平得像 PPT。
2.2 用结构化 JSON 描述一集短剧的最小骨架
下面这段是我常用的分镜结构,可以直接抄去改。它把一集短剧拆成场次和镜头两级,每个镜头带生成所需的锚定字段。
{ "episode_id": "ep_001", "title": "雨夜重逢", "style_tag": "anime_cel_shading", "characters": [ { "char_id": "c_lin", "name": "林晚", "ref_image": "assets/lin_ref.png", "seed": 20240517, "prompt_template": "1girl, black long hair, trench coat, calm expression" } ], "scenes": [ { "scene_id": "s_01", "location": "rainy street at night", "shots": [ { "shot_id": "sh_01", "shot_type": "wide", "duration_sec": 3.5, "characters": ["c_lin"], "action": "walking slowly under umbrella", "dialogue": "" }, { "shot_id": "sh_02", "shot_type": "close_up", "duration_sec": 2.0, "characters": ["c_lin"], "action": "eyes slightly narrowed", "dialogue": "你还是来了。" } ] } ] }逻辑说明:characters里的seed和ref_image是角色一致性的双保险,seed 固定随机噪声,参考图固定外观特征,两者缺一不可。prompt_template只写稳定特征,不写情绪,情绪交给每个镜头的action字段,这样同一角色在不同镜头里既有辨识度又有表演变化。
参数说明:shot_type建议只用 wide / medium / close_up 三档,档位太多反而难维护;duration_sec要和后续 TTS 语速对齐,中文配音一般每秒 4 到 5 个字,超过这个密度的台词要拆镜头。style_tag是全局风格锚,一旦定下就不要在单镜头里覆盖,否则整集画风会飘。
2.3 分镜到画面的调度参数怎么设
从分镜结构到实际画面,中间隔着一层调度参数。我的习惯是把调度参数分成三类:一致性参数、构图参数、风格参数。一致性参数管角色和场景不漂移,构图参数管景别和机位,风格参数管整体色调和渲染倾向。
一致性参数里,角色 seed 必须跨镜头复用,场景则用「场景描述 + 固定光照词」来锚定,比如rainy street at night, neon reflection, wet asphalt这组词在每个该场景的镜头里都要出现。构图参数用景别词加机位词组合,比如close_up, eye level或wide, low angle。风格参数统一放在全局,单镜头只做微调。
这里有个容易忽略的点:AI 漫剧的镜头切换比真人短剧更依赖构图差异。如果连续三个镜头都是medium, eye level,观众会觉得画面没动。我的做法是强制相邻镜头景别不重复,这条规则写进调度脚本里自动校验。
3. 把 AI 漫剧工作流跑起来:角色一致性与批量出片的实操
3.1 角色一致性:seed、参考图与提示词模板的三重锚定
角色一致性是 AI 漫剧制作流程里最玄学的一环,也是决定成片能不能看的关键。我踩过的坑是:只固定 seed 不固定参考图,角色脸型会随镜头角度变化;只固定参考图不固定 seed,发色和服装细节会漂。正确做法是三重锚定同时上。
第一重是 seed,它控制生成噪声的初始状态,同一个 seed 加同一段提示词,出图基本稳定。第二重是参考图,用角色立绘做 embedding 或 IP-Adapter 注入,锁定五官和服装。第三重是提示词模板,把角色的稳定特征写成固定字符串,每个镜头都带上。
# 角色一致性调度伪代码,核心是三重锚定同时生效 def build_character_prompt(char, shot): base = char["prompt_template"] # 稳定特征,来自角色定义 action = shot["action"] # 镜头级动作,允许变化 shot_type = shot["shot_type"] # 景别,影响构图 prompt = f"{base}, {action}, {shot_type}, eye level" return { "prompt": prompt, "seed": char["seed"], # 跨镜头复用,禁止每镜头随机 "ref_image": char["ref_image"], # 参考图注入,锁定外观 "negative": "extra fingers, deformed face, style change" }逻辑说明:base保证角色辨识度,action提供表演变化,两者拼接顺序不能反,否则动作词会污染角色特征。seed从角色定义里取,不在这里重新生成,这是很多新手翻车的地方——他们在每个镜头里调用了随机 seed,结果角色每帧都在换脸。
参数说明:negative里一定要加style change,防止单镜头风格跑偏;参考图注入强度一般设在 0.6 到 0.8 之间,太高会锁死动作,太低会丢特征,这个区间是我试出来的经验值。
3.2 批量出片的队列设计与失败重试
一集三分钟的 AI 漫剧,按每个镜头 3 秒算,大概 60 个镜头,每个镜头生成 4 张候选,就是 240 次生成调用。这个量级靠手动点是不现实的,必须上队列。我的做法是把分镜 JSON 展开成任务列表,每个任务带镜头 ID、角色 ID、调度参数,然后丢进队列批量跑。
队列设计有三个要点:并发数控制、失败重试、结果落盘命名。并发数别拉满,生成服务通常有速率限制,拉满只会触发限流。失败重试要区分错误类型,网络超时重试三次,内容审核失败直接跳过并记录,不要无脑重试。结果落盘用episode_shot_variant.png的命名规则,方便后续按镜头挑图。
# 批量生成任务展开与提交,用简单脚本演示队列思路 python expand_shots.py --input ep_001.json --output tasks.jsonl python run_queue.py --tasks tasks.jsonl --concurrency 4 --retry 3 --outdir renders/ep_001逻辑说明:expand_shots.py把分镜结构展开成一行一个任务的 JSONL,方便流式消费;run_queue.py负责并发调度和重试。--concurrency 4是保守值,实测大多数生成服务在 4 到 6 并发下比较稳。
参数说明:--retry 3只对可恢复错误生效,脚本里要判断错误码;--outdir按集数分目录,避免多集混在一起。跑完之后按镜头 ID 分组挑图,挑图标准是角色一致性优先,画质其次,因为画质可以后期修,脸不对没法救。
3.3 配音、字幕与镜头时长的对齐
成片能不能看,配音对齐占一半。AI 短剧制作里最常见的翻车是台词念完了画面还在,或者画面切了台词还没说完。解决办法是把 TTS 生成的音频时长回写到分镜结构里,反过来调整镜头时长。
流程是这样:先用分镜里的dialogue字段批量生成配音,拿到每个音频的实际时长,然后和duration_sec比对。偏差超过 0.5 秒的镜头要调整,要么改语速,要么拆镜头。字幕则按音频时间轴生成,不要按镜头时长生成,否则字幕和声音会对不上。
# 配音时长回写与镜头时长校正 import json from mutagen.mp3 import MP3 def sync_duration(shot, audio_path): real = MP3(audio_path).info.length planned = shot["duration_sec"] if abs(real - planned) > 0.5: shot["duration_sec"] = round(real + 0.3, 2) # 留 0.3 秒呼吸感 shot["need_resplit"] = real > planned * 1.5 return shot逻辑说明:real + 0.3是给镜头留一点余量,避免台词卡在切镜瞬间。need_resplit标记那些台词远超计划的镜头,这些镜头通常需要拆成两个,否则画面会僵。
参数说明:0.5 秒是容忍阈值,低于这个值观众感知不到;1.5 倍是拆分阈值,超过说明台词密度和镜头设计不匹配,硬压语速会很难听。
4. AI 短剧制作避坑:五个真实翻车现场与排查路径
4.1 角色换脸:现象是同一角色在不同镜头脸型突变
现象:成片里主角第一个镜头是瓜子脸,第三个镜头变成圆脸,观众一眼看出不是同一个人。原因通常是 seed 没有跨镜头复用,或者参考图注入强度太低,被动作提示词覆盖了。解决:检查调度脚本里 seed 是否从角色定义读取,参考图注入强度调到 0.7 以上,并在 negative 里加different face。
4.2 场景跳变:现象是同一场戏背景风格突然变化
现象:雨夜街道的前两个镜头是冷色调霓虹,第三个镜头突然变成暖色调。原因是场景描述词没有在每个镜头里重复,模型自由发挥了。解决:把场景锚定词写进每个该场景镜头的 prompt 前缀,不要依赖全局风格标签,全局标签只做兜底。
4.3 台词与口型错位:现象是声音和画面动作对不上
现象:角色张嘴的动作和配音不同步,看起来像配音贴错了。原因是镜头时长和音频时长没对齐,或者动作描述和台词情绪不匹配。解决:跑一遍时长回写脚本,把偏差超过 0.5 秒的镜头全部校正,动作描述里加上和台词情绪一致的关键词,比如台词是惊讶,动作就写eyes wide open。
4.4 批量任务限流:现象是队列跑到一半大量失败
现象:前 50 个任务正常,后面开始大面积超时。原因是并发数超过服务速率限制,触发限流。解决:把并发降到 3 到 4,加指数退避重试,失败任务单独落盘,等限流窗口过了再补跑,不要在原队列里死等。
4.5 风格漂移:现象是整集画风前后不统一
现象:前半集是赛璐璐风格,后半集变成厚涂。原因是单镜头里覆盖了全局风格标签,或者不同批次用了不同的基础模型。解决:风格标签只在全局定义一次,单镜头禁止覆盖;整集必须用同一个基础模型和同一套 LoRA,换模型等于换画风。
5. 进阶技巧:用校验脚本把 AI 漫剧工作流变成可回归的流水线
到这一步,工作流能跑通了,但能不能稳定复现是另一回事。我的习惯是给整条链路加一层校验脚本,把「一致性」变成可量化、可回归的指标,而不是靠肉眼盯。这也是 AI 漫剧工作流从手工作坊走向工业级的关键一步。
校验分三层。第一层是结构校验,检查分镜 JSON 字段完整性,比如每个镜头必须有 shot_type、duration_sec、characters,缺字段直接报错,不让它进生成队列。第二层是一致性校验,对同一角色的所有出图做特征比对,可以用简单的感知哈希或者人脸 embedding 距离,超过阈值的镜头标记出来人工复核。第三层是时长校验,把所有镜头的音频时长和计划时长做偏差统计,输出一张偏差表。
# 三层校验的最小实现,跑在生成之后、剪辑之前 import json, imagehash from PIL import Image def validate_episode(episode, render_dir): report = {"structure": [], "consistency": [], "duration": []} for scene in episode["scenes"]: for shot in scene["shots"]: # 结构校验 for field in ["shot_type", "duration_sec", "characters"]: if field not in shot: report["structure"].append(f"{shot['shot_id']} missing {field}") # 一致性校验:同角色跨镜头哈希距离 for char_id in shot["characters"]: img_path = f"{render_dir}/{shot['shot_id']}_{char_id}.png" h = imagehash.phash(Image.open(img_path)) report["consistency"].append({"shot": shot["shot_id"], "hash": str(h)}) return report逻辑说明:结构校验放在最前面,脏数据不进队列能省大量重跑成本。一致性校验用感知哈希做粗筛,哈希距离大的镜头优先人工看,比全量肉眼盯效率高一个量级。时长校验独立跑,输出偏差表供剪辑参考。
参数说明:感知哈希阈值我一般设在 10 左右,超过就标记;这个值偏保守,宁可多标几个也别漏掉换脸镜头。校验脚本本身要能单独跑,不依赖生成流程,这样回归测试时可以直接对历史成片跑一遍。
我自己的习惯是每集出片前必跑一遍校验,跑完再进剪辑。这个习惯帮我省下的后悔药,比任何生成技巧都多。希望帮到你。
本文还有配套的精品资源,点击获取