AI Video Editor Video Translator API Documentation

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 glossary to 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

ParameterRequiredDescription
videoYesURL of the video to translate and dub. You can also upload a file in the Playground. Up to 2 hours is processed.
target_languageNoTarget language code, such as en, es or zh-CN. Default: en. Choose a language different from the source speech.
source_languageNoSource language code. Default: auto, which detects the language automatically. Set it explicitly when the source language is known.
speakersNoNumber of people speaking: 1, 2, 3 or 4. Omit to detect automatically. No fixed default.
backgroundNokeep preserves background music and sound effects; remove removes them. Default: keep.
glossaryNoUp 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.
subtitlesNoReturn translated subtitles as an .srt file and include a soft subtitle track in the MP4. Default: false.
voiceNoVoice mode. The only supported value is clone, which generates speech designed to resemble the original speaker’s voice.

How to Use

  1. Upload a video or provide its URL.
  2. Select a target_language different from the language spoken in the video.
  3. Leave source_language on auto, or specify the source language.
  4. Leave speakers empty for automatic detection, or select the number of speakers.
  5. Choose whether to keep background audio and optionally add glossary entries.
  6. Enable subtitles if you need translated subtitles.
  7. 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 lengthBilled durationPrice
30 seconds1 minute$0.25
1 minute1 minute$0.25
1 minute 1 second2 minutes$0.50
5 minutes5 minutes$1.25
10 minutes10 minutes$2.50
60 minutes60 minutes$15.00
120 minutes120 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 speakers unset for automatic detection; do not use 0 to 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
done

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
videostringYes-The video to translate and dub. Up to 2 hours is processed.
target_languagestringNoenen, 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, hiLanguage to dub the video into. It must differ from the language spoken in the video.
source_languagestringNoautoauto, 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, yiLanguage spoken in the video. "auto" detects it; set it when detection is unreliable, for example with heavy accents or background music.
speakersintegerNo-1, 2, 3, 4 · 1 ~ 4Number of people speaking, 1 to 4. Leave it out to detect it.
backgroundstringNokeepkeep, removekeep leaves the original music and sound effects under the dub; remove drops them.
glossaryarray<string>No-0 ~ 100 itemsNames and terms with a fixed translation, one per entry, written "source=translation", for example "Acme=Acme".
subtitlesbooleanNofalse-Also return the translated subtitles as an .srt file.
voicestringNo-cloneAdvanced option. clone gives each speaker a voice that matches their own.

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.