Translate Audio

Transcribe and translate audio to any supported language.

POST /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
Response

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.

This site uses only essential cookies required for the service to function (session authentication and security). We do not use analytics, tracking, or advertising cookies. Learn more