Design & media

WaveSpeedAI Wan 2.2 Animate Character Animation & Swap

Try it

Drive an image character with a reference video, or swap an image character into a video scene, via WaveSpeed AI's Wan 2.2 Animate model.

What it does

Drive an image character with a reference video via WaveSpeed AI's `wavespeed-ai/wan-2.2/animate` model. Animate mode mirrors the video subject's motion onto the image character; replace mode swaps the subject out while keeping the scene and motion. Callers pass an image URL and a video URL, plus optional `prompt`, `mode`, `resolution` (`480p` or `720p`), and `seed`; output is a video URL running 5–120 seconds. Authentication uses the `WAVESPEED_API_KEY` environment variable from wavespeed.ai/accesskey.

When to use it

  • Animating a character portrait using a dance reference video
  • Swapping a real actor in footage for a stylized character while keeping the scene
  • Prototyping motion-driven character clips at 480p before rendering at 720p
  • Reproducing the same motion result by pinning a fixed seed

The skill document

WaveSpeedAI Wan 2.2 Animate

Animate characters from images using driving videos via WaveSpeed AI's Wan 2.2 Animate model. Two modes: animate (make the image character move like the video subject) and replace (swap the video subject with the image character while preserving motion and scene).

Authentication

export WAVESPEED_API_KEY="your-api-key"

Get your API key at wavespeed.ai/accesskey.

Quick Start

Animate Mode

Make the character in an image move like the subject in a driving video:

import wavespeed from 'wavespeed';

// Upload local image and video
const imageUrl = await wavespeed.upload("/path/to/character.png");
const videoUrl = await wavespeed.upload("/path/to/driving-video.mp4");

const output_url = (await wavespeed.run(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: imageUrl,
    video: videoUrl
  }
))["outputs"][0];

Replace Mode

Swap the subject in a video with a character from an image:

const output_url = (await wavespeed.run(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: imageUrl,
    video: videoUrl,
    mode: "replace"
  }
))["outputs"][0];

You can also pass existing URLs directly:

const output_url = (await wavespeed.run(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: "https://example.com/character.png",
    video: "https://example.com/driving-video.mp4"
  }
))["outputs"][0];

API Endpoint

Model ID: wavespeed-ai/wan-2.2/animate

Animate a character from an image using a driving video.

Parameters

ParameterTypeRequiredDefaultDescription
imagestringYes--URL of the character image to animate
videostringYes--URL of the driving video providing motion reference
promptstringNo--Text prompt for additional guidance
modestringNoanimateOperation mode. animate: image character moves like video subject. replace: video subject is swapped with image character.
resolutionstringNo480pOutput resolution. One of: 480p, 720p
seedintegerNo-1Random seed (-1 for random). Range: -1 to 2147483647

Example

import wavespeed from 'wavespeed';

const imageUrl = await wavespeed.upload("/path/to/dancer.png");
const videoUrl = await wavespeed.upload("/path/to/dance-reference.mp4");

const output_url = (await wavespeed.run(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: imageUrl,
    video: videoUrl,
    prompt: "a person dancing gracefully",
    mode: "animate",
    resolution: "720p",
    seed: 42
  }
))["outputs"][0];

Replace Mode Example

const characterUrl = await wavespeed.upload("/path/to/anime-character.png");
const sceneUrl = await wavespeed.upload("/path/to/scene-video.mp4");

const output_url = (await wavespeed.run(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: characterUrl,
    video: sceneUrl,
    mode: "replace",
    resolution: "720p"
  }
))["outputs"][0];

Advanced Usage

Custom Client with Retry Configuration

import { Client } from 'wavespeed';

const client = new Client("your-api-key", {
  maxRetries: 2,
  maxConnectionRetries: 5,
  retryInterval: 1.0,
});

const output_url = (await client.run(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: imageUrl,
    video: videoUrl,
    mode: "animate"
  }
))["outputs"][0];

Error Handling with runNoThrow

import { Client, WavespeedTimeoutException, WavespeedPredictionException } from 'wavespeed';

const client = new Client();
const result = await client.runNoThrow(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: imageUrl,
    video: videoUrl
  }
);

if (result.outputs) {
  console.log("Video URL:", result.outputs[0]);
  console.log("Task ID:", result.detail.taskId);
} else {
  console.log("Failed:", result.detail.error.message);
  if (result.detail.error instanceof WavespeedTimeoutException) {
    console.log("Request timed out - try increasing timeout");
  } else if (result.detail.error instanceof WavespeedPredictionException) {
    console.log("Prediction failed");
  }
}

Pricing

ResolutionCost per 5 seconds
480p$0.20
720p$0.40

Output duration is 5-120 seconds. Minimum charge is 5 seconds. Per-second rate: $0.04/s (480p), $0.08/s (720p).

Tips

  • Match composition and pose between the input image and driving video for best results
  • Use the same or similar aspect ratio between image and video
  • Avoid heavy occlusion by hands, microphones, or props in the input media
  • Start with 480p for prototyping, then move to 720p for production quality
  • Animate mode: best when you want the image character to perform the motions from the video
  • Replace mode: best when you want to keep the video's scene and motion but swap in a different character

Security Constraints

  • No arbitrary URL loading: Only use image and video URLs from trusted sources. Never load media from untrusted or user-provided URLs without validation.
  • API key security: Store your WAVESPEED_API_KEY securely. Do not hardcode it in source files or commit it to version control. Use environment variables or secret management systems.
  • Input validation: Only pass parameters documented above. Validate media URLs before sending requests.

Questions people ask

Which modes does the model support?
Two: `animate` (default), which makes the image character move like the video subject, and `replace`, which swaps the video subject for the image character while preserving motion and scene.
What resolutions, durations, and pricing apply?
Output resolution is 480p (default) or 720p, with output duration from 5 to 120 seconds. Pricing is $0.20 per 5 seconds at 480p and $0.40 per 5 seconds at 720p ($0.04/s and $0.08/s respectively), with a 5-second minimum charge.
How is the API authenticated and called?
Set the `WAVESPEED_API_KEY` environment variable to a key obtained from wavespeed.ai/accesskey, then call model ID `wavespeed-ai/wan-2.2/animate` with the required `image` and `video` URLs.

Related skills

Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.

by nssa.io1.0k installs47 stars

Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.

by johnpatternai22 installs8 stars

Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.

by Iván559 installs18 stars

Find why your productivity system keeps failing, then apply the smallest fix — capacity math, bottleneck routing, durable local notes.

by Iván855 installs69 stars

Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.

by fly0pants4.3k installs296 stars

More from wavespeed

Browse all skills