Seedream 5.0 Pro 提供開始 | 画像ジェネレーターで試す →

Steady Dancer

wavespeed-ai /

SteadyDancer is a 14B-parameter human image animation framework that transforms static images into coherent dance videos. Features first-frame preservation, robust identity consistency, and temporal coherence for realistic motion generation. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

motion-control
入力

待機中

$0.21回あたり·~50 / $10

サンプルすべて表示

関連モデル

README

wavespeed-ai/steady-dancer — Image-to-Video Motion Transfer

Steady Dancer is WaveSpeedAI’s motion-transfer model: you upload a character image and a driving video, and it generates a new clip where your character follows the motion from the video while keeping a stable face, outfit, and overall identity. Ideal for dance edits, cosplay previews, and social short-form content.

What is SteadyDancer?

SteadyDancer is a 14-billion parameter human image animation framework that converts static images into coherent dance motion videos. Built on diffusion models, it uses an Image-to-Video paradigm with key innovations for high-quality animation.

✨ Highlights

  • Image-driven identity – Uses your uploaded image as the main reference for face, outfit, and body shape.
  • Video-driven motion – Copies camera movement and body motion from the driving video.
  • Stability-focused – Designed to keep faces, limbs, and outfit details consistent across frames.
  • Resolution choices – Output at 480p for quick previews or 720p for higher-quality clips.
  • Prompt-guided style (optional) – Add a short text prompt to nudge colour, atmosphere, or style, or leave blank for neutral transfer.

🧩 Parameters

  • image* – Required. The character / subject image to insert into the motion.
  • video* – Required. Driving video whose motion and camera you want to reuse.
  • prompt – Optional text description for style / mood (e.g. “cinematic lighting, soft film grain, vivid colours”).
  • resolution – Output resolution: 480p or 720p.
  • seed-1 for random; any other integer for reproducible results.

💰 Pricing

Pricing is based on video length, resolution, and billed in 5-second blocks, with:

  • Minimum billable length: 5 seconds
  • Maximum billable length: 120 seconds (anything longer is charged as 120 s)
  • Base price: $0.2 per 5 seconds at 480p

Effective rates:

ResolutionEffective price per second5 s clip10 s clip60 s clip120 s clip (cap)
480p$0.04 / s$0.20$0.40$2.40$4.80
720p$0.08 / s (×2)$0.40$0.80$4.80$9.60

Internally, the system:

  • Takes your video duration (capped at 120 s),
  • Rounds it into 5-second blocks,
  • Multiplies by the base price, and
  • Applies a ×2 multiplier for 720p.

🚀 How to Use

  1. Upload image – choose the face / character you want to animate.
  2. Upload video – select the motion source clip.
  3. (Optional) Enter a prompt to guide overall look and mood.
  4. Choose resolution (start with 480p for fast tests; switch to 720p for final export).
  5. (Optional) Set a fixed seed if you want to reproduce or slightly tweak the same take later.
  6. Click Run and download the generated video once completed.

🎯 Recommended Use Cases

  • Dance and performance remixes using a static character or avatar.
  • Cosplay or outfit previews based on a single photo.
  • VTuber / virtual idol short clips for social platforms.
  • Quick pre-viz for ad concepts or character motion tests.

💡 Tips & Notes

  • For best results, keep framing similar between the image and driving video (e.g. both full-body or both mid-shot).
  • Avoid extremely fast motion, strong occlusions, or very busy backgrounds in the driving video for first tests.
  • If faces look unstable, try a clearer input image or reduce extreme camera shake in the driving clip.

Reference

Try other models and see the difference

  • fun-control — A playful motion-remix model built on ’s Wan 2.2, for controllable character and camera movement from simple prompts.
  • wan-animate — A general animation model powered by ’s Wan 2.2, turning text or images into smooth, high-quality short videos.
注記:本サイトは第三者が提供するAIモデルを使用しています。

Steady Dancer API — Quick start

Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/wavespeed-ai/steady-dancer with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Steady Dancer below.

HTTP example
set -euo pipefail

: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"

REQUEST_BODY=$(cat <<'JSON'
{
    "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
    "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
    "resolution": "480p",
    "seed": -1
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/steady-dancer" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $WAVESPEED_API_KEY" \
  -d "$REQUEST_BODY")

TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; then
  printf 'Submission response did not contain a prediction id
' >&2
  exit 1
fi
RESULT_URL=$(printf '%s' "$TASK" | jq -r '.urls.get // empty')
if [ -z "$RESULT_URL" ]; then
  RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
fi

# 2. Poll until the prediction finishes.
while true; do
  RESPONSE=$(curl --silent --show-error --fail-with-body "$RESULT_URL" \
    -H "Authorization: Bearer $WAVESPEED_API_KEY")
  RESULT=$(printf '%s' "$RESPONSE" | jq 'if has("data") then .data else . end')
  STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
  case "$STATUS" in
    completed) printf '%s\n' "$RESULT" | jq '.outputs'; break ;;
    failed|cancelled|timeout) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
    created|processing) sleep 2 ;;
    *) printf 'Unexpected status: %s
' "$STATUS" >&2; exit 1 ;;
  esac
done
Node.js example
const submitUrl = "https://api.wavespeed.ai/api/v3/wavespeed-ai/steady-dancer";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');

async function requestJson(url, options = {}) {
  const response = await fetch(url, options);
  if (!response.ok) throw new Error(await response.text());
  return response.json();
}

// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
        "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
        "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
        "resolution": "480p",
        "seed": -1
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = task.urls?.get ||
  `https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;

// 2. Poll until the prediction finishes.
while (true) {
  const resultBody = await requestJson(resultUrl, {
    headers: { "Authorization": `Bearer ${apiKey}` },
  });
  const result = resultBody.data ?? resultBody;
  if (result.status === "completed") {
    console.log(result.outputs);
    break;
  }
  if (["failed", "cancelled", "timeout"].includes(result.status)) throw new Error(JSON.stringify(result));
  if (!["created", "processing"].includes(result.status)) throw new Error("Unexpected status: " + result.status);
  await new Promise(resolve => setTimeout(resolve, 2000));
}
Python example
import json
import os
import time
from urllib.request import Request, urlopen

api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
    "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
    "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
    "resolution": "480p",
    "seed": -1
}

def request_json(url, data=None):
    request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
    with urlopen(request) as response:
        return json.load(response)

# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/wavespeed-ai/steady-dancer", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
    raise RuntimeError("Submission response did not contain a prediction id")
result_url = task.get("urls", {}).get("get") or f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"

# 2. Poll until the prediction finishes.
while True:
    result_body = request_json(result_url)
    result = result_body.get("data", result_body)
    status = result.get("status")
    if status == "completed":
        print(result.get("outputs", []))
        break
    if status in {"failed", "cancelled", "timeout"}:
        raise RuntimeError(result)
    if status not in {"created", "processing"}:
        raise RuntimeError(f"Unexpected status: {status}")
    time.sleep(2)

Steady Dancer API — Frequently asked questions

What is the Steady Dancer API?

Steady Dancer is a WaveSpeedAI model for pose / motion driven video, exposed as a REST API on WaveSpeedAI. SteadyDancer is a 14B-parameter human image animation framework that transforms static images into coherent dance videos. Features first-frame preservation, robust identity consistency, and temporal coherence for realistic motion generation. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.

How do I call the Steady Dancer API?

POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates production-oriented Python, JavaScript, and cURL examples with timeouts, transient-error handling, and safe GET retries. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/wavespeed-ai/steady-dancer.

How much does Steady Dancer cost per run?

Steady Dancer starts at $0.20 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.

What inputs does Steady Dancer accept?

Key inputs: `prompt`, `image`, `video`, `resolution`, `seed`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/wavespeed-ai/steady-dancer.

How long does Steady Dancer take to generate?

Median end-to-end generation time on WaveSpeedAI is around 203 seconds per request, based on recent successful runs. Queue time varies with global demand; live status is visible in the prediction record.

Can I use Steady Dancer outputs commercially?

Commercial usage rights depend on the model's license, set by its provider (WaveSpeedAI). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.

Steady Dancer | AI Motion Control Video API | WaveSpeedAI