AI教你做视频-2 Python中调用ComfyUI的API

引言

ComfyUI是一个基于Stable Diffusion和其他AI模型的图形化界面,允许用户通过节点式工作流创建复杂的图像和视频生成任务。工作流通常以JSON格式保存,包含各个节点及其连接的详细信息。用户提供了一个名为“2Video文生视频-API.json”的JSON文件,定义了一个视频生成工作流,包括文本编码、模型加载、视频帧生成、解码、上采样和最终视频组装等步骤。本报告旨在生成Python代码,解析此JSON文件并触发ComfyUI工作流的“Queue”按钮行为,即执行工作流。

AI教你做视频-2 Python中调用ComfyUI的API

方法与实现

为了实现这一目标,我们需要使用ComfyUI的API,具体是通过HTTP请求向服务器发送工作流JSON。以下是详细的实现步骤和相关技术细节。

工作流JSON的解析

提供的JSON文件是一个描述视频生成管道的结构化数据。根据附件的摘要,它包含多个节点,例如:

  • 文本编码节点(如加载T5文本编码器“umt5-xxl-enc-bf16.safetensors”)。
  • 模型加载节点(如视频生成模型“Wan2_1-T2V-14B_fp8_e4m3fn.safetensors”和VAE解码模型)。
  • 采样和生成节点(如使用15步CFG缩放6的采样器生成视频帧)。
  • 视频处理节点(如使用RIFE插值模型增强帧率和RealESRGAN上采样模型提升分辨率)。
  • 最终输出节点(如将处理后的帧组装为30帧/秒的MP4视频)。

这些节点通过输入输出连接形成一个完整的管道,适合从文本描述生成高质量视频。

在Python中,我们可以使用json.load()函数从文件中读取这个JSON,得到一个Python字典。例如:

import json
with open('2Video文生视频-API.json', 'r', encoding='utf-8') as f:
    workflow_json = json.load(f)
ComfyUI API的调用

ComfyUI提供了一个RESTful API,允许通过HTTP请求控制工作流执行。关键端点是“/prompt”,用于将工作流放入队列执行。根据相关文档(例如Hosting a ComfyUI Workflow via API),我们需要发送一个POST请求,包含以下参数:

  • prompt:整个工作流JSON。
  • client_id:一个标识客户端的唯一字符串,通常使用UUID生成。
  • server_address:ComfyUI服务器的地址,默认为“localhost:8188”。

以下是实现代码:python

import json
import urllib.request
import uuid
def queue_workflow(workflow_json, client_id, server_address):
    payload = {
        "prompt": workflow_json,
        "client_id": client_id
    }
    headers = {'Content-Type': 'application/json'}
    data = json.dumps(payload).encode('utf-8')
    url = f"http://{server_address}/prompt"
    req = urllib.request.Request(url, data=data, headers=headers)
    with urllib.request.urlopen(req) as response:
        response_data = response.read().decode('utf-8')
        return json.loads(response_data)
# 主函数
def main():
    # 读取工作流JSON
    with open('2Video文生视频-API.json', 'r', encoding='utf-8') as f:
        workflow_json = json.load(f)
    
    # 生成客户端ID
    client_id = uuid.uuid4().hex
    
    # 设置服务器地址
    server_address = "localhost:8188"
    
    # 触发工作流
    response = queue_workflow(workflow_json, client_id, server_address)
    print("API响应:", response)
if name == "__main__":
    main()
API响应的处理

执行后,API通常返回一个JSON响应,包含prompt_id和状态信息(如“QUEUED”)。这个prompt_id可以用于后续查询工作流执行状态(通过“/history/{prompt_id}”端点),但对于本问题,触发执行已足够。

注意事项
  • 服务器启动:确保ComfyUI已启动并启用了API功能(通常通过命令行参数–api启动)。
  • JSON格式:提供的JSON应为ComfyUI工作流格式。如果是“API格式”,可以直接使用;如果是普通保存格式,可能需要额外处理(但从附件描述来看,它似乎已经是正确的格式)。
  • 错误处理:实际应用中应添加错误处理,例如网络错误或JSON解析错误,但此处为简化未包含。
  • 服务器地址:如果ComfyUI运行在其他位置(如远程服务器),需相应调整server_address。

技术细节

代码中的 url = f”http://{server_address}/prompt” 确实是用于调用 ComfyUI 的 API

详细解释

ComfyUI 提供了一个内置的 RESTful API,允许用户通过 HTTP 请求与服务器交互,从而实现工作流的自动化执行、管理和状态查询等功能。在你的代码中,url = f”http://{server_address}/prompt” 是构造了一个指向 ComfyUI API 的“/prompt”端点的 URL,用于提交工作流并触发其执行,相当于在界面上点击“Queue”按钮。

具体机制

  1. 服务器地址 (server_address)
    1. 默认情况下,server_address 被设置为 “localhost:8188″,这是 ComfyUI 在本地运行时的默认地址和端口(8188 是 ComfyUI 的默认端口)。
    2. 如果 ComfyUI 运行在远程服务器上,你需要将 server_address 修改为实际的 IP 地址或域名,例如 “192.168.1.100:8188” 或 “example.com:8188″。
  2. 端点 “/prompt”
    1. “/prompt” 是 ComfyUI API 的一个关键端点,专门用于接收工作流(prompt)并将其放入执行队列。
    2. 当你向这个端点发送一个 POST 请求时,ComfyUI 服务器会解析请求中的 JSON 数据(包含工作流内容和客户端 ID),然后开始处理工作流,生成相应的输出(如图像或视频)。
  3. HTTP 请求
    1. 在代码中,urllib.request.Request 创建了一个 POST 请求,包含:
      • URL:http://{server_address}/prompt(例如 http://localhost:8188/prompt)。
      • 数据:payload(包含 “prompt” 和 “client_id” 的 JSON 数据)。
      • 头部:{‘Content-Type’: ‘application/json’},表明发送的数据是 JSON 格式。
    2. urllib.request.urlopen(req) 执行请求并返回服务器的响应。
  4. 功能等价
    1. 这个 API 调用等同于在 ComfyUI 的图形界面中加载工作流 JSON 文件并点击“Queue”按钮。不同之处在于,API 方式允许自动化和远程操作,而无需手动交互。

响应示例

服务器通常会返回一个 JSON 格式的响应,表明工作流是否成功加入队列。例如:json

{
  "prompt_id": "abc123-def456-ghi789",
  "number": 1,
  "node_errors": []
}
  • prompt_id:一个唯一的标识符,用于跟踪该工作流的执行状态。
  • node_errors:如果工作流中有配置错误,这里会列出相关信息。

前提条件

为了让这个调用生效,需要确保:

  • ComfyUI 服务器已启动:通过命令行运行 python main.py(或类似命令)启动 ComfyUI,且默认监听在 localhost:8188。
  • API 功能启用:通常无需额外配置,ComfyUI 默认支持 API,但某些版本可能需要通过 –api 参数显式启用。
  • 网络可达:如果不是本地运行,需确保服务器地址可访问,且防火墙未阻止端口。

验证方法,你可以手动测试这个 API,例如使用 curl 或 Postman:

curl -X POST http://localhost:8188/prompt -H "Content-Type: application/json" -d '{"prompt": {...}, "client_id": "test123"}'

如果返回类似上述的 JSON 响应,说明 API 调用成功。

结论

通过上述Python代码,可以成功解析“2Video文生视频-API.json”文件,并通过ComfyUI的API触发工作流的执行,模拟点击“Queue”按钮的行为。确保ComfyUI服务器已正确启动并配置API功能,代码即可正常运行。

关键引用

RA/SD 衍生者AI训练营。发布者:稻草人,转载请注明出处:https://www.shxcj.com/ai%e6%95%99%e4%bd%a0%e5%81%9a%e8%a7%86%e9%a2%91-2-python%e4%b8%ad%e8%b0%83%e7%94%a8comfyui%e7%9a%84api/

(0)
上一篇 1天前
下一篇 11小时前

相关推荐

发表回复

登录后才能评论
本文授权以下站点有原版访问授权 https://www.shxcj.com https://www.2img.ai https://www.2video.cn