Bytedance Seedance 2.5 Talking Avatar API Documentation

Bytedance Seedance 2.5 Talking Avatar API Documentation

Playground

Try it on WaveSpeedAI!

Seedance 2.5 Talking Avatar animates a portrait image from an audio recording to generate natural talking-avatar videos in 480P or 720P, processing up to the first 120 seconds of audio for digital human, presenter, dubbing, and avatar workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

Features

Turn a portrait and a voice recording into a talking-avatar video. Use Seedance 2.5 to create virtual presenters, product demonstrations, explainers, and spoken social content in 480p or 720p, with up to two minutes of audio per request.

Only an image and audio are required. Add an optional prompt when you want to guide the presenter’s expression, movement, or product presentation.

What You Can Create

  • Virtual presenters: introduce a topic, welcome an audience, or narrate an announcement.
  • Product demonstrations: animate a presenter holding a product while delivering your recorded pitch.
  • Educational explainers: pair a consistent portrait with lesson or training audio.
  • Social videos: turn short voice recordings into on-camera messages.

How to Use

  1. Choose an image. Use a clear portrait with an unobstructed face. For a product demonstration, include the product in the image and keep it below the face.
  2. Provide the audio. Upload the speech you want to use. The model processes the first 120 seconds; longer recordings are accepted and trimmed automatically.
  3. Add direction if needed. Leave prompt empty for natural speaking behavior, or describe the expression and movement you want.
  4. Choose a resolution. 720p is the default; choose 480p for lower-cost previews.
  5. Generate the video. API requests are asynchronous. Poll the prediction result endpoint until the video URL is available.

Parameters

ParameterRequiredDescription
imageYesURL of the portrait image to animate.
audioYesURL of a nonempty speech recording. Only the first 120 seconds are processed.
promptNoOptional guidance for expression, movement, or presentation. Leave empty for natural speaking behavior.
resolutionNo480p or 720p. Default: 720p.

The output duration follows the processed audio, up to 120 seconds. Audio guides the voice, words, and speaking pace; the generated audio can differ from the original recording.

Prompt Examples

Keep directions focused on visible behavior. The audio supplies the spoken message.

Friendly introduction

> Speak to the camera with a warm expression, subtle head movement, and natural blinking.

Product presentation

> Present the plain moisturizer jar at chest height while speaking. Keep the product visible and its packaging unchanged. Use small, natural hand gestures without covering the face.

Calm explainer

> Maintain a calm, attentive expression and steady posture while explaining the topic. Keep the camera fixed.

Tips for Better Results

  • Start with one clearly visible speaker, good lighting, and a face directed toward the camera.
  • Use clean speech with limited background noise and music.
  • Keep the mouth visible; place products and hands below the face.
  • Use an image that already matches the intended scene, clothing, and product.
  • Prefer subtle movement directions for a consistent presentation.

Pricing

Charges are based on the processed audio duration, rounded up to whole seconds, with a 4-second minimum and a 120-second maximum.

ResolutionPer billable audio second10 seconds60 seconds120 seconds
480p$0.22$2.20$13.20$26.40
720p$0.44$4.40$26.40$52.80

For example, 2.8 seconds is billed as 4 seconds, and 4.01 seconds is billed as 5 seconds. A 130-second recording is processed and billed for only the first 120 seconds. Automatic segmentation and recovery do not add separate charges.

Authentication

For authentication details, please refer to the Authentication Guide.

API Endpoints

Submit Task & Query Result

set -euo pipefail

export WAVESPEED_API_KEY="your-api-key"

REQUEST_BODY=$(cat <<'JSON'
{
  "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
  "audio": "https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3",
  "resolution": "720p"
}
JSON
)

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

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

# 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 type == "object" and has("data") then .data else . end')
  STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')

  case "${STATUS}" in
    completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
    failed|cancelled|timeout|deleted) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
    *) sleep 2 ;;
  esac
done

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
imagestringYes-URL of the portrait image to animate.
audiostringYes--URL of a nonempty audio recording. Only the first 120 seconds are processed; longer recordings are accepted and trimmed automatically.
promptstringNo-Optional guidance for the avatar's expression and movement. Leave empty to use natural speaking behavior.
resolutionstringNo720p480p, 720pOutput video resolution.

Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
data.idstringUnique identifier for the prediction, Task Id
data.modelstringModel ID used for the prediction
data.outputsarrayOutput values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed)
data.urlsobjectObject containing related API endpoints
data.statusstringTask status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses.
data.created_atstringISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”)
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds

Result Request Parameters

ParameterTypeRequiredDefaultDescription
idstringYes-Task ID

Result Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
dataobjectThe prediction data object containing all details
data.idstringUnique identifier for the prediction
data.modelstringModel ID used for the prediction
data.outputsarray<string | object>Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model.
data.urlsobjectObject containing related API endpoints
data.statusstringStatus: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses
data.created_atstringISO timestamp of when the request was created
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds
© 2026 WaveSpeedAI. All rights reserved.