1. 为什么要在本地搭一套AI漫剧生产流水线
把Qwen和ComfyUI捏在一起做AI漫剧,这个组合在2026年初已经跑通了一条相当成熟的路径。所谓AI漫剧,说白了就是用大语言模型写剧本、分镜和提示词,再用扩散模型批量出图,最后串成有角色、有对白、有镜头运动的短篇漫画剧集。整条链路里,Qwen负责“脑力活”——剧本创作、角色设定、分镜拆解、提示词翻译;ComfyUI负责“体力活”——角色一致性出图、场景生成、动画补帧。两者通过本地API对接,全程离线,素材不出机器。
这套方案解决的核心痛点有三个。第一是成本,在线出图服务按张计费,一集漫剧动辄几百张图,长期做下来开销不小,本地跑一次投入、无限次使用。第二是一致性,AI漫剧最怕角色“换脸”,本地部署可以配合LoRA微调和IPAdapter把角色锁死。第三是隐私与可控,剧本和素材都在自己硬盘里,工作流可以随意魔改,不受平台规则限制。
适合谁来学?如果你已经会用ComfyUI出单张图,但不知道怎么把它变成“流水线”;或者你写剧本没问题,但一到批量出图就抓瞎;再或者你纯粹想搞明白本地大模型和图像模型怎么协同工作——这篇内容就是给你准备的。我会从环境搭建一路讲到成片导出,把踩过的坑和验证过的参数都摊开说。
2. 环境准备:Qwen本地部署与ComfyUI安装
2.1 硬件门槛与系统选择
先泼一盆冷水:这套东西对硬件有实打实的要求。Qwen本地推理和ComfyUI出图是两套吃资源的活儿,如果同时跑,显存和内存都要留足余量。
我的建议配置是这样的:
| 组件 | 最低可用 | 推荐配置 | 说明 |
|---|---|---|---|
| GPU显存 | 12GB | 24GB及以上 | 出图主力,AnimateDiff很吃显存 |
| 系统内存 | 32GB | 64GB | Qwen 14B量化版约需10-16GB |
| 硬盘 | 100GB空闲 | 500GB SSD | 模型文件动辄几十GB |
| CPU | 8核 | 16核以上 | 影响模型加载和预处理速度 |
显卡方面,N卡生态最省心,20系以上都行。如果你手头是Mac,M系列芯片统一内存架构跑Qwen推理其实不错,但ComfyUI出图速度会慢一些,做漫剧批量生产会比较煎熬。至于Jetson Orin Nano这类边缘设备,跑Qwen小尺寸量化版可以,但拿来做完整漫剧流水线就力不从心了,更适合做推理验证。
系统我推荐Windows 11或者Ubuntu 22.04。Windows的好处是秋叶整合包开箱即用,Ubuntu的好处是环境干净、依赖冲突少。下面我两条路都讲。
2.2 Qwen本地部署:Ollama方案实操
Qwen本地部署最省事的路径是走Ollama。Ollama把模型下载、量化、推理服务都封装好了,一条命令就能拉起一个兼容OpenAI格式的API,ComfyUI那边直接调就行。
第一步,安装Ollama。官网下载对应系统的安装包,Windows双击安装,Linux用一条脚本搞定:
curl -fsSL https://ollama.com/install.sh | sh安装完验证一下:
ollama --version能打印版本号就说明装好了。这里有个常见坑:国内下载Ollama安装包和模型时速度可能很慢,甚至卡住。解决办法是配置镜像源,在环境变量里加一行OLLAMA_HOST指向国内可访问的地址,或者手动下载模型文件放到Ollama的模型目录里。模型目录默认在~/.ollama/models(Linux/Mac)或C:\Users\你的用户名\.ollama\models(Windows)。
第二步,拉取Qwen模型。根据你的显存选尺寸:
# 14B量化版,平衡质量和资源,推荐 ollama pull qwen2.5:14b # 7B版,显存紧张时用 ollama pull qwen2.5:7b # 32B版,质量最好但需要大显存 ollama pull qwen2.5:32b拉取完成后测试一下:
ollama run qwen2.5:14b "写一段三幕式漫剧大纲,主题是都市奇幻"如果能看到流畅的中文输出,说明Qwen已经跑起来了。Ollama默认在11434端口提供API服务,ComfyUI的自定义节点可以直接连。
注意:Ollama默认只监听本地回环地址,如果你想让局域网内其他机器调用,需要设置
OLLAMA_HOST=0.0.0.0,但这会带来安全风险,非必要不要开。
2.3 ComfyUI安装:整合包与手动部署两条路
ComfyUI的安装有两条路,我分别说。
路线一:秋叶整合包。这是国内最省心的方案,解压即用,内置了常用插件和Python环境,避免了依赖地狱。下载秋叶ComfyUI整合包(2026年v10版本已经相当稳定),解压到非中文路径下,双击启动器即可。启动器里可以一键更新ComfyUI本体和插件,还能管理模型路径。新手强烈建议走这条路,能省掉至少半天的环境调试时间。
路线二:手动部署。如果你想用最新版ComfyUI(比如v0.35.0),或者需要精细控制环境,就手动来:
git clone https://github.com/comfyanonymous/ComfyUI.git cd ComfyUI python -m venv venv source venv/bin/activate # Windows用 venv\Scripts\activate pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 pip install -r requirements.txt启动:
python main.py --listen 0.0.0.0 --port 8188浏览器打开http://127.0.0.1:8188就能看到节点界面。
必装插件清单。不管走哪条路,做AI漫剧这几个插件是刚需:
- ComfyUI-Manager:插件和模型管理,装插件全靠它
- ComfyUI-AnimateDiff-Evolved:动画生成核心,做镜头运动必备
- ComfyUI-IPAdapter_plus:角色一致性锁定
- ComfyUI-Custom-Scripts:一堆实用小工具,比如提示词自动补全
- ComfyUI-Ollama:对接本地Qwen的桥梁
装插件用Manager最方便,界面里搜名字点安装,重启即可。手动装的话进custom_nodes目录git clone再pip install -r requirements.txt。
2.4 模型文件准备与目录规划
ComfyUI的模型目录结构要提前规划好,不然文件一多就乱。核心目录:
ComfyUI/ ├── models/ │ ├── checkpoints/ # 基础大模型,如SDXL、Flux │ ├── loras/ # 角色LoRA、风格LoRA │ ├── vae/ # VAE解码器 │ ├── controlnet/ # 姿态、线稿控制 │ ├── ipadapter/ # 角色参考图编码 │ └── animatediff_models/ # AnimateDiff运动模块做漫剧我推荐用SDXL系的基础模型,出图质量和角色稳定性都比SD1.5好一截。Flux系列质量更高但对显存要求也更高,24GB以下显存慎用。VAE记得配一个,SDXL自带的VAE有时候偏灰,换成sd_xl_vae色彩会正很多。
3. 核心思路拆解:Qwen与ComfyUI如何协同
3.1 分工逻辑:谁干什么活
这套流水线的核心设计思想是“语言模型管叙事,扩散模型管画面”。Qwen不直接出图,它输出的是结构化的文本——剧本、分镜表、每个镜头的提示词。ComfyUI读取这些文本,驱动出图节点批量生产。
为什么不让Qwen直接生成图片描述然后手动粘贴?因为漫剧一集几十上百个镜头,手动粘贴不现实。必须让Qwen的输出格式固定、可解析,ComfyUI那边用脚本或自定义节点自动读取。这就是为什么要走API对接,而不是复制粘贴。
具体分工:
- Qwen负责:故事大纲、角色小传、分镜脚本(镜号、景别、画面描述、对白、时长)、每个镜头的正向/负向提示词、角色LoRA触发词
- ComfyUI负责:根据提示词出关键帧、用IPAdapter锁定角色、用AnimateDiff生成镜头运动、批量渲染、导出序列帧
3.2 数据流转:从剧本到成片的管道
整条管道的数据流是这样的:
- 你在Qwen对话里输入故事主题和角色设定
- Qwen输出一份JSON格式的分镜表,每个镜头包含
shot_id、prompt、negative_prompt、character、duration - 一个Python脚本读取JSON,逐条调用ComfyUI的API(
/prompt端点)提交任务 - ComfyUI工作流里,提示词节点从API参数接收文本,IPAdapter节点加载对应角色的参考图,AnimateDiff节点生成帧序列
- 渲染结果保存到指定目录,文件名带
shot_id方便后期对齐 - 后期软件(剪映、达芬奇)按分镜表拼接,配上Qwen生成的配音文本
这个管道的关键在于格式约定。Qwen输出的JSON必须字段固定,ComfyUI工作流里的节点名称必须和脚本里的映射一致。我建议先用3-5个镜头跑通全流程,再扩展到整集。
3.3 为什么选Qwen而不是其他模型
Qwen2.5系列在中文叙事任务上表现很稳,尤其是分镜脚本这种需要结构化输出的场景。它的指令遵循能力强,你让它输出JSON它基本不会跑偏。14B量化版在24GB显存上跑得很流畅,生成一集分镜(约50个镜头)大概两三分钟。
相比一些更大的模型,Qwen的优势是本地部署友好、量化版本齐全、中文语感自然。做漫剧对白要接地气,Qwen在这点上比很多英文为主的模型强。而且Ollama对Qwen的支持是一等公民,拉取和运行都很顺。
3.4 角色一致性方案选型
AI漫剧最大的技术难点是角色一致性。同一个角色在几十个镜头里不能长得不一样。我试过几种方案,对比如下:
| 方案 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| LoRA微调 | 用角色图训练专属LoRA | 一致性最强 | 需要训练,耗时 | 主角、长期角色 |
| IPAdapter | 参考图编码注入 | 免训练,即插即用 | 一致性中等 | 配角、临时角色 |
| ControlNet | 姿态/线稿控制 | 构图精准 | 不解决长相 | 配合前两者 |
| 提示词锁定 | 详细外貌描述 | 零成本 | 一致性最弱 | 辅助手段 |
我的实战组合是:主角训LoRA + IPAdapter双保险,配角用IPAdapter + 详细提示词。LoRA训练用ComfyUI里的训练节点或者Kohya,20-30张角色多角度图,跑2000步左右就能出一个可用的角色LoRA。IPAdapter则用一张高质量角色立绘做参考,权重设0.6-0.8之间。
4. 实操全流程:从剧本到成片
4.1 用Qwen生成分镜脚本与提示词
先给Qwen一个清晰的系统提示,让它按固定格式输出。我在Ollama里这样调:
ollama run qwen2.5:14b然后输入系统指令:
你是一个专业的AI漫剧分镜师。请根据用户提供的主题,输出JSON格式的分镜表。 每个镜头包含以下字段: - shot_id: 镜号,从1开始 - shot_type: 景别(远景/全景/中景/近景/特写) - camera: 镜头运动(固定/推/拉/摇/移) - prompt: 英文正向提示词,描述画面内容、光线、构图、风格 - negative_prompt: 英文负向提示词 - character: 出场角色名 - dialogue: 该镜头对白,无对白则为空字符串 - duration: 镜头时长(秒) 风格统一为:anime style, cinematic lighting, detailed background 只输出JSON,不要有其他文字。然后输入你的故事主题,比如“一个外卖员在雨夜发现自己是古代剑仙转世”。Qwen会输出一份完整分镜表。实测14B版输出的JSON结构很规整,偶尔有字段缺失,加一句“确保所有字段都存在”就能修正。
拿到JSON后存成storyboard.json。这里有个技巧:让Qwen把每个镜头的提示词写得具体,包含角色外貌特征(发色、瞳色、服装),这样即使不用LoRA,出图一致性也能好一些。
4.2 ComfyUI工作流搭建:出图主链路
打开ComfyUI,搭建基础出图工作流。核心节点链:
- Checkpoint Loader:加载SDXL基础模型
- CLIP Text Encode(正向):接API传入的prompt
- CLIP Text Encode(负向):接negative_prompt
- Empty Latent Image:设分辨率,漫剧推荐1024x1024或832x1216
- KSampler:采样器选DPM++ 2M Karras,步数25-30,CFG 7
- VAE Decode:解码
- Save Image:保存,文件名前缀用
shot_
如果要加角色一致性,在CLIP Text Encode和KSampler之间插入IPAdapter节点:
- IPAdapter Unified Loader:加载ipadapter模型
- Load Image:加载角色参考图
- IPAdapter Apply:权重设0.7,开始步数0,结束步数1
工作流搭好后,点“Save (API Format)”导出成JSON,这个JSON就是脚本调用的模板。
4.3 批量出图脚本:让流水线跑起来
写一个Python脚本,读storyboard.json,逐条替换工作流JSON里的提示词,提交到ComfyUI API:
import json import requests import time COMFY_API = "http://127.0.0.1:8188" def load_workflow(path): with open(path, 'r', encoding='utf-8') as f: return json.load(f) def queue_prompt(workflow): resp = requests.post(f"{COMFY_API}/prompt", json={"prompt": workflow}) return resp.json() def build_workflow(template, shot): wf = json.loads(json.dumps(template)) # 假设节点ID 6 是正向提示词,7 是负向 wf["6"]["inputs"]["text"] = shot["prompt"] wf["7"]["inputs"]["text"] = shot["negative_prompt"] # 文件名前缀 wf["9"]["inputs"]["filename_prefix"] = f"shot_{shot['shot_id']:03d}" return wf def main(): template = load_workflow("workflow_api.json") with open("storyboard.json", 'r', encoding='utf-8') as f: shots = json.load(f) for shot in shots: wf = build_workflow(template, shot) result = queue_prompt(wf) print(f"Queued shot {shot['shot_id']}: {result}") time.sleep(1) # 避免队列过载 if __name__ == "__main__": main()节点ID要和你导出的工作流对应,打开workflow_api.json看每个节点的编号。这个脚本跑起来后,ComfyUI会按顺序渲染所有镜头,输出到output目录。
4.4 AnimateDiff镜头运动:让画面动起来
静态图出完后,用AnimateDiff给需要运动的镜头加动画。工作流在出图链路基础上加:
- AnimateDiff Loader:加载运动模块,选
mm_sd_v15_v2或SDXL对应的运动模块 - AnimateDiff Sampler:替换普通KSampler,设总帧数16-24,帧率8
- Context Options:设上下文长度16,避免长序列崩坏
运动提示词要配合镜头运动写,比如“推镜”就在prompt里加camera zoom in,“摇镜”加camera pan。AnimateDiff对运动的理解靠提示词引导,不写的话就是随机微动。
显存不够的话,把总帧数降到12,分辨率降到768x768,用--lowvram启动ComfyUI。实测24GB显存跑1024x1024、16帧、SDXL+AnimateDiff是够的,但批量跑要留余量。
4.5 后期拼接与配音
出完图后,把所有镜头按shot_id排序,导入剪映或达芬奇。每个镜头时长按分镜表的duration设置,运动镜头用AnimateDiff生成的序列帧。对白用Qwen生成的文本,走TTS工具配音,或者自己录。
这里有个提效技巧:让Qwen在分镜表里额外输出一列transition,标注镜头间的转场方式(切、叠化、划像),后期直接照着做,不用再想。
5. 常见问题与排查技巧实录
5.1 部署阶段的高频坑
Ollama下载模型太慢怎么办?这是最高频的问题。两个办法:一是配置国内镜像源,在Ollama的环境变量里设置OLLAMA_HOST指向镜像;二是手动下载GGUF格式的Qwen模型文件,放到Ollama模型目录,然后写一个Modelfile指向它:
FROM ./qwen2.5-14b-instruct-q4_k_m.gguf然后ollama create qwen-custom -f Modelfile。手动下载的好处是可以用下载工具加速,不受Ollama内置下载器限制。
ComfyUI启动报错缺依赖?秋叶整合包一般不会,手动部署常见。看报错信息缺哪个包就pip install哪个。如果遇到self_signed_cert_in_chain这类证书错误,通常是Python的SSL证书路径问题,重装certifi或者设置SSL_CERT_FILE环境变量指向正确的证书文件。
显存不够报OOM?按这个顺序降级:先降分辨率(1024→768→512),再降帧数(24→16→12),再换更小的基础模型(SDXL→SD1.5),最后加--lowvram或--medvram启动参数。别一上来就换模型,分辨率的影响往往更大。
5.2 出图质量与一致性问题
角色每张图长得不一样?检查三件事:IPAdapter权重是否够(0.6-0.8),参考图是否清晰正面,提示词里角色描述是否一致。如果还不行,就上LoRA。LoRA训练时注意数据集要多样,包含不同角度、表情、光照,否则过拟合后角色只会摆一个姿势。
画面风格不统一?在每条prompt末尾固定加同一段风格词,比如anime style, cel shading, vibrant colors, detailed background。负向提示词也统一,把不想要的风格都列进去。更彻底的办法是训一个风格LoRA,所有镜头都挂上。
AnimateDiff出来的动画闪烁?这是运动模块和基础模型不匹配导致的。SD1.5的运动模块不能用在SDXL上,反之亦然。确认你下载的运动模块版本和基础模型对应。另外上下文长度设太大也会闪,16是安全值。
5.3 批量流程的稳定性问题
ComfyUI队列卡死?批量提交时如果一次性把几百个任务全塞进去,ComfyUI可能卡死。脚本里加个延迟,或者用/queue端点查队列长度,超过阈值就等。我一般设队列上限20,超过就sleep。
输出文件名冲突?确保filename_prefix带shot_id且补零到三位,这样排序不会乱。如果同一镜头多次渲染,加时间戳后缀。
中途断电或崩溃?脚本要支持断点续跑。记录已完成的shot_id到一个done.txt,启动时先读这个文件跳过已完成的。这个习惯能省很多重跑时间。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查方向 | 解决 |
|---|---|---|---|
| Qwen输出非JSON | 指令不够强 | 检查系统提示 | 加“只输出JSON”并给示例 |
| 出图全黑 | VAE不匹配 | 换VAE | 用SDXL专用VAE |
| 角色换脸 | IPAdapter权重低 | 调权重 | 提到0.8或上LoRA |
| 动画闪烁 | 运动模块版本错 | 核对版本 | 换对应版本模块 |
| 队列卡死 | 提交过快 | 查队列长度 | 加延迟和上限 |
| 显存OOM | 分辨率/帧数高 | 降参数 | 逐级降分辨率帧数 |
| 下载慢 | 网络问题 | 换源 | 手动下载+Modelfile |
| 插件冲突 | 版本不兼容 | 看日志 | 逐个禁用排查 |
6. 进阶玩法与效率提升
6.1 LoRA微调实战:把主角锁死
LoRA训练是角色一致性的终极方案。流程:收集20-30张角色图(多角度、多表情、干净背景),用BLIP或Qwen给每张图打标,然后用Kohya或ComfyUI训练节点跑。关键参数:学习率1e-4,网络维度32,batch size 1,步数1500-2500。训练完的LoRA放models/loras,工作流里用LoraLoader节点加载,权重0.7-0.9。
训练数据质量比数量重要。10张高质量多角度图胜过50张糊图。打标时把角色固定特征(发色、瞳色、服装)写进每个标签,这样触发词才能稳定激活。
6.2 工作流模块化与复用
把工作流拆成模块:出图模块、动画模块、放大模块。每个模块存成独立JSON,脚本按需组合。这样改一个环节不影响其他环节。比如你想换基础模型,只改出图模块,动画模块不动。
ComfyUI的Group节点可以把一组节点折叠成一个组,界面清爽很多。再配合Custom-Scripts的节点颜色标记,复杂工作流也能管得过来。
6.3 效率提升的几个实操技巧
预加载模型。ComfyUI每次切换模型都要重新加载,批量跑同一模型时别中途换。把所有镜头按使用的模型分组,一组跑完再换下一组。
用API模式而非界面模式。界面模式渲染时你没法干别的,API模式可以后台跑,你该干嘛干嘛。
输出用PNG带元数据。ComfyUI保存的PNG里嵌了工作流信息,后期想复现某张图直接拖回界面就行。
定期清理output目录。一集漫剧几百张图,加上中间帧,硬盘很快就满。脚本里加个归档逻辑,完成的镜头移到备份目录。
6.4 从单集到系列化的扩展
单集跑通后,系列化要考虑角色库和场景库的复用。把每个角色的LoRA、参考图、触发词整理成角色卡,每个场景的提示词模板整理成场景卡。新一集开拍时,Qwen读角色卡和场景卡生成分镜,保证跨集一致性。
Qwen在这里可以做得更多:让它读上一集的剧情摘要,生成下一集的连贯剧本。把角色卡作为系统提示的一部分,Qwen输出的提示词就会自动带上角色特征词。这套玩法跑顺了,一个人就是一个漫剧工作室。
我在实际跑这套流水线时最大的体会是:瓶颈往往不在模型能力,而在流程的稳定性。Qwen偶尔输出格式跑偏、ComfyUI队列偶尔卡死、显存偶尔爆掉,这些琐碎问题比技术本身更耗时间。所以脚本里的容错和断点续跑一定要做扎实,宁可多写二十行代码,也别半夜起来重启任务。另外,角色一致性别指望一步到位,先用IPAdapter快速出片,把故事跑通,再回头给主角训LoRA精修,这个迭代顺序最省心。