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

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.
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. 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 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 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
done

Retry temporary errors only while polling, never the submit request. Errors, retries and timeouts

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".
voicestringNo-cloneAdvanced 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

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.