# 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)"



Envoyez la vidéo sous forme de fichier ou partagez un lien provenant de YouTube, Google Drive, S3, Vimeo ou toute URL directe. Un seul téléchargement suffit pour toutes les langues de sous-titres.
Transmettez l'identifiant du média comme video_id et une langue cible par projet. Les projets pour différentes langues s'exécutent en parallèle.
Suivez l'état d'avancement jusqu'à l'obtention du statut merging_done, puis téléchargez les fichiers .srt et .vtt pour les stocker de votre côté.
# 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 et es-es de la même manière. L'historique du projet glossary_version, de sorte que les modifications ultérieures ne modifient jamais discrètement le travail déjà terminé.Oui. Chaque projet Rask génère des fichiers de sous-titres au format SRT et WebVTT dans la langue cible. Importez une vidéo, créez un projet pour chaque langue de sous-titrage et téléchargez les fichiers une fois le projet terminé.
Deux formats pour chaque projet : un fichier SRT et un fichier WebVTT (VTT) dans la langue cible. La transcription est également disponible sous forme de segments JSON avec des repères temporels, si votre plateforme nécessite un autre format de sous-titres.
Les fichiers de sous-titres sont dans la langue cible. Pour les sous-titres dans la langue d'origine, consultez les segments de la transcription : chacun d'eux contient le texte source avec un temps de début et de fin, ce qui permet de créer un fichier SRT ou VTT en quelques lignes de code.
Les sous-titres sont disponibles dans plus de 135 langues et variantes régionales (telles que l'espagnol mexicain, le portugais brésilien et le français canadien), à partir de 75 langues sources. Chaque projet prend en charge une seule langue cible ; créez un projet par langue à partir de la même vidéo importée.
Pas encore. L'API fournit des fichiers de sous-titres pour votre lecteur ou votre logiciel de montage vidéo. Pour obtenir une vidéo avec des sous-titres incrustés, utilisez l'application Web de Rask.
Les fichiers contiennent le texte et la synchronisation. La police, la taille, la couleur et l'emplacement sont définis dans votre lecteur vidéo, votre application ou votre logiciel de montage, ce qui permet d'utiliser le même fichier de sous-titres partout.
Les fichiers contiennent les dialogues parlés. Les descriptions de la musique et des effets sonores pour les spectateurs sourds et malentendants ne sont pas générées automatiquement ; vous pouvez les ajouter lors de l'étape de modification de vos sous-titres.
Chaque segment de transcription comporte une étiquette de locuteur au format SPEAKER_XX, ce qui vous permet d'ajouter des noms de locuteurs lorsque vous créez des sous-titres pour des interviews et des dialogues.
Modifiez le texte ou le minutage du segment via l'API et régénérez le projet. Les fichiers de sous-titres sont mis à jour en même temps que la version doublée. La régénération est facturée sur les segments modifiés, avec un minimum d'une minute par exécution.
Les liens de téléchargement sont pré-signés et valables une heure. Enregistrez les fichiers dans votre propre espace de stockage ou récupérez à nouveau le projet pour obtenir de nouveaux liens.
Oui. Sur les forfaits incluant l'importation de transcriptions, téléchargez des sous-titres dans la langue source, un fichier SRT approuvé dans la langue cible, ou les deux lors de la création du projet. Utilisez les sous-titres existants comme source ou conservez votre traduction approuvée pour les sous-titres et le doublage dans la langue cible.
Les projets sont facturés par minute de vidéo, arrondie à la minute supérieure, à partir du même solde de minutes que l'application Rask. Le prix comprend la transcription, la traduction, les sous-titres et la version doublée. Les minutes supplémentaires coûtent 3 $/min sur les forfaits standard éligibles. Les tarifs pour les entreprises sont adaptés à votre contrat.
L'accès à l'API est disponible sur les forfaits Creator Pro, Business et Enterprise, avec des fonctionnalités définies par votre forfait. Vous générez votre identifiant client et votre clé secrète dans l'application et vous pouvez commencer immédiatement. Les conditions pour les entreprises, la tarification par volume et la prise en charge de langues personnalisées sont gérées par notre équipe.