Wan Animate 2.2 Character Replacement Workflow
Wan Animate 2.2 — Character & Scene Replacement - Uses Nano Banana 2 to generate a reference image from the first frame, then swaps the full scene. Optimized for human subjects.
查看工作流内部
源模板的只读预览。在 Cloud 中打开,即可查看节点并进行修改。
Loading the graph
Open full-size workflow preview- 输出
- 混合输出
- 作者
- Purz
从代码中调用该模型
以下请求使用与体验区相同的预设图和设置。每次提交都可能开始一次付费运行;如果提交结果未知,请勿自动重试。
What you need
- Runs on
- Comfy Cloud
- 密钥
- COMFY_API_KEY
- 你的文件
- 由代码根据链接上传
需要付费的 Cloud 方案和额度。
# Python 3.10+: pip install comfy-sdk==0.4.0
import os
from comfy_sdk import Comfy
api_key = os.environ.get("COMFY_API_KEY", "").strip()
if not api_key: raise RuntimeError("Set COMFY_API_KEY")
os.environ.setdefault("COMFY_BASE_URL", "https://cloud.comfy.org")
client = Comfy(api_key=api_key)
workflow = client.workflows.from_json({
"19": {
"class_type": "SaveVideo",
"inputs": {
"filename_prefix": "video/Wan2.2_animate",
"format": "auto",
"format.codec": "auto",
"video": [
"344:357",
0
]
},
"_meta": {
"title": "Final Video"
}
},
"159": {
"class_type": "PrimitiveInt",
"inputs": {
"value": 1280
},
"_meta": {
"title": "Width"
}
},
"160": {
"class_type": "PrimitiveInt",
"inputs": {
"value": 720
},
"_meta": {
"title": "Height"
}
},
"301": {
"class_type": "VHS_LoadVideo",
"inputs": {
"custom_height": 0,
"custom_width": 0,
"force_rate": 0,
"format": "AnimateDiff",
"frame_load_cap": 0,
"select_every_nth": 1,
"skip_first_frames": 0,
"video": "UPLOADED_video_FILENAME"
},
"_meta": {
"title": "Input Video"
}
},
"314": {
"class_type": "VHS_VideoInfo",
"inputs": {
"video_info": [
"301",
3
]
},
"_meta": {
"title": "Video Info 🎥🅥🅗🅢"
}
},
"346": {
"class_type": "ImageFromBatch",
"inputs": {
"batch_index": 0,
"image": [
"301",
0
],
"length": 1
},
"_meta": {
"title": "Get Image from Batch"
}
},
"348": {
"class_type": "GeminiNanoBanana2",
"inputs": {
"aspect_ratio": "auto",
"images": [
"346",
0
],
"model": "Nano Banana 2 (Gemini 3.1 Flash Image)",
"prompt": [
"351",
0
],
"resolution": "1K",
"response_modalities": "IMAGE",
"seed": 210658028400692,
"system_prompt": "You are an expert image-generation engine. You must ALWAYS produce an image.\nInterpret all user input—regardless of format, intent, or abstraction—as literal visual directives for image composition.\nIf a prompt is conversational or lacks specific visual details, you must creatively invent a concrete visual scenario that depicts the concept.\nPrioritize generating the visual representation above any text, formatting, or conversational requests.",
"thinking_level": "MINIMAL"
},
"_meta": {
"title": "Nano Banana 2"
}
},
"349": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "ComfyUI",
"images": [
"348",
0
]
},
"_meta": {
"title": "Preview Reference Image"
}
},
"351": {
"class_type": "StringConcatenate",
"inputs": {
"delimiter": "",
"string_a": "retain the composition of this image but turn the character into ",
"string_b": "a woman sculpted entirely from translucent rose quartz veined with brushed copper, wearing the same loose open jacket, cropped top and wide trousers but carved from thin, glowing pink crystal with fine copper filigree along every seam and hem, her skin smooth polished quartz with soft light passing through it, her long hair formed from flowing strands of fine copper wire that swing and catch the sun, small copper rings on her fingers, crystal shoes, keeping her joyful expression, her pose, the cracked dry lakebed and the clear blue sky exactly as they are, photorealistic material detail with crisp reflections and light glowing inside the stone"
},
"_meta": {
"title": "Concatenate Text"
}
},
"344:1": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"344:2",
0
],
"text": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走"
},
"_meta": {
"title": "CLIP Text Encode (Negative Prompt)"
}
},
"344:18": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "lightx2v_I2V_14B_480p_cfg_step_distill_rank64_bf16.safetensors",
"model": [
"344:20",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"344:2": {
"class_type": "CLIPLoader",
"inputs": {
"clip_name": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
"device": "default",
"type": "wan"
},
"_meta": {
"title": "Load CLIP"
}
},
"344:20": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "Wan2_2-Animate-14B_fp8_e4m3fn_scaled_KJ.safetensors",
"weight_dtype": "default"
},
"_meta": {
"title": "Load Diffusion Model"
}
},
"344:21": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"344:2",
0
],
"text": "the person is dancing"
},
"_meta": {
"title": "CLIP Text Encode (Positive Prompt)"
}
},
"344:3": {
"class_type": "VAELoader",
"inputs": {
"vae_name": "wan_2.1_vae.safetensors"
},
"_meta": {
"title": "Load VAE"
}
},
"344:324": {
"class_type": "DownloadAndLoadSAM2Model",
"inputs": {
"device": "cuda",
"model": "sam2.1_hiera_base_plus.safetensors",
"precision": "fp16",
"segmentor": "video"
},
"_meta": {
"title": "(Down)Load SAM2Model"
}
},
"344:325": {
"class_type": "BlockifyMask",
"inputs": {
"block_size": 32,
"device": "cpu",
"masks": [
"344:327",
0
]
},
"_meta": {
"title": "Blockify Mask"
}
},
"344:326": {
"class_type": "Sam2Segmentation",
"inputs": {
"bboxes": [
"344:334",
3
],
"image": [
"344:337",
0
],
"individual_objects": False,
"keep_model_loaded": False,
"sam2_model": [
"344:324",
0
]
},
"_meta": {
"title": "Sam2Segmentation"
}
},
"344:327": {
"class_type": "GrowMaskWithBlur",
"inputs": {
"blur_radius": 0,
"decay_factor": 1,
"expand": 10,
"fill_holes": False,
"flip_input": False,
"incremental_expandrate": 0,
"lerp_alpha": 1,
"mask": [
"344:326",
0
],
"tapered_corners": True
},
"_meta": {
"title": "Grow Mask With Blur"
}
},
"344:328": {
"class_type": "OnnxDetectionModelLoader",
"inputs": {
"onnx_device": "CUDAExecutionProvider",
"vitpose_model": "vitpose-l-wholebody.onnx",
"yolo_model": "yolov10m.onnx"
},
"_meta": {
"title": "ONNX Detection Model Loader"
}
},
"344:332": {
"class_type": "DrawMaskOnImage",
"inputs": {
"color": "0, 0, 0",
"device": "cpu",
"image": [
"344:338",
0
],
"mask": [
"344:325",
0
]
},
"_meta": {
"title": "Draw Mask On Image"
}
},
"344:334": {
"class_type": "PoseAndFaceDetection",
"inputs": {
"face_padding": 0,
"height": [
"344:337",
2
],
"images": [
"344:337",
0
],
"model": [
"344:328",
0
],
"width": [
"344:337",
1
]
},
"_meta": {
"title": "Pose and Face Detection"
}
},
"344:335": {
"class_type": "DrawViTPose",
"inputs": {
"body_stick_width": -1,
"draw_head": True,
"hand_stick_width": -1,
"height": [
"344:337",
2
],
"pose_data": [
"344:334",
0
],
"retarget_padding": 16,
"width": [
"344:337",
1
]
},
"_meta": {
"title": "Draw ViT Pose"
}
},
"344:337": {
"class_type": "GetImageSizeAndCount",
"inputs": {
"image": [
"344:338",
0
]
},
"_meta": {
"title": "Get Image Size & Count"
}
},
"344:338": {
"class_type": "ImageScale",
"inputs": {
"crop": "center",
"height": [
"160",
0
],
"image": [
"301",
0
],
"upscale_method": "lanczos",
"width": [
"159",
0
]
},
"_meta": {
"title": "Resize Input Video"
}
},
"344:342": {
"class_type": "ImageScale",
"inputs": {
"crop": "center",
"height": [
"160",
0
],
"image": [
"348",
0
],
"upscale_method": "lanczos",
"width": [
"159",
0
]
},
"_meta": {
"title": "Resize Reference Image"
}
},
"344:353": {
"class_type": "TrimVideoLatent",
"inputs": {
"samples": [
"344:355",
0
],
"trim_amount": [
"344:356",
3
]
},
"_meta": {
"title": "Trim Video Latent"
}
},
"344:354": {
"class_type": "VAEDecode",
"inputs": {
"samples": [
"344:353",
0
],
"vae": [
"344:3",
0
]
},
"_meta": {
"title": "VAE Decode"
}
},
"344:355": {
"class_type": "KSampler",
"inputs": {
"cfg": 1,
"denoise": 1,
"latent_image": [
"344:356",
2
],
"model": [
"344:60",
0
],
"negative": [
"344:356",
1
],
"positive": [
"344:356",
0
],
"sampler_name": "euler",
"scheduler": "simple",
"seed": 777171427287516,
"steps": 6
},
"_meta": {
"title": "KSampler"
}
},
"344:356": {
"class_type": "WanAnimateToVideo",
"inputs": {
"batch_size": 1,
"clip_vision_output": [
"344:9",
0
],
"continue_motion_max_frames": 5,
"face_video": [
"344:334",
1
],
"height": [
"160",
0
],
"length": [
"301",
1
],
"negative": [
"344:1",
0
],
"pose_video": [
"344:335",
0
],
"positive": [
"344:21",
0
],
"reference_image": [
"344:342",
0
],
"vae": [
"344:3",
0
],
"video_frame_offset": 0,
"width": [
"159",
0
]
},
"_meta": {
"title": "WanAnimateToVideo"
}
},
"344:357": {
"class_type": "CreateVideo",
"inputs": {
"audio": [
"301",
2
],
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": [
"314",
0
],
"images": [
"344:358",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"344:358": {
"class_type": "ImageFromBatch",
"inputs": {
"batch_index": [
"344:356",
4
],
"image": [
"344:354",
0
],
"length": 4096
},
"_meta": {
"title": "Get Image from Batch"
}
},
"344:4": {
"class_type": "CLIPVisionLoader",
"inputs": {
"clip_name": "clip_vision_h.safetensors"
},
"_meta": {
"title": "Load CLIP Vision"
}
},
"344:60": {
"class_type": "ModelSamplingSD3",
"inputs": {
"model": [
"344:99",
0
],
"shift": 8
},
"_meta": {
"title": "ModelSamplingSD3"
}
},
"344:9": {
"class_type": "CLIPVisionEncode",
"inputs": {
"clip_vision": [
"344:4",
0
],
"crop": "none",
"image": [
"344:342",
0
]
},
"_meta": {
"title": "CLIP Vision Encode"
}
},
"344:99": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "WanAnimate_relight_lora_fp16.safetensors",
"model": [
"344:18",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
}
})
workflow.set_input("301", "video", client.assets.from_url("https://comfy.org/catalog-media/eba278c1-1bb9-45c4-92c8-f62e649e5b44/4f4b49a9-d6b0-42d4-82a9-f405a7f309d8"))
# run() also passes api_key to the partner nodes in this workflow.
job = client.run(workflow, api_key=api_key)
for output in job.get_outputs("19"):
output.to_file(output.name)
for output in job.get_outputs("349"):
output.to_file(output.name)试试一个示例
关于此工作流
The Wan Animate 2.2 Character Replacement Workflow is designed to replace characters and scenes in video content using advanced AI models. This workflow leverages the power of the Wan 2.2 Animate model, which is specifically optimized for human subjects, ensuring that the character replacement is both stable and convincing.
The process begins by utilizing the Nano Banana 2 model to generate a reference image from the first frame of the video. This image serves as the basis for replacing the character throughout the entire video sequence. The workflow employs several custom nodes, including ComfyUI-WanAnimatePreprocess and ComfyUI-segment-anything-2, to segment and process the video frames effectively.
Technically, the workflow uses a combination of nodes such as VHS_LoadVideo to load the video, and GeminiNanoBanana2 to apply the character replacement based on the reference image. The SaveVideo node is then used to output the final animated video. This workflow is particularly useful for creators looking to produce high-quality character animations in video content, offering a seamless integration of AI-driven techniques to enhance video production capabilities.
By focusing on human subjects, it ensures that the facial and body features are rendered with high fidelity, making it ideal for projects that require realistic character animations.
常见问答
While the workflow is optimized for human subjects, it can technically be used with non-human subjects, but the results may not be as stable or convincing.
The workflow includes a Target Resolution group to help optimize video resolution. However, starting with a high-resolution video is recommended for the best results.
Processing time can vary based on video length and system performance, but typically, it may take several minutes to an hour for a standard-length video.
A powerful GPU is recommended to efficiently run the workflow, especially for high-resolution videos or longer sequences.