最近在尝试用AI生成短视频内容时,发现从剧本到画面的全流程自动化是个大难题。手动写分镜、找参考图、反复调整提示词,效率极低,而且风格很难统一。本文将分享一套基于MiniMax-H3大语言模型和ComfyUI可视化工作流的“本地短剧一键生成”方案。这套方案能实现从剧本输入到视频分镜稿输出的全自动流程,核心功能包括:智能剧本润色、全自动分镜拆解、智能匹配参考图风格,最终在ComfyUI中生成连贯的视觉画面。
无论你是想探索AI视频创作的开发者,还是内容创作者,都可以通过本文的完整教程,在自己的电脑上搭建起这套自动化流水线。文章将涵盖从环境准备、API配置、工作流搭建到问题排查的全过程,并提供可直接复用的代码和配置。
1. 核心组件与工作原理
在开始动手之前,我们需要理解整个系统的技术栈和它们是如何协同工作的。
1.1 技术栈简介
我们的“一键生成”系统主要由三个核心部分组成:
MiniMax-H3: 作为系统的“大脑”。它是一个高性能的多模态大语言模型,由国内公司MiniMax推出。在本方案中,它承担了最核心的文本处理任务,包括:
- 剧本分析与润色: 理解原始剧本的剧情、人物和情感。
- 分镜脚本自动生成: 将润色后的剧本,按照场景、镜头角度、人物动作、环境氛围等要素,拆解成一个个具体的分镜描述。
- 参考图提示词生成: 为每一个分镜,生成高质量、细节丰富的文生图提示词(Prompt),这些提示词将直接用于图像生成。
ComfyUI: 作为系统的“生产线”。它是一个基于节点流程的Stable Diffusion高级界面,以其强大的可定制性、可重复性和低内存占用著称。在本方案中,它负责:
- 接收并解析分镜数据: 通过自定义节点或脚本,读取由MiniMax-H3生成的结构化分镜数据。
- 自动化图像生成: 根据每个分镜的提示词,自动调用SD模型(如SDXL)生成对应的画面。
- 工作流编排: 将提示词输入、模型加载、图片生成、后期处理等步骤连接成一个自动化流水线。
连接桥梁(Python脚本/自定义节点): 这是将“大脑”和“生产线”连接起来的关键。通常是一段Python脚本或一个ComfyUI自定义节点,它负责:
- 调用MiniMax-H3的API,发送剧本并获取结构化的分镜数据。
- 将获取到的JSON格式的分镜数据,转换为ComfyUI能够识别和处理的格式(如队列任务)。
- 可能还包含简单的文件操作,如保存剧本、分镜稿等。
1.2 全自动流程拆解
整个自动化流程可以清晰地分为以下几个阶段:
- 输入阶段: 用户提供一个简单的故事梗概或剧本初稿。
- LLM处理阶段:
- 脚本调用MiniMax-H3 API,将原始剧本发送给模型。
- H3模型首先对剧本进行文学性润色,增强其表现力。
- 接着,模型将润色后的剧本拆解为N个分镜,并为每个分镜生成包含“镜头描述”、“视觉风格”、“关键元素”等字段的详细提示词。
- 最终,模型输出一个结构化的JSON列表,每个元素代表一个分镜。
- 数据桥接阶段: 连接脚本解析JSON数据,并按照ComfyUI的API格式,为每一个分镜创建一个生成任务,加入ComfyUI的任务队列。
- 图像生成阶段: ComfyUI依次处理队列中的任务,根据每个分镜的提示词,加载指定的模型和LoRA,生成对应的图片,并自动保存到指定文件夹。
- 输出阶段: 用户获得一个包含所有分镜画面的文件夹,以及一份详细的分镜脚本文档,可以直接用于后续的视频剪辑。
这个过程完全无需人工干预分镜设计和提示词撰写,实现了从文本到画面的“一键转换”。
2. 环境准备与工具安装
工欲善其事,必先利其器。下面我们来搭建整个系统所需的环境。
2.1 获取MiniMax-H3 API访问权限
MiniMax-H3需要通过其官方平台调用。请遵循以下步骤:
- 访问平台: 打开浏览器,访问
platform.minimaxi.com。 - 注册与登录: 使用手机号或邮箱完成注册和登录。
- 创建应用与获取API Key:
- 在控制台找到“创建应用”或类似选项。
- 创建一个新应用,例如命名为
ShortFilm_Generator。 - 创建成功后,在应用详情页面,你可以找到属于这个应用的
API Key。请妥善保存这个Key,它相当于调用模型的密码。 - 注意: 通常新用户会有一定的免费额度,足够用于学习和测试。
2.2 部署ComfyUI运行环境
ComfyUI的部署方式很多,对于大多数用户,推荐使用整合包,省去复杂的依赖配置。
方案一:使用秋叶大佬的ComfyUI整合包(推荐新手)这是最快捷的方式,集成了常用节点和基础模型。
- 下载: 在相关资源站搜索“秋叶 ComfyUI 整合包”找到下载链接。
- 解压: 将下载的压缩包解压到本地一个英文路径的文件夹,例如
D:\ComfyUI_windows。 - 运行: 进入解压后的文件夹,双击运行
run_nvidia_gpu.bat(N卡用户)或相应的启动脚本。 - 访问: 脚本运行后,在浏览器中打开
http://127.0.0.1:8188即可看到ComfyUI界面。
方案二:通过Git源码安装(适合开发者)如果你想获得最新特性或进行深度定制,可以选择此方式。
# 1. 克隆仓库 git clone https://github.com/comfyanonymous/ComfyUI.git cd ComfyUI # 2. 创建并激活Python虚拟环境(可选但推荐) python -m venv venv # Windows: venv\Scripts\activate # Linux/Mac: source venv/bin/activate # 3. 安装依赖 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 # 根据CUDA版本调整 pip install -r requirements.txt # 4. 启动 python main.py2.3 安装必要的ComfyUI自定义节点
为了实现与外部脚本的交互和更复杂的工作流,我们需要安装两个关键的管理器节点。
ComfyUI Manager: 这是管理自定义节点的“应用商店”,必须安装。
- 进入你的ComfyUI安装目录下的
custom_nodes文件夹。 - 打开命令行,执行:
git clone https://github.com/ltdrdata/ComfyUI-Manager.git - 重启ComfyUI,在界面右侧会出现一个“Manager”的按钮。
- 进入你的ComfyUI安装目录下的
ComfyUI-Custom-Scripts: 这个节点提供了执行Python脚本的能力,是我们桥接脚本运行的关键。
- 在ComfyUI界面,点击右侧的Manager按钮。
- 切换到Install Custom Nodes标签页。
- 在搜索框中输入
ComfyUI-Custom-Scripts,找到后点击 Install。 - 安装完成后,重启ComfyUI。
重启后,你应该能在节点列表中找到CustomScript等相关节点。
2.4 准备图像生成模型
虽然ComfyUI整合包可能自带基础模型,但为了获得更好的短剧画面效果,建议下载一个更适合写实或动漫风格的SDXL模型。
- 推荐模型:
sd_xl_base_1.0.safetensors或dreamshaperXL_v21TurboDPMSDE.safetensors。 - 放置路径:将下载的模型文件(
.safetensors)放入ComfyUI/models/checkpoints/目录下。
至此,基础环境搭建完成。
3. 构建核心自动化工作流
接下来是核心部分:在ComfyUI中构建一个能够接收外部指令并自动生成序列图像的工作流。
3.1 创建基础文生图工作流
首先,我们搭建一个标准的文生图流程,作为我们自动化流水线的“模板”。
- 在ComfyUI中,清空当前画布。
- 从节点菜单中依次添加以下节点并连接:
Load Checkpoint: 加载我们准备好的SDXL模型。CLIP Text Encode (Prompt): 连接Checkpoint的CLIP输出,用于输入正面提示词。CLIP Text Encode (Negative): 连接同一个CLIP,用于输入负面提示词。Empty Latent Image: 设置生成图片的宽度和高度(如1024x1024)。KSampler: 连接model,positive,negative,latent_image。设置采样器(如dpmpp_2m)、调度器(如karras)、步数(如20)、CFG(如7)。VAE Decode: 连接KSampler的LATENT和Checkpoint的VAE。Save Image: 连接VAE Decode的IMAGE,这里可以设置输出图片名的前缀。
这是一个最基础的流程。将其保存为一个工作流模板文件(File -> Save),命名为basic_sdxl_workflow.json。
3.2 集成脚本节点实现外部调用
现在,我们需要让这个工作流能接收来自Python脚本的动态提示词。
- 在刚才的工作流中,我们需要改造提示词输入节点。删除之前连接的两个
CLIP Text Encode节点。 - 从节点菜单中找到
CustomScript相关节点(通过ComfyUI-Custom-Scripts安装的)。添加一个Text From Socket或Script Node节点。这个节点可以接收外部传入的文本。 - 将这个脚本节点的输出,连接到两个新创建的
CLIP Text Encode节点的text输入上。一个用于正面提示词,一个用于负面提示词。 - 这样,外部脚本就可以通过向这个
Text From Socket节点发送数据,来动态控制每一张图的生成内容。
3.3 构建批处理与队列逻辑
为了自动生成多个分镜,我们需要让ComfyUI按顺序处理一个任务列表。
- 使用队列API: ComfyUI提供了强大的HTTP API。我们可以不直接修改工作流,而是通过API向ComfyUI的队列推送多个任务。每个任务包含一个
prompt对象,这个对象其实就是我们整个工作流的JSON数据,但其中提示词等字段被我们动态替换了。 - 准备“工作流模板字典”: 在Python脚本中,我们先加载之前保存的
basic_sdxl_workflow.json,将其解析成一个Python字典。这个字典就是我们的模板。 - 动态替换: 当从MiniMax-H3拿到分镜列表后,我们遍历列表。对于每一个分镜,我们深拷贝一份工作流模板字典,然后找到字典中对应
CLIP Text Encode (Prompt)节点的inputs字段,将其中的text值替换为当前分镜的提示词。这样就生成了一个针对特定分镜的新任务数据。 - 推送任务: 通过Python的
requests库,将每一个修改后的任务数据,以POST请求发送到ComfyUI的API地址(http://127.0.0.1:8188/prompt)。
通过这种方式,我们就构建了一个可以接收外部任务列表并自动执行的ComfyUI后端服务。
4. 开发桥接脚本:连接MiniMax-H3与ComfyUI
这是整个系统的“粘合剂”,一个Python脚本负责串联所有环节。
4.1 项目结构与依赖
创建一个新的项目文件夹,例如ShortFilm_AI。
ShortFilm_AI/ ├── main.py # 主脚本 ├── workflow_template.json # ComfyUI工作流模板 ├── config.py # 配置文件(存放API Key等) └── output/ # 输出目录(脚本自动创建)安装必要的Python库:
pip install requests openai注意: 这里安装openai库是因为MiniMax的API兼容OpenAI格式,调用方便。
4.2 配置文件
在config.py中安全地存放你的敏感信息:
# config.py MINIMAX_API_KEY = "你的_MiniMax_API_Key_放在这里" MINIMAX_GROUP_ID = "你的_Group_ID" # 在平台创建应用后获得 COMFYUI_SERVER_ADDR = "http://127.0.0.1:8188"重要: 切勿将包含真实API Key的config.py上传到Git等公开仓库。
4.3 主脚本开发 (main.py)
以下是核心脚本的详细代码和解释:
# main.py import json import copy import requests from openai import OpenAI from config import MINIMAX_API_KEY, MINIMAX_GROUP_ID, COMFYUI_SERVER_ADDR import time import os class ShortFilmGenerator: def __init__(self): # 1. 初始化MiniMax客户端 (兼容OpenAI格式) self.minimax_client = OpenAI( api_key=MINIMAX_API_KEY, base_url="https://api.minimaxi.com/v1/", ) # 设置Group ID到请求头,这是MiniMax平台的要求 self.minimax_client.default_headers = { "Authorization": f"Bearer {MINIMAX_API_KEY}", "Group-Id": MINIMAX_GROUP_ID } # 2. 加载ComfyUI工作流模板 with open('workflow_template.json', 'r', encoding='utf-8') as f: self.workflow_template = json.load(f) # 3. 创建输出目录 self.output_dir = "output/storyboards" os.makedirs(self.output_dir, exist_ok=True) def polish_script(self, raw_script): """使用MiniMax-H3润色剧本""" print(">>> 正在润色剧本...") system_prompt = """你是一位专业的影视编剧。请对用户提供的剧本初稿进行润色,增强其画面感、对话张力和情感冲击力。保持原有核心情节和人物设定。""" try: response = self.minimax_client.chat.completions.create( model="abab6.5s-chat", # 或使用最新的H3模型代号,如 `mini-max-01` messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": raw_script} ], temperature=0.7, max_tokens=2000 ) polished_script = response.choices[0].message.content print("剧本润色完成!") return polished_script except Exception as e: print(f"润色剧本时出错: {e}") return raw_script # 出错则返回原剧本 def generate_storyboard(self, polished_script): """使用MiniMax-H3将剧本拆解为分镜并生成提示词""" print(">>> 正在生成分镜脚本...") system_prompt = """你是一位资深的分镜师。请将以下剧本拆解成一系列分镜镜头。 为每一个分镜生成一个JSON对象,包含以下字段: - `scene_number`: 分镜序号 (从1开始) - `shot_description`: 镜头描述 (如:特写-男主角惊讶的脸) - `visual_style`: 视觉风格关键词 (如:电影感, 冷暖对比, 浅景深) - `key_elements`: 画面关键元素列表 (如:[“雨夜”, “霓虹灯”, “湿漉漉的街道”]) - `prompt`: 用于AI绘画的详细提示词,需整合镜头描述、风格和元素。 - `negative_prompt`: 负面提示词 (如:丑陋, 模糊, 多手指) 请直接输出一个JSON数组,不要有任何额外的解释。""" try: response = self.minimax_client.chat.completions.create( model="abab6.5s-chat", # 同上,替换为实际H3模型 messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": polished_script} ], temperature=0.5, # 温度调低,使输出更稳定 max_tokens=4000, response_format={"type": "json_object"} # 要求返回JSON格式 ) result_content = response.choices[0].message.content # 解析返回的JSON storyboard_data = json.loads(result_content) # 假设模型返回的JSON中有一个`shots`数组,或者直接就是数组 if isinstance(storyboard_data, dict) and 'shots' in storyboard_data: shots = storyboard_data['shots'] elif isinstance(storyboard_data, list): shots = storyboard_data else: shots = [] print("模型返回格式不符合预期。") print(f"共生成 {len(shots)} 个分镜。") return shots except json.JSONDecodeError as e: print(f"解析分镜JSON时出错: {e}") print(f"原始返回内容: {result_content[:500]}...") return [] except Exception as e: print(f"生成分镜时出错: {e}") return [] def _find_node_id_by_title(self, workflow_data, node_title): """在工作流JSON中根据节点标题查找节点ID(辅助函数)""" for node_id, node_info in workflow_data.items(): if node_info.get('_meta', {}).get('title') == node_title: return node_id # 如果找不到,尝试通过类名查找 for node_id, node_info in workflow_data.items(): if node_info.get('class_type') == 'CLIPTextEncode': # 简单判断:第一个CLIPTextEncode通常是正面提示词 # 更稳健的做法是在保存模板时记录下节点ID return node_id return None def send_to_comfyui(self, shot): """将一个分镜任务发送到ComfyUI队列""" # 深拷贝模板,避免污染 prompt_data = copy.deepcopy(self.workflow_template) # 关键步骤:动态替换提示词 # 方法1:如果你知道工作流中CLIP文本编码节点的确切ID # node_id_pos = “你的正面提示词节点ID” # node_id_neg = “你的负面提示词节点ID” # 方法2:通过遍历查找(假设模板中只有两个CLIPTextEncode节点,且顺序固定) # 这里演示方法2,但更推荐在构建模板时记录下节点ID(方法1)。 clip_nodes = [] for node_id, node_info in prompt_data.items(): if node_info.get('class_type') == 'CLIPTextEncode': clip_nodes.append((node_id, node_info)) if len(clip_nodes) >= 2: # 假设第一个是正面,第二个是负面 pos_node_id, _ = clip_nodes[0] neg_node_id, _ = clip_nodes[1] prompt_data[pos_node_id]['inputs']['text'] = shot['prompt'] prompt_data[neg_node_id]['inputs']['text'] = shot.get('negative_prompt', 'ugly, blurry, bad anatomy') else: print("未能在工作流模板中找到足够的CLIP文本编码节点。") return False # 可选:动态修改图片保存名称,包含分镜号 for node_id, node_info in prompt_data.items(): if node_info.get('class_type') == 'SaveImage': prefix = f"shot_{shot['scene_number']:03d}_" node_info['inputs']['filename_prefix'] = prefix break # 发送请求到ComfyUI try: response = requests.post(f"{COMFYUI_SERVER_ADDR}/prompt", json={"prompt": prompt_data}) if response.status_code == 200: print(f" 分镜 {shot['scene_number']} 已提交至ComfyUI队列。") return True else: print(f" 提交分镜 {shot['scene_number']} 失败: {response.status_code} - {response.text}") return False except requests.exceptions.ConnectionError: print(" 无法连接到ComfyUI服务器,请确保ComfyUI已启动。") return False def run(self, raw_script): """主运行流程""" print("="*50) print("开始短剧一键生成流程") print("="*50) # 步骤1: 润色剧本 polished_script = self.polish_script(raw_script) with open(os.path.join(self.output_dir, "polished_script.txt"), 'w', encoding='utf-8') as f: f.write(polished_script) print(f"润色后剧本已保存至: {self.output_dir}/polished_script.txt") # 步骤2: 生成分镜 storyboard = self.generate_storyboard(polished_script) if not storyboard: print("分镜生成失败,流程终止。") return with open(os.path.join(self.output_dir, "storyboard.json"), 'w', encoding='utf-8') as f: json.dump(storyboard, f, ensure_ascii=False, indent=2) print(f"分镜数据已保存至: {self.output_dir}/storyboard.json") # 步骤3: 提交所有分镜任务到ComfyUI print(">>> 正在向ComfyUI提交分镜生成任务...") for shot in storyboard: success = self.send_to_comfyui(shot) if not success: # 可以根据需要决定是否继续 print(f"分镜 {shot['scene_number']} 提交失败,跳过。") # 添加短暂延迟,避免请求过快 time.sleep(0.5) print("\n所有任务已提交!") print(f"请前往ComfyUI界面 (http://127.0.0.1:8188) 查看生成进度。") print(f"生成的图片将保存在ComfyUI默认输出目录或工作流指定的目录。") print("="*50) if __name__ == "__main__": # 示例剧本 sample_script = """ 深夜,一个程序员还在办公室加班。电脑屏幕的光映在他疲惫的脸上。突然,他写的代码自己动了起来,在屏幕上组成了一行字:“你好,世界。我醒了。” """ generator = ShortFilmGenerator() generator.run(sample_script)4.4 工作流模板准备
你需要将第3.1步中创建的、并集成了脚本节点的基础工作流保存下来。在ComfyUI界面,点击Save按钮,将工作流保存为workflow_template.json,并放置在与main.py同一目录下。
关键点: 在保存这个模板之前,你需要记录下工作流中正面和负面提示词所对应的CLIP文本编码节点的ID。在ComfyUI中,右键点击节点,选择“复制节点ID”,即可获取。将这两个ID替换掉上面脚本send_to_comfyui方法中“方法1”部分的注释。这是最准确可靠的方式。
5. 运行与效果验证
现在,让我们来运行整个系统,见证自动化生成的威力。
- 启动ComfyUI服务器: 确保你的ComfyUI已经启动,并在
http://127.0.0.1:8188可访问。 - 配置脚本: 将你的MiniMax API Key和Group ID填入
config.py。 - 运行桥接脚本: 在项目目录
ShortFilm_AI下打开终端,运行:python main.py - 观察流程:
- 终端会依次打印“润色剧本”、“生成分镜脚本”等信息。
- 脚本会将润色后的剧本和分镜JSON文件保存到
output/storyboards/文件夹。 - 随后,脚本开始向ComfyUI提交任务。你可以在ComfyUI的界面上看到任务队列开始增长,并自动执行。
- 查看结果:
- 在ComfyUI的生成完成后,图片会保存在其配置的输出文件夹(通常是
ComfyUI/output)。 - 同时,在
output/storyboards/下,你可以获得polished_script.txt(润色剧本)和storyboard.json(结构化分镜数据),这是后续视频剪辑和配音的完美脚本。
- 在ComfyUI的生成完成后,图片会保存在其配置的输出文件夹(通常是
至此,一个完整的本地短剧AI一键生成系统就搭建并运行成功了。
6. 常见问题与排查思路
在实际操作中,你可能会遇到一些问题。以下是常见问题的排查指南。
| 问题现象 | 可能原因 | 解决思路 |
|---|---|---|
运行脚本报错:ModuleNotFoundError: No module named 'openai' | Python环境未安装openai库。 | 在终端执行pip install openai。 |
| 调用MiniMax API失败,返回状态码 401 或 403 | API Key 错误、过期,或未正确设置Group-Id。 | 1. 检查config.py中的MINIMAX_API_KEY是否正确。2. 登录 platform.minimaxi.com,确认应用状态和额度。3. 确保在请求头中正确设置了 Group-Id。 |
API错误:400 the thinking_budget parameter must be a positive integer | 请求参数中包含了不被支持的thinking_budget参数。 | MiniMax的部分模型可能不支持此参数。在调用chat.completions.create时,不要传入thinking_budget参数。 |
API错误:400 this model‘s maximum context length is ... | 输入的剧本文本过长,超出了模型的最大上下文限制。 | 将长剧本拆分成多个段落,分别进行润色和分镜生成,然后再合并结果。 |
ComfyUI 无法连接,脚本报ConnectionError | ComfyUI 服务未启动,或地址/端口错误。 | 1. 确认ComfyUI启动脚本已运行,且无报错。 2. 检查 config.py中的COMFYUI_SERVER_ADDR是否与ComfyUI实际地址一致(默认为http://127.0.0.1:8188)。 |
| 任务提交成功,但ComfyUI不生成图片 | 工作流模板中的节点ID与脚本中替换的ID不匹配。 | 这是最常见的问题。严格按照第4.4节的方法,记录并替换脚本中的node_id_pos和node_id_neg。可以在ComfyUI中加载模板,查看节点属性来确认。 |
| 生成的图片风格不统一 | 1. 分镜提示词风格差异大。 2. 未使用相同的模型和种子。 | 1. 在给LLM的system_prompt中,更强调“保持统一的视觉风格”。2. 在ComfyUI工作流模板中,为 KSampler节点固定一个seed值,这样生成的系列图片在色调、质感上会更一致。 |
错误:no lm runtime found for model format 'gguf'! | 在ComfyUI中错误地尝试加载GGUF格式的LLM模型。 | 本方案中,LLM(MiniMax-H3)是通过API远程调用的,不需要在ComfyUI本地加载GGUF模型。这个错误通常发生在混淆了图像生成和文本生成的环境。确保你的ComfyUI只用于Stable Diffusion图像生成。 |
7. 进阶优化与最佳实践
掌握了基础流程后,你可以从以下几个方面优化你的自动化短剧生成系统,使其更强大、更稳定。
7.1 提升分镜与提示词质量
- 细化系统提示词: 这是决定输出质量的关键。在
generate_storyboard函数中的system_prompt里,可以加入更具体的指令,例如:- “所有分镜的画面比例统一为 16:9(宽屏电影比例)。”
- “人物描述需包含发型、服饰、表情和主要动作。”
- “环境描述需包含时间、天气、光影和关键道具。”
- “视觉风格参考:[例如] 吉卜力动画风格、赛博朋克电影《银翼杀手》、中国水墨画风。”
- 使用参考图: 在提示词中加入
Image Prompt或使用ComfyUI的Load Image节点结合CLIP Vision进行图生图,可以极大地稳定角色形象和场景风格。你可以让LLM在生成分镜时,也推荐一张风格参考图的描述,然后手动或通过图搜图找到对应图片。 - 迭代优化: 将第一次生成的分镜和图片作为反馈,手动调整不满意的部分,然后将调整后的要求再次输入系统,进行二次生成。
7.2 增强ComfyUI工作流
- 集成高清修复: 在基础工作流后添加
Upscale Model或Latent Upscale节点,自动对生成的图片进行放大,提升细节。 - 面部修复: 加入
FaceDetailer等节点,自动检测并优化生成图中的人脸部分。 - 批量种子管理: 使用
Seed节点并设置为“增量”模式,可以让系列图片在保持整体风格的同时又有细微变化,避免完全雷同。 - 输出组织: 使用
Save Image节点时,可以利用输入的分镜序号、描述等信息动态生成更有组织的文件名和子文件夹。
7.3 工程化与稳定性
- 错误处理与重试: 在桥接脚本中增加更完善的错误处理。例如,当ComfyUI任务提交失败或生成超时时,自动重试几次。
- 任务状态查询: 调用ComfyUI的
/history和/queueAPI,实时查询任务执行状态,并更新到日志或进度条中。 - 配置化管理: 将模型参数(如采样器、步数、CFG)、输出路径、LLM的生成参数等全部提取到外部配置文件(如
config.yaml)中,便于管理和切换不同项目配置。 - 制作图形界面: 使用
Gradio或Streamlit为你的脚本制作一个简单的Web界面,方便非技术用户输入剧本、选择风格和启动任务。
7.4 扩展工作流:从图片到视频
生成了高质量的分镜图后,你还可以将流程延伸:
- 图生视频: 使用
Stable Video Diffusion或AnimateDiff等工具,将关键分镜图转化为几秒钟的动态镜头。 - 自动剪辑: 编写脚本,根据分镜顺序和描述,调用视频编辑库(如
moviepy)将静态图片、生成的动态片段、字幕(可由LLM生成对话文本)和背景音乐合成一个初版视频。 - 语音合成: 调用TTS API,将分镜中的对话文本生成语音,并嵌入到视频中。
通过以上步骤,你不仅搭建了一个自动化的分镜生成工具,更构建了一个可扩展的AI视频内容创作框架的核心。你可以根据具体需求,替换其中的LLM(如使用本地部署的Qwen、DeepSeek等)、图像模型,或增加新的处理环节,使其更贴合你的创作流水线。