# 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 YouTube, Google Drive, S3, Vimeo ou toute URL directe. Un seul téléchargement suffit pour toutes les langues de sous-titres.
Indiquez 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 de merging_done, puis téléchargez les fichiers .srt et .vtt pour les enregistrer 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 même. Les enregistrements du projet glossary_version, de sorte que les modifications ultérieures ne modifient jamais le travail terminé sans que vous le sachiez.Oui. Chaque projet Rask génère des fichiers de sous-titres aux formats SRT et WebVTT dans la langue cible. Importez une vidéo, créez un projet pour chaque langue de sous-titrage, puis 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 a besoin d'un autre format de sous-titres.
Les fichiers de sous-titres sont dans la langue cible. Pour des sous-titres dans la langue d'origine, consultez les segments de 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 es-mx, pt-br et fr-ca), à partir de 75 langues sources. Chaque projet prend une langue cible ; créez un projet par langue à partir de la même vidéo importée.
Pas encore. L'API renvoie 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 Rask.
Les fichiers contiennent le texte et le minutage. La police, la taille, la couleur et la position se règlent dans votre lecteur vidéo, votre application ou votre logiciel de montage, ce qui permet d'utiliser un seul 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 votre propre étape d'édition des sous-titres.
Chaque segment de transcription comporte une étiquette d'interlocuteur au format SPEAKER_XX, ce qui vous permet d'ajouter les noms des intervenants 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 sur votre propre espace de stockage ou récupérez le projet pour obtenir de nouveaux liens.
Oui. Sur les forfaits incluant l'importation de transcriptions, vous pouvez importer des sous-titres dans la langue source, un fichier SRT validé 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 validé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, en puisant dans le même solde de minutes que l'application Rask AI. Le tarif comprend la transcription, la traduction, les sous-titres et la version doublée. Les minutes supplémentaires coûtent 3 $/min sur les abonnements standard éligibles. La tarification Entreprise est adaptée à votre contrat.
L'accès à l'API est disponible avec les abonnements Creator Pro, Business et Enterprise, et les fonctionnalités dépendent de votre formule. Vous générez votre identifiant client et votre clé secrète dans l'application pour commencer à l'utiliser immédiatement. Pour les conditions Enterprise, la tarification par volume et la prise en charge de langues personnalisées, veuillez contacter notre équipe.