# 1. exchange client credentials for a token (valid 1 hour)
curl -X POST https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token \
-u "$CLIENT_ID:$CLIENT_SECRET" \
-d "grant_type=client_credentials"
# 2. upload the video once - YouTube, Drive, S3, Vimeo or direct URL
curl -X POST https://api.rask.ai/api/library/v1/media/link \
-H "Authorization: Bearer $TOKEN" \
-d '{"link": "https://youtu.be/...", "name": "Q3 launch"}'
# 3. one project per target language - they run in parallel
for lang in es-mx de-de ja-jp pt-br; do
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" \
-d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"$lang\"}"
done# Poll each project until merging_done, then collect the files.
while :; do
curl -s https://api.rask.ai/v2/projects/$ID \
-H "Authorization: Bearer $TOKEN" \
| jq '{status, translated_video, translation_srt_path}'
sleep 10
done



Senden Sie eine Datei als Multipart-Formulardaten oder posten Sie einen Link von YouTube, Google Drive, S3, Vimeo oder einer direkten Download-URL. Sie erhalten eine Medien-ID und die technischen Metadaten, bevor Sie etwas ausgeben.
Übergeben Sie die Medien-ID als video_id und eine Zielsprache. Erstellen Sie für jede benötigte Sprache aus demselben Upload ein eigenes Projekt, mit Ihrem eigenen Transkript oder einem Glossar, falls vorhanden.
Lesen Sie den Status ab, bis er merging_done erreicht. Laden Sie dann das übersetzte Video und die Untertiteldateien für diese Sprache herunter.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
TARGETS = ["es-mx", "de-de", "ja-jp", "pt-br"]
async def translate(client, video_id, lang):
job = await client.create_project(
data=schemas.ProjectCreate(video_id=video_id, dst_lang=lang))
while job.status is not enums.ProjectStatus.MERGING_DONE:
await asyncio.sleep(10)
job = await client.get_project(project_id=job.id)
return job
async def main():
client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
video = await client.create_media_link(
data=schemas.MediaCreateLink(link="https://youtu.be/..."))
while video.status is not enums.MediaStatus.READY:
await asyncio.sleep(5)
video = await client.get_media(media_id=video.id)
jobs = await asyncio.gather(*(translate(client, video.id, l) for l in TARGETS))
for j in jobs:
print(j.dst_lang, j.translated_video, j.translation_srt_path)
asyncio.run(main())import time, requests
AUTH = "https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token"
API = "https://api.rask.ai"
token = requests.post(AUTH, auth=(CLIENT_ID, CLIENT_SECRET),
data={"grant_type": "client_credentials"}).json()["access_token"]
h = {"Authorization": f"Bearer {token}"}
video = requests.post(f"{API}/api/library/v1/media/link", headers=h,
json={"link": "https://youtu.be/..."}).json()
while video["status"] != "ready":
time.sleep(5)
video = requests.get(f"{API}/api/library/v1/media/{video['id']}", headers=h).json()
ids = [requests.post(f"{API}/v2/projects", headers=h,
json={"video_id": video["id"], "dst_lang": lang}).json()["id"]
for lang in ["es-mx", "de-de", "ja-jp", "pt-br"]]
for pid in ids:
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
time.sleep(10)
print(p["dst_lang"], p["translated_video"], p["translation_vtt_path"])// no dependencies, Node 18+ global fetch
const API = 'https://api.rask.ai';
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const auth = await fetch('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token', {
method: 'POST',
headers: { Authorization: 'Basic ' + btoa(`${CLIENT_ID}:${CLIENT_SECRET}`) },
body: new URLSearchParams({ grant_type: 'client_credentials' }),
}).then((r) => r.json());
const h = { Authorization: `Bearer ${auth.access_token}`, 'Content-Type': 'application/json' };
const get = (path) => fetch(API + path, { headers: h }).then((r) => r.json());
const post = (path, body) => fetch(API + path, { method: 'POST', headers: h, body: JSON.stringify(body) }).then((r) => r.json());
let video = await post('/api/library/v1/media/link', { link: 'https://youtu.be/...' });
while (video.status !== 'ready') { await sleep(5000); video = await get(`/api/library/v1/media/${video.id}`); }
const results = await Promise.all(['es-mx', 'de-de', 'ja-jp', 'pt-br'].map(async (dst_lang) => {
let p = await post('/v2/projects', { video_id: video.id, dst_lang });
while (p.status !== 'merging_done') { await sleep(10000); p = await get(`/v2/projects/${p.id}`); }
return p;
}));
results.forEach((p) => console.log(p.dst_lang, p.translated_video, p.translation_srt_path));<?php
use GuzzleHttp\Client;
$http = new Client(['base_uri' => 'https://api.rask.ai']);
$json = fn($r) => json_decode($r->getBody(), true);
$auth = $json((new Client)->post('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token',
['auth' => [$clientId, $clientSecret], 'form_params' => ['grant_type' => 'client_credentials']]));
$h = ['Authorization' => 'Bearer ' . $auth['access_token']];
$video = $json($http->post('/api/library/v1/media/link',
['headers' => $h, 'json' => ['link' => 'https://youtu.be/...']]));
while ($video['status'] !== 'ready') {
sleep(5);
$video = $json($http->get("/api/library/v1/media/{$video['id']}", ['headers' => $h]));
}
foreach (['es-mx', 'de-de', 'ja-jp', 'pt-br'] as $lang) {
$p = $json($http->post('/v2/projects', ['headers' => $h,
'json' => ['video_id' => $video['id'], 'dst_lang' => $lang]]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
echo $lang, ' ', $p['translation_srt_path'], PHP_EOL;
}<?php
use GuzzleHttp\Client;
$http = new Client(['base_uri' => 'https://api.rask.ai']);
$auth = json_decode((new Client)->post(
'https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token',
['auth' => [$clientId, $clientSecret],
'form_params' => ['grant_type' => 'client_credentials']]
)->getBody(), true);
$h = ['Authorization' => 'Bearer ' . $auth['access_token']];
$media = json_decode($http->post('/api/library/v1/media/link',
['headers' => $h, 'json' => ['link' => 'https://youtu.be/...']])->getBody(), true);
$project = json_decode($http->post('/v2/projects',
['headers' => $h, 'json' => ['video_id' => $media['id'], 'dst_lang' => 'es-mx']])->getBody(), true);
while ($project['status'] !== 'merging_done') {
sleep(10);
$project = json_decode($http->get("/v2/projects/{$project['id']}",
['headers' => $h])->getBody(), true);
}_done Zustände. 0s created
11s transcription_started
87s translation_started
99s voiceover_started
154s merging_started
165s merging_done

es-mx und es-es gleichermaßen dient. Das Projekt speichert glossary_version, sodass spätere Änderungen bereits fertiggestellte Arbeit nicht unbemerkt verändern.Ja. Die Video-Übersetzungs-API von Rask nimmt eine Videodatei oder einen Link sowie eine Zielsprache entgegen, transkribiert die Sprache, übersetzt sie, generiert das Voiceover und mischt es mit dem originalen Hintergrundton. Sie erhalten das übersetzte Video, Untertiteldateien und den übersetzten Text ohne manuellen Zwischenschritt. Fügen Sie bei Bedarf vor der Veröffentlichung eine manuelle Prüfung hinzu.
Der API-Zugriff ist in kostenpflichtigen Tarifen enthalten. Sie erstellen Ihre Client-ID und Ihr Geheimnis in der App und können sofort loslegen. Unternehmensbedingungen, Mengenrabatte und kundenspezifische Sprachen werden über unser Team abgewickelt.
Über OAuth 2.0 Client Credentials. Tauschen Sie Ihre Client-ID und Ihr Geheimnis gegen ein Access Token ein und senden Sie dieses bei jeder Anfrage als Bearer Token mit. Tokens sind eine Stunde lang gültig; speichern Sie diese daher im Cache und verwenden Sie sie wieder.
Asynchron. Das Erstellen eines Projekts gibt sofort eine Antwort zurück und startet die Übersetzung. Fragen Sie GET /v2/projects/{id} ab, bis der Status merging_done lautet. Die Bereitstellung über Webhooks ist Teil des Enterprise-Onboardings.
Es gibt keine. Die API drosselt keine Anfragen und es gibt kein Kontingent pro Schlüssel. Ihr Durchsatz wird durch die Tiefe der Verarbeitungswarteschlange begrenzt, und die Verarbeitungspriorität ist Teil der Unternehmensbedingungen.
Über 135 Zielsprachen, inklusive regionaler Varianten, sodass dst_lang eine Angabe wie es-mx oder pt-br unterstützt. Die Quellansprache wird automatisch erkannt, oder Sie legen sie manuell fest. Die vollständige Liste der unterstützten Sprachen finden Sie in der API-Dokumentation. Für Sprachen außerhalb des Katalogs können Sie sich gerne an unser Team wenden, um Machbarkeit und Optionen zu besprechen.
Ja. Jedes Projekt hat eine Zielsprache. Sie erstellen also pro Sprache ein eigenes Projekt aus demselben Upload und lassen diese gleichzeitig laufen. Da es keine Geschwindigkeitsbegrenzungen gibt, hängt die Stapelübersetzung in verschiedene Sprachen nur davon ab, wie viele Projekte Ihr System erstellt.
Die Bearbeitungszeit variiert je nach Projekt. Jedes Projekt zeigt seinen Status während der Transkription, Übersetzung, Spracherstellung und Zusammenführung an, sodass Sie Ihren Nutzern den Fortschritt anzeigen und die Dateien herunterladen können, sobald die Übersetzung fertig ist.
Sieben Videoformate (MP4, MOV, MKV, AVI, WebM, M4V, 3GP) und vier Audioformate (MP3, WAV, FLAC, M4A). Sie können Videos auch direkt von YouTube, Google Drive, S3, Vimeo oder über eine direkte URL hochladen.
Ja. Sie können übersetzte Untertitel im .srt- und .vtt-Format zusammen mit dem übersetzten Video herunterladen, passend zum übersetzten gesprochenen Wort. Direkt in das Video eingebrannte Untertitel werden in der Rask-App erstellt.
Ja. Rufen Sie das Transkript ab, bearbeiten Sie den Quelltext und lassen Sie ihn von Rask erneut übersetzen, oder bearbeiten Sie den übersetzten Text direkt, um Ihre eigene Wortwahl und Ihren eigenen Tonfall beizubehalten. Synchronisieren Sie das Projekt danach einfach erneut. Glossare sorgen dafür, dass Markennamen in jeder Sprachversion einheitlich bleiben.
Ein allgemeines Chat-Modell kann ein eingefügtes Transkript übersetzen. Um jedoch ein übersetztes Video zu veröffentlichen, benötigen Sie außerdem Transkription, Timing, Stimmen, Tonmischung und Untertiteldateien. Die Videoübersetzungs-API von Rask generiert genau diese Ergebnisse direkt aus der Videodatei.
Die API-Nutzung wird pro Videominute abgerechnet (aufgerundet auf die nächste volle Minute) und nutzt dasselbe Minutenkontingent wie die Rask-App. Minuten, die über einen Tarif hinausgehen, kosten 3 US-Dollar pro Minute, und Mengenrabatte werden individuell mit unserem Team vereinbart. Die Lippensynchronisation wird separat abgerechnet, wobei jedes Konto eine kostenlose Vorschau-Minute erhält. Eine erneute Synchronisation nach einer Bearbeitung wird nur für die geänderten Abschnitte berechnet. Starten Sie einfach eine kostenlose Testversion – ganz ohne Kreditkarte.