# 1. 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" -H "Content-Type: application/json" \
-d '{"link": "https://example.com/onboarding.mp4", "name": "onboarding"}'
# 2. one project per subtitle language
for lang in es-mx fr-fr ja-jp; do
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"$lang\"}"
done# When status is merging_done, download both subtitle files
P=$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN")
curl -s -o onboarding.es-mx.srt "$(echo $P | jq -r .translation_srt_path)"
curl -s -o onboarding.es-mx.vtt "$(echo $P | jq -r .translation_vtt_path)"



Laden Sie das Video als Datei hoch oder fügen Sie einen Link von YouTube, Google Drive, S3, Vimeo oder eine direkte URL ein. Ein einziger Upload reicht für jede Untertitelsprache.
Übergeben Sie die Medien-ID als video_id und eine Zielsprache pro Projekt. Projekte für verschiedene Sprachen laufen parallel.
Warten Sie, bis der Status den Wert „merging_done“ erreicht hat, laden Sie dann die .srt- und .vtt-Dateien herunter und speichern Sie sie bei sich ab.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio, urllib.request
from rask_sdk import clients, enums, schemas
LANGS = ["es-mx", "fr-fr", "ja-jp"]
async def subtitle(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)
# links are presigned for one hour - save the files right away
urllib.request.urlretrieve(job.translation_srt_path, f"video.{lang}.srt")
urllib.request.urlretrieve(job.translation_vtt_path, f"video.{lang}.vtt")
async def main():
client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
media = await client.create_media_link(data=schemas.MediaCreateLink(link="https://example.com/onboarding.mp4"))
while media.status is enums.MediaStatus.PROCESSING:
await asyncio.sleep(5)
media = await client.get_media(media_id=media.id)
await asyncio.gather(*(subtitle(client, media.id, l) for l in LANGS))
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}"}
pid = requests.post(f"{API}/v2/projects", headers=h,
json={"video_id": VIDEO_ID, "dst_lang": "de-de"}).json()["id"]
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
time.sleep(10)
# translated subtitles: download the files
open("video.de-de.vtt", "wb").write(requests.get(p["translation_vtt_path"]).content)
# original-language captions: build a WebVTT file from the transcript segments
segs = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()["segments"]
cues = [f"{s['start'].replace(',', '.')} --> {s['end'].replace(',', '.')}\n{s['src']['text']}" for s in segs]
open("video.en.vtt", "w").write("WEBVTT\n\n" + "\n\n".join(cues) + "\n")// no dependencies, Node 18+ global fetch
import { writeFile } from 'node:fs/promises';
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 call = (method, path, body) => fetch(API + path, { method, headers: h, body: body && JSON.stringify(body) }).then((r) => r.json());
const langs = ['es-mx', 'pt-br', 'ko-kr'];
const tracks = await Promise.all(langs.map(async (dst_lang) => {
let p = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
const file = `subs/${dst_lang}.vtt`;
await writeFile(file, await ((await fetch(p.translation_vtt_path)).text()));
return `<track kind="subtitles" srclang="${dst_lang}" src="/${file}">`;
}));
console.log(tracks.join('\n')); // paste inside your <video> element# 1. token (valid 1 hour - cache and reuse it)
TOKEN=$(curl -s -X POST https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token \
-u "$CLIENT_ID:$CLIENT_SECRET" -d "grant_type=client_credentials" | jq -r .access_token)
# 2. create the project for one subtitle language
ID=$(curl -s -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"it-it\"}" | jq -r .id)
# 3. wait for merging_done
until [ "$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq -r .status)" = merging_done ]; do
sleep 10
done
# 4. save both subtitle files
P=$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN")
curl -s -o video.it-it.srt "$(echo $P | jq -r .translation_srt_path)"
curl -s -o video.it-it.vtt "$(echo $P | jq -r .translation_vtt_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']];
foreach (['es-mx', 'tr-tr'] as $lang) {
$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
'video_id' => $videoId, 'dst_lang' => $lang]]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
// presigned links, valid for one hour
file_put_contents("video.$lang.srt", file_get_contents($p['translation_srt_path']));
file_put_contents("video.$lang.vtt", file_get_contents($p['translation_vtt_path']));
} 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. Jedes Rask-Projekt gibt Untertiteldateien im SRT- und WebVTT-Format in der Zielsprache aus. Laden Sie ein Video hoch, erstellen Sie für jede Untertitelsprache ein Projekt und laden Sie die Dateien herunter, sobald das Projekt abgeschlossen ist.
Zwei Formate für jedes Projekt: eine SRT-Datei und eine WebVTT-Datei (VTT) in der Zielsprache. Das Transkript ist bei Bedarf auch als JSON-Segmente mit Zeitstempeln verfügbar, falls Ihre Plattform ein anderes Format benötigt.
Die Untertiteldateien sind in der Zielsprache. Für Untertitel in der Originalsprache lesen Sie die Transkript-Segmente: Jedes enthält den Quelltext mit Start- und Endzeit, was sich mit wenigen Zeilen Code in eine SRT- oder VTT-Datei umwandeln lässt.
Untertitel sind in über 135 Sprachen und regionalen Varianten (wie es-mx, pt-br und fr-ca) aus 75 Quellsprachen verfügbar. Jedes Projekt verwendet eine Zielsprache; erstellen Sie pro Sprache ein Projekt aus demselben Upload.
Noch nicht. Die API gibt Untertiteldateien für Ihren Player oder Ihre Videobearbeitungssoftware aus. Um ein Video mit fest integrierten Untertiteln zu erhalten, nutzen Sie die Rask Web-App.
Die Dateien enthalten Text und Timing. Schriftart, Größe, Farbe und Position werden in Ihrem Video-Player, Ihrer App oder Ihrer Bearbeitungssoftware festgelegt, wodurch eine Untertiteldatei überall verwendet werden kann.
Die Dateien enthalten den gesprochenen Dialog. Beschreibungen von Musik und Soundeffekten für hörgeschädigte Zuschauer werden nicht automatisch generiert – fügen Sie diese in Ihrem eigenen Untertitel-Bearbeitungsschritt hinzu.
Jeder Transkriptabschnitt enthält ein Sprecher-Label im Format SPEAKER_XX. So können Sie bei Interviews und Dialogen ganz einfach die Namen der Sprecher hinzufügen.
Passen Sie den Text oder das Timing des Abschnitts über die API an und erstellen Sie das Projekt neu. Die Untertiteldateien werden zusammen mit der synchronisierten Version aktualisiert. Die Neugenerierung wird nach den geänderten Abschnitten abgerechnet, mit einer Mindestdauer von einer Minute pro Durchlauf.
Die Download-Links sind mit einer Signatur versehen und eine Stunde lang gültig. Speichern Sie die Dateien auf Ihrem eigenen Speicher oder rufen Sie das Projekt erneut auf, um neue Links zu erhalten.
Ja. Bei Tarifen mit Transkript-Import können Sie beim Erstellen des Projekts Untertitel in der Quellsprache, eine genehmigte SRT-Datei in der Zielsprache oder beides hochladen. Nutzen Sie vorhandene Untertitel als Quelle oder verwenden Sie Ihre geprüfte Übersetzung für die Untertitel und das Synchronisieren in der Zielsprache.
Die Abrechnung erfolgt pro Videominute, aufgerundet auf die nächste volle Minute, über dasselbe Minuten-Guthaben wie in der Rask-App. Der Preis umfasst Transkription, Übersetzung, Untertitel und die synchronisierte Version. Zusätzliche Minuten kosten bei berechtigten Standardtarifen 3 $/Minute. Preise für Unternehmen werden individuell auf Ihre Vereinbarung abgestimmt.
Der API-Zugriff ist in den Tarifen Creator Pro, Business und Enterprise verfügbar, wobei der genaue Funktionsumfang von Ihrem Tarif abhängt. Sie erstellen Ihre Client-ID sowie Ihr Secret direkt in der App und können sofort loslegen. Enterprise-Bedingungen, Staffelpreise und spezielle Sprachanpassungen stimmen wir gerne persönlich mit Ihnen ab.