
最近在尝试用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.batN卡用户或相应的启动脚本。访问 脚本运行后在浏览器中打开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-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_keyMINIMAX_API_KEY, base_urlhttps://api.minimaxi.com/v1/, ) # 设置Group ID到请求头这是MiniMax平台的要求 self.minimax_client.default_headers { Authorization: fBearer {MINIMAX_API_KEY}, Group-Id: MINIMAX_GROUP_ID } # 2. 加载ComfyUI工作流模板 with open(workflow_template.json, r, encodingutf-8) as f: self.workflow_template json.load(f) # 3. 创建输出目录 self.output_dir output/storyboards os.makedirs(self.output_dir, exist_okTrue) def polish_script(self, raw_script): 使用MiniMax-H3润色剧本 print( 正在润色剧本...) system_prompt 你是一位专业的影视编剧。请对用户提供的剧本初稿进行润色增强其画面感、对话张力和情感冲击力。保持原有核心情节和人物设定。 try: response self.minimax_client.chat.completions.create( modelabab6.5s-chat, # 或使用最新的H3模型代号如 mini-max-01 messages[ {role: system, content: system_prompt}, {role: user, content: raw_script} ], temperature0.7, max_tokens2000 ) 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( modelabab6.5s-chat, # 同上替换为实际H3模型 messages[ {role: system, content: system_prompt}, {role: user, content: polished_script} ], temperature0.5, # 温度调低使输出更稳定 max_tokens4000, 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 fshot_{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, encodingutf-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, encodingutf-8) as f: json.dump(storyboard, f, ensure_asciiFalse, indent2) 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结构化分镜数据这是后续视频剪辑和配音的完美脚本。至此一个完整的本地短剧AI一键生成系统就搭建并运行成功了。6. 常见问题与排查思路在实际操作中你可能会遇到一些问题。以下是常见问题的排查指南。问题现象可能原因解决思路运行脚本报错ModuleNotFoundError: No module named openaiPython环境未安装openai库。在终端执行pip install openai。调用MiniMax API失败返回状态码 401 或 403API 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 无法连接脚本报ConnectionErrorComfyUI 服务未启动或地址/端口错误。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模型。本方案中LLMMiniMax-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等、图像模型或增加新的处理环节使其更贴合你的创作流水线。