Skip to content

AI Dubbing

Automatically dub audio and video content into 100+ languages while preserving the original voice.

Overview

The AI Dubbing API translates and re-voices audio and video content, maintaining the speaker's original voice characteristics across languages. It supports automatic speaker detection, lip-sync adjustment for video, and quality scoring for every output.

100+ target languages
Voice preservation
Lip-sync adjustment
Batch processing
Speaker detection
Quality scoring

Quickstart

Dub an audio file into a new language in just a few lines of code.

1from nur import NurClient
2
3client = NurClient()
4
5# Create a dubbing job
6job = client.dubbing.create(
7 file="podcast_episode.mp3",
8 source_language="en",
9 target_languages=["es", "fr", "de"],
10 preserve_voice=True
11)
12
13print(f"Job {job.id} created, status: {job.status}")
14print(f"Estimated completion: {job.estimated_completion}")

Create Dubbing Job

POST/v1/dubbing/create

Submit an audio or video file for dubbing into one or more target languages. You can provide either a file upload or a public URL to the source media.

ParameterTypeDescription
source_urlstringPublic URL of the audio or video file to dub.
filefileAudio or video file upload. Provide either file or source_url.
source_languageREQUIREDstringISO 639-1 language code of the source content.
target_languagesREQUIREDstring[]Array of ISO 639-1 language codes for the dubbed outputs.
preserve_voicebooleanWhether to clone the speaker's voice for dubbed output. Default: true.
lip_syncbooleanEnable lip-sync adjustment for video files. Default: false.
1# Dub from a URL with lip-sync enabled
2job = client.dubbing.create(
3 source_url="https://example.com/video.mp4",
4 source_language="en",
5 target_languages=["ja", "ko", "zh"],
6 preserve_voice=True,
7 lip_sync=True
8)
9
10print(f"Job ID: {job.id}")
11print(f"Status: {job.status}")
12print(f"Estimated: {job.estimated_completion}")

Response

1{
2 "id": "dub_abc123def456",
3 "status": "pending",
4 "source_language": "en",
5 "target_languages": ["ja", "ko", "zh"],
6 "created_at": "2025-01-15T10:30:00Z",
7 "estimated_completion": "2025-01-15T10:35:00Z"
8}

Get Dubbing Job

GET/v1/dubbing/{job_id}

Retrieve the status and results of a dubbing job. Once the status is completed, the response includes download URLs for each target language.

ParameterTypeDescription
job_idREQUIREDstringThe unique identifier of the dubbing job.
1import time
2
3# Poll until the job is complete
4while True:
5 job = client.dubbing.get("dub_abc123def456")
6 print(f"Status: {job.status}")
7
8 if job.status == "completed":
9 for lang, output in job.outputs.items():
10 print(f" {lang}: {output.download_url}")
11 print(f"Duration: {job.duration}s")
12 print(f"Quality scores: {job.quality_scores}")
13 break
14 elif job.status == "failed":
15 print("Dubbing failed")
16 break
17
18 time.sleep(5)

Response

1{
2 "id": "dub_abc123def456",
3 "status": "completed",
4 "outputs": {
5 "ja": { "download_url": "https://cdn.nur.ai/dub/abc123/ja.mp4" },
6 "ko": { "download_url": "https://cdn.nur.ai/dub/abc123/ko.mp4" },
7 "zh": { "download_url": "https://cdn.nur.ai/dub/abc123/zh.mp4" }
8 },
9 "duration": 324.5,
10 "quality_scores": {
11 "ja": 0.94,
12 "ko": 0.91,
13 "zh": 0.93
14 }
15}

List Supported Languages

GET/v1/dubbing/languages

Retrieve the full list of supported source and target languages for dubbing. No parameters are required.

1languages = client.dubbing.languages()
2
3for lang in languages:
4 print(f"{lang.code}: {lang.name} (source: {lang.as_source}, target: {lang.as_target})")

Response

1{
2 "languages": [
3 { "code": "en", "name": "English", "as_source": true, "as_target": true },
4 { "code": "es", "name": "Spanish", "as_source": true, "as_target": true },
5 { "code": "ja", "name": "Japanese", "as_source": true, "as_target": true },
6 { "code": "zh", "name": "Chinese", "as_source": true, "as_target": true }
7 ]
8}

Response Objects

Reference for the objects returned by the AI Dubbing endpoints.

DubbingJob (Create)

FieldTypeDescription
idstringUnique identifier for the dubbing job.
statusstringOne of: pending, processing, completed, failed.
source_languagestringISO 639-1 code of the source language.
target_languagesstring[]Array of target language codes.
created_atstringISO 8601 timestamp of job creation.
estimated_completionstringISO 8601 timestamp of estimated completion.

DubbingJob (Get - Completed)

FieldTypeDescription
idstringUnique identifier for the dubbing job.
statusstringOne of: pending, processing, completed, failed.
outputsobjectMap of language code to { download_url } for each target.
durationnumberDuration of the source media in seconds.
quality_scoresobjectMap of language code to quality score (0.0 - 1.0).

Best Practices

Use high-quality source audio

Clean source audio with minimal background noise produces significantly better dubbing results. Consider denoising with the Audio Tools API first.

Batch related languages together

Submit all target languages in a single request rather than creating separate jobs. This reduces processing time and ensures consistent voice cloning across outputs.

Check quality scores before publishing

The quality_scores field indicates how natural each dubbed output sounds. Scores below 0.85 may benefit from re-processing or manual review.

Use webhooks for long-running jobs

Instead of polling, configure a webhook URL in your dashboard to receive notifications when dubbing jobs complete. This is more efficient for production workflows.