# veed/dubbing-pro

> VEED Dubbing Pro translates videos with cloned voices, synchronized lip movements, regional accent support, and adjustable voice similarity for multilingual localization, marketing, training, social content, and professional dubbing workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

## Overview

- **Endpoint**: `https://api.wavespeed.ai/api/v3/veed/dubbing-pro`
- **Polling/result URL**: `https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result`
- **Model ID**: `veed/dubbing-pro`
- **Category**: video-dubbing

## API Information

This model can be used via our HTTP API or more conveniently via our client libraries.
The API is asynchronous: submit a prediction, then poll its result URL until it completes.

### Input Schema

The API accepts the following input parameters:

- **`video`** (`string`, _required_):
  Video to translate and dub, up to 10 minutes, with speech in its audio track.

- **`target_language`** (`string`, _required_):
  Language to dub into, optionally with a regional dialect (e.g. 'es-MX', 'pt-BR'). Case-insensitive; for a language without dialects the region is ignored ('de-DE' = 'de'), and an unsupported dialect is rejected.
  - Options: "af", "ak", "am", "ar", "ar-EG", "as", "az", "be", "bg", "bo", "bs", "ca", "ceb", "cmn", "cs", "cy", "da", "de", "dgo", "el", "en", "en-AU", "en-CA", "en-GB", "en-US", "es", "es-AR", "es-CL", "es-ES", "es-MX", "et", "eu", "fa", "fi", "fil", "fr", "fr-CA", "fr-FR", "gl", "gu", "ha", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "jv", "ka", "ki", "kk", "kn", "ko", "ky", "lg", "lt", "lv", "mk", "ml", "mn", "mr", "ms", "my", "ne", "nl", "no", "nso", "pa", "pl", "pt", "pt-BR", "pt-PT", "rn", "ro", "ru", "rw", "sd", "sk", "sl", "sq", "ss", "st", "su", "sv", "sw", "ta", "te", "tg", "th", "tn", "tr", "ts", "ug", "uk", "ur", "uz", "ve", "vi", "war", "wo", "yo", "yue", "zh", "zh-TW", "zu"

- **`source_language`** (`string`, _optional_):
  Language spoken in the video. 'auto' (the default) detects it; set it explicitly if detection picks the wrong language.
  - Default: `"auto"`
  - Options: "auto", "af", "ak", "am", "ar", "as", "az", "be", "bg", "bo", "bs", "ca", "ceb", "cmn", "cs", "cy", "da", "de", "dgo", "el", "en", "es", "et", "eu", "fa", "fi", "fil", "fr", "gl", "gu", "ha", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "jv", "ka", "ki", "kk", "kn", "ko", "ky", "lg", "lt", "lv", "mk", "ml", "mn", "mr", "ms", "my", "ne", "nl", "no", "nso", "pa", "pl", "pt", "rn", "ro", "ru", "rw", "sd", "sk", "sl", "sq", "ss", "st", "su", "sv", "sw", "ta", "te", "tg", "th", "tn", "tr", "ts", "ug", "uk", "ur", "uz", "ve", "vi", "war", "wo", "yo", "yue", "zh", "zu"

- **`voice_cloning_strength`** (`integer`, _optional_):
  How closely the dubbed voices match the original speakers, from 0 to 10. Higher keeps more of each speaker's voice and accent; lower sounds more natural in the target language.
  - Default: `7`
  - Range: `0` to `10`

- **`keyterms`** (`array of string`, _optional_):
  Optional names and terms to preserve. Up to 10 terms, each at most 50 characters and 5 words. See Notes for character restrictions.



**Required Parameters Example**:

```json
{
  "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
  "target_language": "af"
}
```

**Full Example**:

```json
{
  "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
  "target_language": "af",
  "source_language": "auto",
  "voice_cloning_strength": 7,
  "keyterms": []
}
```

### Result Data Schema

The `data` object returned by the API has the following fields:

- **`created_at`** (`string (date-time)`, _optional_):
  ISO timestamp of when the request was created (e.g., "2023-04-01T12:34:56.789Z").

- **`id`** (`string`, _optional_):
  Unique identifier for the prediction, the ID of the prediction to get.

- **`model`** (`string`, _optional_):
  Model ID used for the prediction.

- **`outputs`** (`array of string | object`, _optional_):
  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.

- **`status`** (`string`, _optional_):
  Status of the task: created, processing, completed, or failed.

- **`urls`** (`object`, _optional_):
  Object containing related API endpoints.



**Example `data` Object**:

```json
{
  "created_at": "example",
  "id": "example",
  "model": "example",
  "outputs": [],
  "status": "example",
  "urls": {}
}
```

## Usage Examples

The examples use `jq` to read JSON. Set your API key first:

```bash
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
```

### 1. Submit a prediction

```bash
REQUEST_BODY=$(cat <<'JSON'
{
  "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
  "target_language": "af"
}
JSON
)

SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  --request POST \
  --url https://api.wavespeed.ai/api/v3/veed/dubbing-pro \
  --header "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  --header "Content-Type: application/json" \
  --data "${REQUEST_BODY}")

printf '%s\n' "${SUBMIT_RESPONSE}" | jq .
```

The response contains the prediction ID in `data.id`.

### 2. Poll until complete and read `outputs`

```bash
PREDICTION_ID=$(printf '%s' "${SUBMIT_RESPONSE}" | jq -r '.data.id')
if [ -z "${PREDICTION_ID}" ] || [ "${PREDICTION_ID}" = "null" ]; then
  printf 'Submission response did not contain data.id\n' >&2
  exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"

while true; do
  RESPONSE=$(curl --silent --show-error --fail-with-body \
    --request GET \
    --url "${RESULT_URL}" \
    --header "Authorization: Bearer ${WAVESPEED_API_KEY}")

  RESULT=$(printf '%s' "${RESPONSE}" | jq -e '.data')
  STATUS=$(printf '%s' "${RESULT}" | jq -er '.status')
  case "${STATUS}" in
    completed)
      # Generated files are returned in the outputs array.
      printf '%s\n' "${RESULT}" | jq '.outputs'
      break
      ;;
    failed|cancelled|timeout|deleted)
      printf '%s\n' "${RESULT}" | jq '{status, error, code}'
      exit 1
      ;;
    *)
      sleep 2
      ;;
  esac
done
```

## Additional Resources

### Documentation

- [Model Playground](https://wavespeed.ai/models/veed/dubbing-pro)
- [API Documentation](https://wavespeed.ai/docs/docs-api/veed/veed-dubbing-pro)
