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
- 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.
- Provide the audio. Upload the speech you want to use. The model processes the first 120 seconds; longer recordings are accepted and trimmed automatically.
- Add direction if needed. Leave
promptempty for natural speaking behavior, or describe the expression and movement you want. - Choose a resolution.
720pis the default; choose480pfor lower-cost previews. - Generate the video. API requests are asynchronous. Poll the prediction result endpoint until the video URL is available.
Parameters
| Parameter | Required | Description |
|---|---|---|
image | Yes | URL of the portrait image to animate. |
audio | Yes | URL of a nonempty speech recording. Only the first 120 seconds are processed. |
prompt | No | Optional guidance for expression, movement, or presentation. Leave empty for natural speaking behavior. |
resolution | No | 480p 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.
| Resolution | Per billable audio second | 10 seconds | 60 seconds | 120 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.
Related Models
- InfiniteTalk - another image-and-audio talking-avatar option.
- Seedance 2.5 Image to Video - animate an image with a text prompt.
- Seedance 2.5 Video Edit - edit an existing video.
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
doneParameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| image | string | Yes | - | URL of the portrait image to animate. | |
| audio | string | Yes | - | - | URL of a nonempty audio recording. Only the first 120 seconds are processed; longer recordings are accepted and trimmed automatically. |
| prompt | string | No | - | Optional guidance for the avatar's expression and movement. Leave empty to use natural speaking behavior. | |
| resolution | string | No | 720p | 480p, 720p | Output video resolution. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Task status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses. |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<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.urls | object | Object containing related API endpoints |
| data.status | string | Status: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |