# 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



Envoyez un fichier sous forme de données de formulaire multipart, ou publiez un lien provenant de YouTube, Google Drive, S3, Vimeo ou toute URL de téléchargement direct. Vous obtenez un identifiant de média et les métadonnées techniques avant de dépenser quoi que ce soit.
Transmettez l'identifiant du média comme video_id et une langue cible. Créez un projet pour chaque langue dont vous avez besoin à partir du même fichier importé, avec votre propre transcription ou un glossaire si vous en avez un.
Lisez status jusqu'à ce qu'il indique merging_done, puis téléchargez la vidéo traduite et les fichiers de sous-titres pour cette langue.
# 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 états. 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. L'API de traduction vidéo de Rask prend un fichier ou un lien vidéo ainsi qu'une langue cible, puis transcrit la parole, la traduit, génère la voix off et la mixe avec l'audio de fond d'origine. Vous obtenez la vidéo traduite, les fichiers de sous-titres et le texte traduit, sans aucune intervention manuelle. Ajoutez une révision humaine avant la publication lorsque la précision est primordiale.
L'accès à l'API est inclus dans les abonnements payants. Vous générez votre identifiant client et votre secret dans l'application pour commencer à l'utiliser immédiatement. Pour les conditions d'entreprise, les tarifs dégressifs et la prise en charge de langues personnalisées, veuillez contacter notre équipe.
Identifiants client OAuth 2.0. Échangez votre identifiant et votre secret client contre un jeton d'accès, puis envoyez-le en tant que jeton du porteur (bearer token) à chaque requête. Les jetons sont valables une heure, pensez donc à les mettre en cache et à les réutiliser.
Asynchrone. La création d'un projet renvoie une réponse immédiate et lance la traduction. Effectuez des requêtes GET sur /v2/projects/{id} jusqu'à ce que le statut soit merging_done. L'envoi par webhook fait partie de l'intégration pour les entreprises.
Il n'y en a pas. L'API ne limite pas le nombre de requêtes et il n'y a pas de quota par clé. Votre débit dépend de la taille de la file d'attente de traitement, et la priorité de traitement fait partie des conditions pour les entreprises.
Plus de 135 langues cibles, avec des variantes régionales lorsque cela est pertinent, de sorte que dst_lang accepte un code local tel que es-mx ou pt-br. La langue source est détectée automatiquement ou peut être définie manuellement. La liste complète des langues prises en charge se trouve dans la documentation de l'API. Pour les langues non répertoriées, contactez notre équipe pour étudier la faisabilité et les options disponibles.
Oui. Chaque projet possède une seule langue cible ; vous créez donc un projet par langue à partir du même fichier téléversé et les exécutez en parallèle. En l'absence de limites de débit, la traduction par lots dans différentes langues dépend uniquement du nombre de projets créés par votre système.
Le temps de traitement varie selon le projet. Chaque projet indique son statut au fil des étapes (transcription, traduction, génération vocale et fusion), ce qui vous permet de suivre l'avancement pour vos utilisateurs et de télécharger les fichiers une fois la traduction terminée.
Sept formats vidéo (MP4, MOV, MKV, AVI, WebM, M4V, 3GP) et quatre formats audio (MP3, WAV, FLAC, M4A) sont pris en charge. Vous pouvez également importer une vidéo depuis YouTube, Google Drive, S3, Vimeo ou via une URL directe.
Oui. Vous pouvez télécharger des sous-titres traduits aux formats .srt et .vtt en même temps que la vidéo traduite, synchronisés avec la voix traduite. Les sous-titres incrustés dans la vidéo sont créés directement dans l'application Rask.
Oui. Récupérez la transcription, modifiez le texte source et laissez Rask effectuer une nouvelle traduction, ou modifiez directement le texte traduit pour conserver vos propres termes et votre ton. Relancez ensuite le doublage du projet. Les glossaires permettent de garder les noms de marque cohérents dans toutes les versions linguistiques.
Un modèle de discussion généraliste peut traduire une transcription que vous lui collez. Pour publier une vidéo traduite, vous avez également besoin de la transcription, de la synchronisation, des voix, du mixage audio et de fichiers de sous-titres. L'API de traduction vidéo de Rask génère tous ces éléments directement à partir du fichier vidéo.
L'utilisation de l'API est facturée à la minute de vidéo, arrondie à la minute supérieure, en puisant dans le même solde de minutes que l'application Rask. Les minutes excédentaires coûtent 3 $ par minute, et des tarifs dégressifs pour les volumes importants peuvent être conclus avec notre équipe. La synchronisation labial est facturée séparément (avec une minute d'essai gratuite sur chaque compte), et le redoublage après modification ne facture que les segments modifiés. Commencez par un essai gratuit, sans carte bancaire requise.