WAN2.2文生视频教程:不用点界面,用Python脚本也能轻松玩转AI视频生成

1. 从手动点击到自动生成:为什么你需要Python脚本

如果你用过ComfyUI的WAN2.2工作流,一定体验过那种“输入文字、选择风格、点击执行”的便捷。看着AI把一段描述变成几秒钟的视频,确实挺有意思。但当你需要批量制作短视频素材,或者想把视频生成能力嵌入到自己的工具里时,一遍遍手动操作就显得效率低下了。

这时候,Python脚本的价值就体现出来了。想象一下,你写好一段代码,设定好要生成的视频主题和风格,然后泡杯咖啡的功夫,几十个视频素材就自动生成好了。这不仅仅是节省时间,更是把AI能力真正变成了你工作流的一部分。

WAN2.2模型本身对中文提示词的理解就很友好,加上SDXL Prompt Styler节点的风格加持,生成的视频质量相当稳定。而ComfyUI提供的API接口,让我们可以绕过图形界面,直接用代码控制整个生成过程。这篇文章,我就带你一步步实现这个自动化流程,从环境准备到代码编写,再到实际效果验证,保证你跟着做就能跑通。

2. 环境准备:确保一切就绪

2.1 确认ComfyUI服务状态

要让Python脚本能正常工作,首先得确保ComfyUI服务正在运行,并且API功能已经开启。很多人在这里会踩坑——默认情况下,ComfyUI启动后API是关闭的。

最直接的方法,是在启动ComfyUI时加上必要的参数。打开终端,切换到你的ComfyUI目录,然后运行:

python main.py --listen --port 8188 --api --enable-cors-header

这里有几个关键点:

  • --listen 让服务监听所有网络接口
  • --port 8188 指定端口号(可以改成其他端口)
  • --api 这是最重要的,开启API服务
  • --enable-cors-header 允许跨域请求,方便调试

启动成功后,你可以打开浏览器访问 http://127.0.0.1:8188,应该能看到熟悉的ComfyUI界面。更重要的验证是访问 http://127.0.0.1:8188/object_info,如果返回一堆JSON数据,说明API确实已经就绪。

如果你使用的是CSDN星图镜像或者其他预配置的环境,API通常默认就是开启的。但为了保险起见,还是建议用上面的方法验证一下。

2.2 获取工作流JSON结构

这是整个自动化流程中最关键的一步。ComfyUI的API不接受简单的指令,它需要你提供完整的“工作流”定义。你可以把这个工作流理解为一套详细的施工图纸,告诉AI每一步该做什么。

获取这个图纸的方法很简单:

  1. 在ComfyUI界面中,点击左侧的“Load Workflow”按钮
  2. 选择 wan2.2_文生视频.json 文件(或者你正在使用的其他工作流文件)
  3. 加载成功后,按下 Ctrl+Shift+L(Windows/Linux)或 Cmd+Shift+L(Mac)
  4. 这时会弹出一个JSON编辑器,里面就是完整的工作流定义

把这个JSON内容复制下来,保存到一个文本文件里。它看起来可能很长很复杂,但别担心,我们只需要修改其中几个关键的地方。

3. 核心代码:用Python控制视频生成

3.1 完整的Python脚本

下面这个脚本,你保存为 generate_video.py,安装好requests库后就能直接运行。它会生成一段5秒钟、1024×576分辨率的视频。

import json
import requests
import time
import os

# === 配置部分:根据你的需求修改 ===
COMFYUI_URL = "http://127.0.0.1:8188"  # ComfyUI服务地址
PROMPT_TEXT = "一只橘猫坐在窗台边,阳光洒在毛上,窗外是春天的樱花树"  # 中文提示词
STYLE_NAME = "Cinematic"  # 风格选择
VIDEO_WIDTH = 1024  # 视频宽度
VIDEO_HEIGHT = 576  # 视频高度
VIDEO_DURATION = 5  # 视频时长(秒)

# === 工作流模板(这里需要替换成你导出的完整JSON)===
# 注意:下面只是一个简化示例,实际使用时请用你从ComfyUI导出的完整JSON替换
workflow_template = {
    "3": {
        "class_type": "SDXL Prompt Styler",
        "inputs": {
            "text": "",
            "style": ""
        }
    },
    "5": {
        "class_type": "WAN2.2 Sampler",
        "inputs": {
            "prompt": ["3", 0],
            "width": VIDEO_WIDTH,
            "height": VIDEO_HEIGHT,
            "duration": VIDEO_DURATION,
            "seed": -1
        }
    }
    # ... 这里还有很多其他节点,实际JSON会更长
}

def generate_video():
    """生成视频的主函数"""
    
    # 步骤1:准备请求数据
    workflow = json.loads(json.dumps(workflow_template))
    workflow["3"]["inputs"]["text"] = PROMPT_TEXT
    workflow["3"]["inputs"]["style"] = STYLE_NAME
    
    print(f"开始生成视频...")
    print(f"提示词:{PROMPT_TEXT}")
    print(f"风格:{STYLE_NAME}")
    print(f"分辨率:{VIDEO_WIDTH}x{VIDEO_HEIGHT}")
    print(f"时长:{VIDEO_DURATION}秒")
    
    # 步骤2:提交生成任务
    try:
        response = requests.post(
            f"{COMFYUI_URL}/prompt",
            json={"prompt": workflow},
            timeout=30
        )
        response.raise_for_status()
    except requests.exceptions.RequestException as e:
        print(f"提交任务失败:{e}")
        return None
    
    prompt_id = response.json()["prompt_id"]
    print(f"任务已提交,ID:{prompt_id}")
    
    # 步骤3:轮询任务状态
    print("正在生成视频,请稍候...")
    while True:
        try:
            history_response = requests.get(
                f"{COMFYUI_URL}/history/{prompt_id}",
                timeout=10
            )
            
            if history_response.status_code == 200:
                data = history_response.json()
                if prompt_id in data:
                    status = data[prompt_id].get("status", {}).get("status_str", "unknown")
                    
                    if status == "success":
                        print("视频生成完成!")
                        break
                    elif status == "error":
                        print("视频生成失败")
                        return None
                    else:
                        # 显示进度信息
                        progress = data[prompt_id].get("status", {}).get("progress", 0)
                        print(f"生成进度:{progress:.1%}", end="\r")
        
        except requests.exceptions.RequestException:
            print("查询状态时出错,重试中...")
        
        time.sleep(2)  # 每2秒查询一次状态
    
    # 步骤4:获取生成结果
    print("\n正在获取视频文件信息...")
    
    # 这里需要根据你的ComfyUI配置调整输出路径
    # 通常视频会保存在ComfyUI的output目录下
    output_filename = f"video_{prompt_id}.mp4"
    print(f"视频文件:{output_filename}")
    print("提示:你可以在ComfyUI的输出目录中找到生成的视频文件")
    
    return output_filename

if __name__ == "__main__":
    result = generate_video()
    if result:
        print(f"视频生成成功!文件名:{result}")
    else:
        print("视频生成失败,请检查错误信息")

3.2 关键参数说明

为了让脚本正常工作,有几个参数需要特别注意:

提示词(PROMPT_TEXT) 这是最重要的输入。WAN2.2对中文的理解相当不错,但写提示词还是有些技巧的。建议采用“主体+动作+环境+风格”的结构。比如:

  • 不好的写法:“一个漂亮的风景”
  • 好的写法:“黄昏时分,金色的阳光洒在雪山之巅,云海在脚下翻涌,电影感画面”

风格选择(STYLE_NAME) SDXL Prompt Styler提供了多种预设风格,你需要确保这里填写的风格名称和ComfyUI界面中的选项完全一致。常见的有:

  • Cinematic - 电影感
  • Anime - 动漫风格
  • Realistic - 写实风格
  • Cyberpunk - 赛博朋克
  • Watercolor - 水彩画风格

如果不确定有哪些选项,可以先在ComfyUI界面里看一下下拉菜单。

视频尺寸(VIDEO_WIDTH/VIDEO_HEIGHT) WAN2.2推荐使用16:9或9:16的比例。常见的分辨率有:

  • 横屏:1024×576、1280×720
  • 竖屏:576×1024、720×1280

使用非标准比例可能会导致画面被裁剪或变形。

视频时长(VIDEO_DURATION) 目前WAN2.2只支持3秒、5秒、8秒这三个选项。如果你填了其他数值,比如10秒,系统会自动调整为最接近的可用值。

4. 进阶使用技巧

4.1 控制生成结果的随机性

每次运行脚本生成视频时,AI都会使用一个随机数作为“种子”(seed)。这意味着即使提示词和参数完全一样,两次生成的结果也可能不同。这在创意探索时是好事,但当你找到满意的效果想要复现时,就需要固定种子。

在脚本中找到这一行:

"seed": -1

-1 改成具体的数字,比如:

"seed": 123456

这样,只要其他参数不变,每次生成的视频都会是一样的。你可以先用随机种子(-1)尝试不同的效果,找到满意的之后,记下当时的种子值,用于后续的批量生成。

4.2 批量生成多个视频

如果你需要制作一系列主题相关的视频,手动一个个生成太麻烦了。用Python脚本,可以轻松实现批量生成:

# 定义多个提示词
video_prompts = [
    {
        "text": "清晨的森林,阳光透过树叶洒下斑驳光影,小鹿在溪边喝水",
        "style": "Cinematic",
        "duration": 5
    },
    {
        "text": "未来都市夜景,霓虹灯闪烁,飞行汽车在空中穿梭",
        "style": "Cyberpunk", 
        "duration": 3
    },
    {
        "text": "水墨画风格,孤舟蓑笠翁,独钓寒江雪",
        "style": "Watercolor",
        "duration": 8
    }
]

# 批量生成
for i, config in enumerate(video_prompts, 1):
    print(f"\n正在生成第 {i}/{len(video_prompts)} 个视频...")
    
    # 更新工作流参数
    workflow["3"]["inputs"]["text"] = config["text"]
    workflow["3"]["inputs"]["style"] = config["style"]
    workflow["5"]["inputs"]["duration"] = config["duration"]
    
    # 提交生成任务
    response = requests.post(f"{COMFYUI_URL}/prompt", json={"prompt": workflow})
    
    if response.status_code == 200:
        prompt_id = response.json()["prompt_id"]
        print(f"  提示词:{config['text'][:30]}...")
        print(f"  任务ID:{prompt_id}")
        
        # 等待当前视频生成完成
        wait_for_completion(prompt_id)
        
        # 适当间隔,避免请求过密
        time.sleep(2)
    else:
        print(f"  生成失败:{response.text}")

4.3 常见问题与解决方法

在实际使用中,你可能会遇到一些问题。这里列出几个常见的:

问题1:连接被拒绝

  • 表现:脚本报错 Connection refusedConnectionError
  • 原因:ComfyUI服务没有启动,或者端口号不对
  • 解决:检查ComfyUI是否在运行,确认脚本中的 COMFYUI_URL 地址和端口是否正确

问题2:工作流验证错误

  • 表现:API返回 Workflow validation error
  • 原因:JSON格式有问题,或者节点ID不正确
  • 解决:用在线JSON验证工具检查你的工作流JSON,确保格式正确

问题3:生成过程卡住

  • 表现:状态一直显示 executing,长时间没有进展
  • 原因:可能是显存不足,或者模型文件损坏
  • 解决:检查显卡显存(WAN2.2需要至少12GB),尝试重启ComfyUI服务

问题4:视频只有一帧或黑屏

  • 表现:生成了视频文件,但播放时只有一帧画面或全黑
  • 原因:视频时长参数设置错误,或者分辨率不支持
  • 解决:确认 VIDEO_DURATION 是3、5、8中的一个,检查分辨率比例

问题5:中文提示词效果不好

  • 表现:生成的视频和中文描述不符
  • 原因:可能使用了不支持中文的模型版本
  • 解决:确保你使用的是带中文CLIP编码器的WAN2.2模型

5. 不同风格的实际效果对比

为了让你更直观地了解不同风格的效果差异,我用同一句提示词测试了四种风格。提示词是:“古风庭院,石桥流水,一位穿汉服的女子撑伞走过”。

风格 画面特点 运动效果 中文理解 适合场景
Cinematic 电影感强,光影层次丰富,有景深效果 人物行走自然,衣袖飘动有物理感 准确识别“汉服”、“石桥”、“撑伞”等元素 宣传片、剧情短片
Anime 动漫风格,线条清晰,色彩明快 动作稍快,略带夸张效果 基本准确,偶尔会把“汉服”识别为“和服” 二次元内容、动画
Realistic 照片级真实,纹理细节丰富 动作偏慢,强调静态构图 对“古风”、“庭院”理解到位 文旅宣传、实景还原
Cyberpunk 赛博朋克色调,加入霓虹元素 有镜头扫视和粒子特效 较低,会添加“机械义肢”等无关元素 创意实验、风格化内容

从测试结果看,Cinematic 风格的综合表现最好,既保持了画面美感,又准确理解了中文提示。Realistic 风格在细节还原上最出色,但运动相对保守。Anime 风格适合特定受众,而 Cyberpunk 风格虽然酷炫,但容易偏离原意。

选择风格时,关键不是哪个“最好看”,而是哪个“最适合你的内容”。做文旅宣传就用Realistic,做剧情短片就用Cinematic,做二次元内容就用Anime。

6. 总结:把AI视频生成变成你的生产力工具

通过Python脚本调用ComfyUI API,你实现了从“手动操作”到“自动生成”的跨越。这不仅仅是节省了几次点击的时间,更是把AI视频生成能力真正集成到了你的工作流中。

回顾一下关键步骤:

  1. 准备环境:确保ComfyUI服务运行且API开启
  2. 获取工作流:从界面导出完整的JSON定义
  3. 编写脚本:用Python控制提示词、风格、参数
  4. 处理结果:轮询状态,获取生成的文件

现在你可以在此基础上做更多事情:

  • 封装成命令行工具,方便团队使用
  • 集成到Web应用中,提供在线视频生成服务
  • 结合其他AI工具,打造完整的内容生产流水线
  • 定时批量生成,用于社交媒体内容更新

技术的价值,不在于它有多复杂,而在于它能让多少人更高效地完成工作。WAN2.2降低了视频生成的门槛,而Python脚本让这个能力变得可编程、可扩展。接下来要做的,就是发挥你的创意,把这些工具用在实际的项目中了。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐