Translate Audio
Transcribe and translate audio to any supported language.
/v1/translate
5 credits
Description
Transcribe audio and translate it to a target language. Combines faster-whisper for transcription with argos-translate for offline translation. Supports 50+ language pairs. Source language is auto-detected or can be specified manually.
Request Body
Send a JSON body with the following parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| url | string | Yes | — | Source video/audio URL |
| target_language | string | Yes | — | ISO 639-1 target language code (e.g. "en", "fr", "de", "es", "ja") |
| source_language | string | No | null | Source language code. Null = auto-detected via Whisper. |
| output_format | string | No | "json" | Output format: "json", "srt", "vtt" |
| model_size | string | No | "base" | Whisper model for transcription step |
Supported Languages
Common language codes for the target_language and source_language parameters:
| Code | Language | Code | Language | Code | Language |
|---|---|---|---|---|---|
| en | English | fr | French | de | German |
| es | Spanish | it | Italian | pt | Portuguese |
| nl | Dutch | ru | Russian | zh | Chinese |
| ja | Japanese | ko | Korean | ar | Arabic |
| hi | Hindi | tr | Turkish | pl | Polish |
Pivot Translation
Over 50 language pairs are supported. If a direct translation path is unavailable, English is used as a pivot language (source → English → target).
Code Examples
curl -X POST "https://videoconduit.com/v1/translate" \
-H "Authorization: Bearer vc_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://youtube.com/watch?v=dQw4w9WgXcQ",
"target_language": "fr",
"source_language": "en"
}'import requests
response = requests.post(
"https://videoconduit.com/v1/translate",
headers={"Authorization": "Bearer vc_your_api_key"},
json={
"url": "https://youtube.com/watch?v=dQw4w9WgXcQ",
"target_language": "fr",
"source_language": "en",
},
)
data = response.json()
print(data["job_id"])const response = await fetch("https://videoconduit.com/v1/translate", {
method: "POST",
headers: {
"Authorization": "Bearer vc_your_api_key",
"Content-Type": "application/json",
},
body: JSON.stringify({
url: "https://youtube.com/watch?v=dQw4w9WgXcQ",
target_language: "fr",
source_language: "en",
}),
});
const data = await response.json();
console.log(data.job_id);$client = new GuzzleHttp\Client();
$response = $client->post("https://videoconduit.com/v1/translate", [
"headers" => ["Authorization" => "Bearer vc_your_api_key"],
"json" => [
"url" => "https://youtube.com/watch?v=dQw4w9WgXcQ",
"target_language" => "fr",
"source_language" => "en",
],
]);
$data = json_decode($response->getBody(), true);
echo $data["job_id"];body := strings.NewReader(`{
"url": "https://youtube.com/watch?v=dQw4w9WgXcQ",
"target_language": "fr",
"source_language": "en"
}`)
req, _ := http.NewRequest("POST", "https://videoconduit.com/v1/translate", body)
req.Header.Set("Authorization", "Bearer vc_your_api_key")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var data map[string]interface{}
json.NewDecoder(resp.Body).Decode(&data)require "net/http"
require "json"
uri = URI("https://videoconduit.com/v1/translate")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer vc_your_api_key"
req["Content-Type"] = "application/json"
req.body = {
url: "https://youtube.com/watch?v=dQw4w9WgXcQ",
target_language: "fr",
source_language: "en",
}.to_json
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
puts data["job_id"]Response
Initial Response
Returned immediately when the job is created:
{
"job_id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"status": "pending",
"credits_charged": 5
}
Completed Job
Returned from GET /v1/jobs/{id} when the job finishes:
{
"job_id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"status": "completed",
"download_url": "https://dl.videoconduit.com/files/c3d4e5f6.json",
"result_data": {
"source_language": "en",
"target_language": "fr",
"original_text": "Never gonna give you up...",
"translated_text": "Ne jamais te laisser tomber...",
"segment_count": 45,
"output_format": "json"
}
}
Output Formats
JSON (default)
Contains both original and translated text, with segment-level alignment between source and target languages.
{
"source_language": "en",
"target_language": "fr",
"original_text": "Never gonna give you up...",
"translated_text": "Ne jamais te laisser tomber...",
"segments": [
{
"start": 0.0,
"end": 3.5,
"original": "Never gonna give you up,",
"text": "Ne jamais te laisser tomber,"
}
]
}
SRT / VTT
SRT and VTT output contains only the translated text with timestamps, in the same format as the transcribe endpoint.
Try It
{# Usage: {% include "docs/_playground.html" with endpoint_method="POST" endpoint_path="/v1/download" fields=playground_fields %} playground_fields is a list of dicts passed from the view: [ {"name": "url", "type": "text", "required": True, "placeholder": "https://youtube.com/watch?v=...", "label": "Video URL"}, {"name": "quality", "type": "select", "options": ["best", "1080p", "720p", "480p", "audio"], "default": "best", "label": "Quality"}, ] #}Try It
POST /v1/translate
Notes
Offline Translation
All translation is performed locally using argos-translate. No data is sent to third-party translation APIs, ensuring privacy for sensitive content.
Specify Source Language
Auto-detection works well for most content, but specifying source_language improves both transcription accuracy and translation quality.