MiniMax H3 Open Weights | Try in Video Generator →

Skyreels V3 Pro Multi Avatar | AI Digital Human API

skywork-ai/

SkyReels V3 Pro Multi Avatar is a high-quality AI talking avatar video generation model that creates multi-speaker avatar videos from one image, multiple audio tracks, and bounding boxes. Ready-to-use REST inference API for group avatar videos, digital humans, virtual presenters, dialogue scenes, education content, marketing creatives, and professional multi-avatar video workflows with simple integration, no coldstarts, and affordable pricing.

digital-human
Input

Idle

$0.12per run·~83 / $10

ExamplesView all

Let the people speak.

Related Models

README

Skywork AI SkyReels V3 Pro Multi Avatar

Skywork AI SkyReels V3 Pro Multi Avatar generates a two-speaker avatar video from a single first-frame image plus separate left and right audio tracks. It is designed for higher-quality multi-character speaking scenes, with stronger realism, smoother facial animation, and more polished lip-sync than the Standard variant.

Why Choose This?

  • Two-speaker avatar generation Animate two speakers from a single scene image with separate audio tracks for each side.

  • Higher-quality multi-avatar performance The Pro variant is built for stronger realism, cleaner lip-sync, and more polished facial animation.

  • Separate left and right speaker control Upload different audio clips for the left and right speakers to drive each character independently.

  • Prompt-guided scene behavior Add a prompt to guide mood, scene setup, speaking style, or camera feel.

  • Speaker detection control Use bboxes_type to control whether speaker detection is based on body or face.

  • Production-ready workflow Suitable for conversations, interviews, presenter scenes, and other multi-character speaking video workflows.

Parameters

ParameterRequiredDescription
promptYesText prompt describing the scene, action, camera, or avatar behavior.
first_frame_imageYesInput image used as the first frame and visual source for the two-speaker scene.
left_audioYesAudio for the speaker on the left side of the image.
right_audioYesAudio for the speaker on the right side of the image.
bboxes_typeNoBounding box target type for speaker detection. Supported values: body or face. Default: body.

How to Use

  1. Upload the first-frame image — provide the scene image containing the two speakers.
  2. Upload left speaker audio — add the audio for the person on the left side of the image.
  3. Upload right speaker audio — add the audio for the person on the right side of the image.
  4. Write your prompt — describe the speaking behavior, mood, scene setup, or camera style.
  5. Choose speaker detection type (optional) — use body or face depending on how you want the model to identify each speaker.
  6. Submit — run the model and download the generated video.

Example Prompt

Let the two speakers talk naturally in a professional office setting, with subtle head movement, realistic facial expressions, and stable identity for both people.

Pricing

Pricing is based on the combined duration of both audio tracks.

Billing Rules

  • Base price is $0.12 per second
  • Total billed duration = left audio duration + right audio duration
  • Total price = $0.12 × (left audio duration + right audio duration)
  • prompt, first_frame_image, and bboxes_type do not affect pricing

Example Costs

Left AudioRight AudioTotal Billed DurationCost
5s5s10s$1.20
8s6s14s$1.68
10s10s20s$2.40
12s15s27s$3.24

Best Use Cases

  • Two-person conversations — Create dialogue scenes with separate speaking control for each person.
  • Interview videos — Animate interviewer and guest from a single scene image.
  • Presenter pairs — Generate two-host explainer or announcement videos.
  • Character conversations — Build short dialogue clips for storytelling or social content.
  • Virtual spokesperson scenes — Create multi-speaker brand or business communication videos.

Pro Tips

  • Use a clear image where the left and right speakers are visually distinct.
  • Upload clean audio for both sides to improve lip-sync and speaking clarity.
  • Use face when facial positioning is more reliable than full-body placement.
  • Use body when the characters are farther from the camera or their full pose matters.
  • Keep the prompt simple and focused on speaking behavior, mood, or scene intent.
  • Make sure the left and right audio assignments match the actual positions of the people in the image.

Notes

  • prompt, first_frame_image, left_audio, and right_audio are required.
  • bboxes_type defaults to body.
  • Pricing depends on the sum of both audio durations.
  • This workflow is intended for two-speaker avatar video generation from a single scene image.

Related Models

Note:This website uses AI models provided by third parties.

Skyreels v3 Pro Multi Avatar API — Quick start

Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/skywork-ai/skyreels-v3-pro/multi-avatar 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 Skyreels v3 Pro Multi Avatar below.

HTTP example
set -euo pipefail

: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"

REQUEST_BODY=$(cat <<'JSON'
{
    "prompt": "A cinematic shot of a city at sunset, soft golden light",
    "first_frame_image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
    "left_audio": "https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3",
    "right_audio": "https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3",
    "bboxes_type": "body"
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/skywork-ai/skyreels-v3-pro/multi-avatar" \
  -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/skywork-ai/skyreels-v3-pro/multi-avatar";
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({
        "prompt": "A cinematic shot of a city at sunset, soft golden light",
        "first_frame_image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
        "left_audio": "https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3",
        "right_audio": "https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3",
        "bboxes_type": "body"
}),
});
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 = {
    "prompt": "A cinematic shot of a city at sunset, soft golden light",
    "first_frame_image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
    "left_audio": "https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3",
    "right_audio": "https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3",
    "bboxes_type": "body"
}

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/skywork-ai/skyreels-v3-pro/multi-avatar", 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)

Skyreels v3 Pro Multi Avatar API — Frequently asked questions

What is the Skyreels v3 Pro Multi Avatar API?

Skyreels v3 Pro Multi Avatar is a Skywork Ai model for talking-avatar generation, exposed as a REST API on WaveSpeedAI. SkyReels V3 Pro Multi Avatar is a high-quality AI talking avatar video generation model that creates multi-speaker avatar videos from one image, multiple audio tracks, and bounding boxes. Ready-to-use REST inference API for group avatar videos, digital humans, virtual presenters, dialogue scenes, education content, marketing creatives, and professional multi-avatar video workflows with simple integration, no coldstarts, and affordable pricing. You can call it programmatically or try it from the playground above.

How do I call the Skyreels v3 Pro Multi Avatar 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/skywork-ai/skywork-ai-skyreels-v3-pro-multi-avatar.

How much does Skyreels v3 Pro Multi Avatar cost per run?

Skyreels v3 Pro Multi Avatar starts at $0.12 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 Skyreels v3 Pro Multi Avatar accept?

Key inputs: `prompt`, `bboxes_type`, `first_frame_image`, `left_audio`, `right_audio`. 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/skywork-ai/skywork-ai-skyreels-v3-pro-multi-avatar.

How do I get started with the Skyreels v3 Pro Multi Avatar API?

Sign up for a free WaveSpeedAI account to claim starter credits, copy your API key from /accesskey, then call the endpoint shown in the API tab of the playground. The playground also auto-generates a code sample in Python, JavaScript, or cURL for the parameters you've set.

Can I use Skyreels v3 Pro Multi Avatar outputs commercially?

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

Skyreels V3 Pro Multi Avatar | AI Digital Human API on WaveSpeedAI