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



Envía el video como archivo o publica un enlace de YouTube, Google Drive, S3, Vimeo o cualquier URL directa. Una sola subida sirve para todos los idiomas de subtítulos.
Pasa el id multimedia como video_id y un idioma de destino por proyecto. Los proyectos para diferentes idiomas se ejecutan en paralelo.
Lee el estado hasta que llegue a merging_done, luego descarga los archivos .srt y .vtt y guárdalos de tu lado.
# 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 y es-es por igual. El proyecto registra glossary_version, de modo que las ediciones posteriores nunca modifiquen el trabajo finalizado en segundo plano.Sí. Cada proyecto de Rask devuelve archivos de subtítulos en formato SRT y WebVTT en el idioma de destino. Sube un video, crea un proyecto para cada idioma de subtítulos y descarga los archivos cuando el proyecto esté listo.
Dos formatos para cada proyecto: un archivo SRT y un archivo WebVTT (VTT) en el idioma de destino. La transcripción también está disponible como segmentos JSON con marcas de tiempo, por si tu plataforma necesita otro formato de subtítulos.
Los archivos de subtítulos están en el idioma de destino. Para obtener subtítulos en el idioma original, consulta los segmentos de la transcripción: cada uno incluye el texto de origen con un tiempo de inicio y de fin, lo que permite crear un archivo SRT o VTT con pocas líneas de código.
Los subtítulos están disponibles en más de 135 opciones de idiomas y regiones, como es-mx, pt-br y fr-ca, a partir de 75 idiomas de origen. Cada proyecto utiliza un idioma de destino; puedes crear un proyecto por idioma utilizando la misma subida.
Aún no. La API proporciona archivos de subtítulos para tu reproductor o software de edición de video. Si quieres un video con los subtítulos integrados, usa la aplicación web de Rask.
Los archivos contienen texto y tiempos. La fuente, el tamaño, el color y la posición se configuran en tu reproductor de video, aplicación o software de edición, lo que permite usar el mismo archivo de subtítulos en cualquier lugar.
Los archivos contienen el diálogo hablado. Las descripciones de música y efectos de sonido para espectadores sordos o con problemas de audición no se generan de manera automática; puedes agregarlas en tu propio paso de edición de subtítulos.
Cada segmento de la transcripción incluye una etiqueta de hablante en formato SPEAKER_XX, para que puedas agregar los nombres de los hablantes al crear subtítulos para entrevistas y diálogos.
Modifica el texto o los tiempos del segmento mediante la API y vuelve a generar el proyecto. Los archivos de subtítulos se actualizan junto con la versión doblada. La regeneración se cobra según los segmentos modificados, con un mínimo de un minuto por ejecución.
Los enlaces de descarga tienen firma previa y son válidos por una hora. Guarda los archivos en tu propio almacenamiento o vuelve a abrir el proyecto para obtener nuevos enlaces.
Sí. En los planes con importación de transcripción, puedes subir subtítulos en el idioma original, un archivo SRT aprobado en el idioma de destino, o ambos al crear el proyecto. Usa los subtítulos existentes como fuente o conserva tu traducción aprobada para los subtítulos y el doblaje en el idioma de destino.
Los proyectos se cobran por minuto de video, redondeado al siguiente minuto completo, utilizando la misma bolsa de minutos de Rask. El precio incluye la transcripción, la traducción, los subtítulos y la versión doblada. Los minutos adicionales cuestan $3 por minuto en los planes estándar elegibles. Los precios para empresas se adaptan a tu acuerdo.
El acceso a la API está disponible en los planes Creator Pro, Business y Enterprise, con las funciones que correspondan a tu plan. Puedes generar tu ID de cliente y clave secreta en la app y empezar a hacer llamadas de inmediato. Las condiciones para empresas, los precios por volumen y la cobertura de idiomas personalizada se gestionan a través de nuestro equipo.