Nodes/ComfyUI Seedance/Animate 角色动作迁移
ComfyUI Node

Animate 角色动作迁移

One photo, one dance clip, no prompt

By T8mars·Created 3 months ago·Updated 3 days ago· 37
Animate 角色动作迁移
  • input_image
  • input_video
  • api_config
  • video
  • video_url
  • task_id
  • response
◄image_url►
◄video_url►
◄resolution720p►
◄ratioadaptive►
◄custom_ratio16:9►
◄frame_rate30►
◄max_frames0►
◄skip_frames0►
◄pose_methodvitpose►
◄normal_modetrue►
◄neck_correctionfalse►
◄pose_strength1.00►
◄camera_motionfalse►
◄camera_strength1.00►
◄mask_modefalse►
◄expression_strength0.80►
◄chest_motion_strength0.20►
◄skip_errorfalse►
◄seed0►

What this node actually is

There is no prompt box. That's the first thing everyone notices, and it's correct: you feed this node a character image and a motion video, and it gives you back a video of that character doing that motion. Nothing to type.

Locally, that job belongs to Wan 2.2 Animate, SCAIL-2 or Wan-Move. They work, and they're heavy - SCAIL-2 on a 4070 Ti is roughly 5–6 minutes for 81 frames, and a 5060 Ti 16GB ran 10 seconds of 360p in about 14 minutes, with the same complaints every time: face drift, body morphing, identity loss past 81 frames. This node is the hosted shortcut, and your GPU does the PNG encoding and nothing else.

That buys a result in about the time one API call takes, on any machine, including one with no discrete GPU. It costs per call, and both your character photo and your driving clip leave your machine for a third-party service - the standard trade in external-api-nodes.md.

How it works

The node is a thin client for one hosted model, animate-motion-transfer:

  1. Your local input_image becomes PNG and your input_video becomes bytes; both are uploaded. If you already filled image_url / video_url with public links, the upload is skipped - the only real reason those two string fields exist.
  2. It posts {model, images: [character_url], metadata: {video_url: [motion_url], resolution, ratio, frame_rate, pose_method}} to the pack's gateway.
  3. It polls until the task finishes, then downloads the MP4 as a normal ComfyUI VIDEO.

Pose extraction happens server-side, and pose_method picks the estimator (vitpose, sdpose, wuwupose). Funny thing: that intermediate skeleton is exactly what SCAIL-2 deliberately dropped, arguing a stick figure throws away depth and contact before the model sees them. vitpose is the default and the sane start; wuwupose has no footprint anywhere I could find, so try it and look.

Two bits of restraint worth knowing: only toggles you actually change get sent, and seed is cache-only - the model has no documented seed parameter, so it just controls whether ComfyUI reuses the last clip.

The inputs that matter

  • input_image or image_url - exactly one. Not both. Not a batch. The node validates this and will refuse a batch of two images.
  • input_video or video_url - exactly one. Same rule.
  • resolution - 480p, 720p (default), 1080p. At 1080p there's a hard cap: max_frames cannot exceed frame_rate × 10, so ten seconds at 30fps. Longer clips need a lower resolution.
  • max_frames - 0 means "whatever the API decides". Set a number to trim a long driving clip.
  • ratio - adaptive by default (follows your inputs), or a fixed ratio like 16:9, or custom plus custom_ratio in width:height form.
  • pose_strength, expression_strength, chest_motion_strength - the personality knobs, defaulting to 1.0, 0.8 and 0.2. Drop pose_strength when the output looks puppeted rather than acted.
  • skip_error - returns a placeholder video instead of killing the run.

Outputs are the pack's standard four: video (the local file - wire it to SaveVideo), video_url, task_id, and response for when something looks off and you want the raw JSON.

Install

ComfyUI Manager: search ComfyUI Seedance or seedance. Or:

comfy node install seedance

Manual, if you prefer:

cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/ComfyUI_Seedance.git
cd ..
python -m pip install -r custom_nodes/ComfyUI_Seedance/requirements.txt

That requirements file is one line - requests>=2.28. No model downloads, no CUDA anything. Restart ComfyUI and the nodes appear under Seedance.

Then you need a key, because nothing here runs locally. Add a Seedance API Config node with base_url set to https://api.seedance.nz and your token in api_key, and wire its api_config output in. Or set SEEDANCE_API_KEY, or drop a config/.env in the plugin folder. The examples folder ships animate-motion-transfer本地素材.json and animate-motion-transfer网址素材.json with the key deliberately blank.

Where people get burned

The key. Most "it doesn't work" reports are an empty key or a prompt pasted into api_key; the pack checks for ASCII and an sk- prefix and complains. The path. The plugin must sit at ComfyUI/custom_nodes/ComfyUI_Seedance - a renamed folder is the classic silent failure. TLS. Behind a corporate proxy or on a portable Windows build with a broken cert store, pip install -U requests certifi or point SEEDANCE_CA_BUNDLE at a CA file. Don't leave SEEDANCE_SSL_VERIFY=0 on. Expiring links. Result URLs are temporary; save what you want to keep.

And the honest caveat about this pack: the author runs an affiliate API shop, the README is partly a storefront, and seedance.nz has no Reddit footprint at all. It's a legitimately published pack on the Comfy Registry, but it's a reseller front-end. If you don't want reference photos of real people going through it, use the local models.

When to reach for it

Bring a character shot and a short driving clip, leave the prompt blank, keep pose_method on vitpose and resolution on 720p, and see what comes back before touching the other knobs. It's the fastest way to find out whether motion transfer suits the shot at all.

CategorySeedance

Inputs (22)

NameTypeDefaultDescription
image_urlSTRINGCharacter image URL; leave empty for input_image | 角色图片 URL;连接本地图时留空。
video_urlSTRINGMotion video URL; leave empty for input_video | 动作视频 URL;连接本地视频时留空。
resolutionCOMBO720p3 options: 480p, 720p, 1080p
ratioCOMBOadaptive10 options: adaptive, 1:1, 2:3, 3:2, 3:4, 4:3, +4
custom_ratioSTRING16:9Used only with custom ratio, positive width:height | 仅自定义画幅时使用。
frame_rateINT301–999999—
max_framesINT00–9999990 uses API default; 1080p permits at most frame_rate x 10 | 0 使用接口默认值;1080p 最多 10 秒。
skip_framesINT00–999999—
pose_methodCOMBOvitpose3 options: vitpose, sdpose, wuwupose
normal_modeBOOLEANtrue—
neck_correctionBOOLEANfalse—
pose_strengthFLOAT1.00—
camera_motionBOOLEANfalse—
camera_strengthFLOAT1.00—
mask_modeBOOLEANfalse—
expression_strengthFLOAT0.80—
chest_motion_strengthFLOAT0.20—
input_imageoptIMAGEOne local character image | 一张本地角色图。
input_videooptVIDEOOne local motion reference video | 一条本地动作参考视频。
api_configoptSEEDANCE_CONFIGConnect Seedance API Config or use SEEDANCE_API_KEY.
skip_erroroptBOOLEANfalseReturn a placeholder on failure | 出错时输出占位视频。
seedoptINT00–18446744073709550000ComfyUI cache seed. Fixed reuses the cached result while all other inputs stay unchanged; randomize/increment/decrement starts a new execution. This value is not sent to models without documented seed support. | ComfyUI 缓存种子;Fixed 在其他输入不变时复用缓存,随机、递增或递减会触发新任务。未声明支持 seed 的模型不会收到此参数。

Outputs (4)

NameTypeDescription
videoVIDEO—
video_urlSTRING—
task_idSTRING—
responseSTRING—