# 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



Envie um arquivo como dados de formulário multipart ou publique um link do YouTube, Google Drive, S3, Vimeo ou qualquer URL de download direto. Você obtém um ID de mídia e os metadados técnicos antes de gastar qualquer coisa.
Passe o ID de mídia como video_id e um idioma de destino. Crie um projeto para cada idioma necessário a partir do mesmo envio, com sua própria transcrição ou um glossário, caso tenha um.
Leia o status até que ele alcance merging_done e, em seguida, baixe o vídeo traduzido e os arquivos de legenda para esse idioma.
# 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 estados. 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. A API de tradução de vídeos da Rask recebe um arquivo ou link de vídeo e o idioma de destino. Depois, ela transcreve a fala, traduz o conteúdo, gera a dublagem e mistura tudo com o áudio de fundo original. Você recebe o vídeo pronto, os arquivos de legendas e o texto traduzido, sem precisar fazer nada manualmente. Se precisar de mais precisão, você também pode revisar o conteúdo com uma pessoa antes de publicar.
O acesso à API está incluído nos planos pagos. Você gera seu ID de cliente e segredo no aplicativo e começa a fazer chamadas imediatamente. Termos empresariais, preços por volume e cobertura de idiomas personalizados passam pela nossa equipe.
Usamos credenciais de cliente OAuth 2.0. Troque seu ID de cliente e sua chave secreta por um token de acesso e envie esse token em todas as solicitações. Os tokens duram uma hora, por isso recomendamos salvá-los em cache para reutilizá-los.
O processo é assíncrono. A criação do projeto é imediata e a tradução começa na hora. Consulte GET /v2/projects/{id} até que o status mude para merging_done. O envio de webhooks faz parte da integração para empresas.
Não há limites. A API não limita as solicitações e não há cota por chave. Sua taxa de transferência é limitada pela profundidade da fila de processamento, e a prioridade de processamento faz parte dos termos empresariais.
São mais de 135 idiomas de destino, incluindo variações regionais importantes, permitindo usar códigos de localidade como es-mx ou pt-br. O idioma original é detectado automaticamente, mas você também pode defini-lo manualmente. A lista completa de idiomas compatíveis está na documentação da API. Se precisar de um idioma que não está no catálogo, fale com nossa equipe para verificarmos as opções disponíveis.
Sim. Cada projeto tem um idioma de destino, então você cria um projeto por idioma a partir do mesmo upload e os executa em paralelo. Sem limites de taxa, a tradução em lote para diferentes idiomas depende apenas de quantos projetos seu sistema cria.
O tempo de processamento varia conforme o projeto. Cada projeto mostra seu status à medida que passa pelas etapas de transcrição, tradução, geração de voz e mesclagem, para que você possa acompanhar o progresso e baixar os arquivos quando a tradução for concluída.
Sete formatos de vídeo (MP4, MOV, MKV, AVI, WebM, M4V, 3GP) e quatro formatos de áudio (MP3, WAV, FLAC, M4A). Você também pode enviar vídeos do YouTube, Google Drive, S3, Vimeo ou por URL direta.
Sim. Você pode baixar legendas traduzidas nos formatos .srt e .vtt junto com o vídeo traduzido, sincronizadas com a fala traduzida. As legendas embutidas no vídeo são criadas no aplicativo Rask.
Sim. Obtenha a transcrição, edite o texto original e deixe o Rask traduzir novamente, ou edite o texto traduzido diretamente para manter suas próprias palavras e tom. Depois, faça uma nova dublagem do projeto. Os glossários mantêm os nomes das marcas consistentes em todas as versões de idiomas.
Um modelo de bate-papo geral pode traduzir uma transcrição que você cola nele. Para publicar um vídeo traduzido, você também precisa de transcrição, sincronização, vozes, mixagem de áudio e arquivos de legenda. A API de tradução de vídeos do Rask gera esses resultados diretamente do arquivo de vídeo.
O uso da API é cobrado por minuto de vídeo, arredondado para o próximo minuto inteiro, a partir do mesmo saldo de minutos do aplicativo Rask. Minutos que excedem um plano custam US$ 3 por minuto, e termos para grandes volumes são combinados com nossa equipe. A sincronização labial é cobrada separadamente, com um minuto de visualização gratuito em cada conta, e a redublagem após uma edição é cobrada apenas para os trechos alterados. Comece com um teste gratuito, sem precisar de cartão.