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



Envie o vídeo como arquivo ou cole um link do YouTube, Google Drive, S3, Vimeo ou qualquer URL direta. Um único envio serve para todos os idiomas de legenda.
Passe o ID de mídia como video_id e um idioma de destino por projeto. Os projetos para diferentes idiomas são executados em paralelo.
Monitore o status até que ele atinja merging_done, depois baixe os arquivos .srt e .vtt e salve-os no seu sistema.
# 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

pt-br e pt-pt igualmente. O registro do projeto versão_do_glossário, garantindo que edições futuras nunca alterem o que já foi finalizado sem que você perceba.Sim. Cada projeto da Rask retorna arquivos de legenda em SRT e WebVTT no idioma de destino. Envie um vídeo, crie um projeto para cada idioma de legenda e baixe os arquivos quando o projeto for concluído.
Dois formatos para cada projeto: um arquivo SRT e um arquivo WebVTT (VTT) no idioma de destino. A transcrição também está disponível como segmentos JSON com carimbos de data/hora, caso sua plataforma precise de outro formato de legenda.
Os arquivos de legenda estão no idioma de destino. Para legendas no idioma original, leia os segmentos da transcrição: cada um possui o texto original com o tempo de início e fim, o que pode ser convertido em um arquivo SRT ou VTT com poucas linhas de código.
As legendas estão disponíveis em mais de 135 opções de idiomas e regiões, como es-mx, pt-br e fr-ca, a partir de 75 idiomas de origem. Cada projeto usa um idioma de destino; crie um projeto por idioma a partir do mesmo envio.
Ainda não. A API retorna arquivos de legenda para o seu player ou software de edição de vídeo. Para obter um vídeo com legendas embutidas, use o aplicativo web da Rask.
Os arquivos contêm texto e tempo. A fonte, o tamanho, a cor e a posição são definidos no seu player de vídeo, aplicativo ou software de edição, o que permite usar o mesmo arquivo de legenda em qualquer lugar.
Os arquivos contêm o diálogo falado. Descrições de músicas e efeitos sonoros para espectadores surdos ou com deficiência auditiva não são geradas automaticamente; adicione-as na sua própria etapa de edição de legendas.
Cada segmento da transcrição possui um rótulo de falante no formato SPEAKER_XX, para que você possa adicionar os nomes dos criadores ao criar legendas para entrevistas e diálogos.
Atualize o texto ou o tempo do segmento por meio da API e gere o projeto novamente. Os arquivos de legenda são atualizados junto com a versão dublada. A nova geração é cobrada com base nos segmentos alterados, com um mínimo de um minuto por execução.
Os links de download são pré-assinados e válidos por uma hora. Salve os arquivos no seu próprio armazenamento ou acesse o projeto novamente para obter novos links.
Sim. Nos planos com importação de transcrição, envie as legendas no idioma de origem, um arquivo SRT aprovado no idioma de destino ou ambos ao criar o projeto. Use legendas existentes como origem ou mantenha sua tradução aprovada para as legendas e a dublagem no idioma de destino.
Os projetos são cobrados por minuto de vídeo, arredondados para o próximo minuto inteiro, a partir do mesmo saldo de minutos do aplicativo Rask. O preço inclui transcrição, tradução, legendas e a versão dublada. Minutos adicionais custam US$ 3/min nos planos padrão elegíveis. Os preços para empresas são personalizados de acordo com o seu contrato.
O acesso à API está disponível nos planos Creator Pro, Business e Enterprise, com recursos definidos de acordo com o seu plano. Você gera seu ID de cliente e chave secreta no aplicativo e pode começar a fazer chamadas imediatamente. Condições para empresas, preços por volume e suporte a idiomas personalizados são tratados diretamente com a nossa equipe.