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. Optional translated subtitles as an SRT file. 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 optionally include translated subtitles.
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. - Optional subtitles: return an SRT file and embed subtitles in the MP4 as a selectable soft track.
- 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. |
| subtitles | No | Return translated subtitles as an .srt file and include a soft subtitle track in the MP4. Default: false. |
| 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.
- Enable
subtitlesif you need translated subtitles. - Submit the request and download the dubbed MP4, plus the SRT file when requested.
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 are selectable soft subtitles, not text 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",
"subtitles": false
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-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}")
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 |
|---|---|---|---|---|---|
| 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". |
| subtitles | boolean | No | false | - | Also return the translated subtitles as an .srt file. |
| voice | string | No | - | clone | Advanced option. clone gives each speaker a voice that matches their own. |
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 |