AI Video Editor Video Translator API Documentation
Playground
Try it on WaveSpeedAI!AI Video Translator dubs any video into 28 languages: every speaker keeps a voice that matches their own, the original music and sound effects stay under the dub, and the timing follows the picture. Translated subtitles come as an SRT file with every result. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
AI Video Translator translates and dubs videos into 28 target languages while preserving the original picture. It generates speech designed to resemble each speaker’s voice and fits translated dialogue to the original timing. Keep or remove background audio, specify translations for names and terms, and get translated subtitles with every result.
Why It Stands Out
- 28 target languages: English, Spanish, French, German, Italian, Portuguese, Dutch, Swedish, Danish, Norwegian, Finnish, Greek, Russian, Polish, Turkish, Hebrew, Indonesian, Malay, Vietnamese, Thai, Filipino, Swahili, Chinese (Simplified and Traditional), Japanese, Korean, Arabic and Hindi.
- Speaker-aware dubbing: automatically detect speakers or specify the number of people speaking.
- Voice matching: generate translated speech designed to resemble each speaker’s original voice.
- Background audio control: keep the original music and sound effects, or remove them for a voice-focused result.
- Timing-aware translation: fit translated dialogue to the timing of the original speech.
- Custom terminology: use
glossaryto specify translations for names, brands and other terms. - Subtitles included: every result comes with an SRT file of the translated lines.
- Original picture preserved: retain the source video’s picture, frame rate and resolution.
Parameters
| Parameter | Required | Description |
|---|---|---|
| video | Yes | URL of the video to translate and dub. You can also upload a file in the Playground. Up to 2 hours is processed. |
| target_language | No | Target language code, such as en, es or zh-CN. Default: en. Choose a language different from the source speech. |
| source_language | No | Source language code. Default: auto, which detects the language automatically. Set it explicitly when the source language is known. |
| speakers | No | Number of people speaking: 1, 2, 3 or 4. Omit to detect automatically. No fixed default. |
| background | No | keep preserves background music and sound effects; remove removes them. Default: keep. |
| glossary | No | Up to 100 entries in a string array, each written as source=translation. Example: ["Acme=Acme", "Hello=Hola"]. Omit or use [] when no terminology guidance is needed. |
| voice | No | Voice mode. The only supported value is clone, which generates speech designed to resemble the original speaker’s voice. |
How to Use
- Upload a video or provide its URL.
- Select a
target_languagedifferent from the language spoken in the video. - Leave
source_languageonauto, or specify the source language. - Leave
speakersempty for automatic detection, or select the number of speakers. - Choose whether to keep background audio and optionally add glossary entries.
- Submit the request and download the dubbed MP4, plus the SRT subtitle file.
Pricing
$0.25 per minute of source video, rounded up to the next whole minute. Billing is capped at 120 minutes per video.
Price = source duration in minutes, rounded up × $0.25, subject to the 120-minute cap.
| Source video length | Billed duration | Price |
|---|---|---|
| 30 seconds | 1 minute | $0.25 |
| 1 minute | 1 minute | $0.25 |
| 1 minute 1 second | 2 minutes | $0.50 |
| 5 minutes | 5 minutes | $1.25 |
| 10 minutes | 10 minutes | $2.50 |
| 60 minutes | 60 minutes | $15.00 |
| 120 minutes | 120 minutes | $30.00 |
Target language, speaker count, background audio settings, glossary entries and subtitles do not add separate charges.
Notes
- Billing uses the source video duration, not the length of the translated speech.
- Up to 2 hours of video is processed per request.
- The target language should differ from the language spoken in the source video.
- Leave
speakersunset for automatic detection; do not use0to request automatic detection. - Add one glossary entry per array item, using
source=translation. - Subtitles come as a separate SRT file; they are not burned into the picture.
- The dubbed MP4 retains the original picture, frame rate and resolution; it does not alter mouth movements to match the translated speech.
- Translation accuracy, voice similarity and background audio separation can vary with recording quality, noise and overlapping speech.
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'
{
"video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
"target_language": "en",
"source_language": "auto",
"speakers": 1,
"background": "keep"
}
JSON
)
# 1. Submit the prediction once. Never retry this request automatically:
# a retry after an unclear failure can create a second, billed task.
CHECK='The task may already exist. Check History or the predictions list before submitting again.'
if ! SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--connect-timeout 10 --max-time 60 \
-X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/ai-video-editor/video-translator" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}"); then
printf 'Submit failed. %s\n' "${CHECK}" >&2
exit 1
fi
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. %s\n' "${CHECK}" >&2
exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"
# 2. Poll until the prediction reaches a final status.
BODY_FILE=$(mktemp)
trap 'rm -f "${BODY_FILE}"' EXIT
while true; do
# Transient errors (429, 5xx) are retried, honoring Retry-After.
HTTP_CODE=$(curl --silent --show-error --fail-with-body \
--connect-timeout 10 --max-time 60 --retry 5 --retry-delay 2 \
--output "${BODY_FILE}" --write-out '%{http_code}' \
"${RESULT_URL}" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" || true)
case "${HTTP_CODE}" in
2??) ;;
000|429|5??) # dropped connection or temporary error: keep polling
printf 'Task %s: HTTP %s, polling again in 10s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
sleep 10; continue ;;
*) printf 'Task %s: HTTP %s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
cat "${BODY_FILE}" >&2; exit 1 ;;
esac
RESULT=$(jq 'if type == "object" and has("data") then .data else . end' "${BODY_FILE}")
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
case "${STATUS}" in
completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
failed|cancelled|timeout|deleted)
printf 'Task %s ended with status %s\n' "${PREDICTION_ID}" "${STATUS}" >&2
printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
*) sleep 2 ;;
esac
doneRetry temporary errors only while polling, never the submit request. Errors, retries and timeouts
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| video | string | Yes | - | The video to translate and dub. Up to 2 hours is processed. | |
| target_language | string | No | en | en, es, fr, de, it, pt, nl, sv, da, no, fi, el, ru, pl, tr, he, id, ms, vi, th, tl, sw, zh-CN, zh-TW, ja, ko, ar, hi | Language to dub the video into. It must differ from the language spoken in the video. |
| source_language | string | No | auto | auto, en, zh-CN, zh-TW, yue, es, fr, de, it, pt, ru, ja, ko, ar, hi, tr, vi, th, id, ms, nl, pl, uk, sv, fi, da, no, nn, cs, sk, ro, hu, el, bg, hr, sr, sl, bs, mk, sq, lt, lv, et, he, fa, ur, ps, sd, bn, as, pa, gu, mr, ne, sa, ta, te, kn, ml, si, my, km, lo, bo, ka, hy, az, kk, uz, tg, tk, mn, ba, tt, be, is, fo, cy, br, eu, gl, ca, oc, lb, la, mt, af, sw, so, am, ha, yo, ln, sn, mg, tl, jw, su, haw, mi, ht, yi | Language spoken in the video. "auto" detects it; set it when detection is unreliable, for example with heavy accents or background music. |
| speakers | integer | No | - | 1, 2, 3, 4 · 1 ~ 4 | Number of people speaking, 1 to 4. Leave it out to detect it. |
| background | string | No | keep | keep, remove | keep leaves the original music and sound effects under the dub; remove drops them. |
| glossary | array<string> | No | - | 0 ~ 100 items | Names and terms with a fixed translation, one per entry, written "source=translation", for example "Acme=Acme". |
| voice | string | No | - | clone | Advanced option. clone gives each speaker a voice that matches their own. |
Every model also accepts the global request options enable_sync_mode and enable_base64_output; see their pages for details.
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 |