# 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 ficheiro como dados de formulário multipart ou publique uma ligação do YouTube, Google Drive, S3, Vimeo ou qualquer URL de transferência direta. Obtém um ID de multimédia e os metadados técnicos antes de gastar qualquer valor.
Passe o ID de multimédia como video_id e um idioma de destino. Crie um projeto para cada idioma de que precisa a partir do mesmo upload, com a sua própria transcrição ou um glossário, se tiver um.
Leia o estado até atingir merging_done e, em seguida, transfira o vídeo traduzido e os ficheiros de legendas 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

es-mx e es-es igualmente. O registo do projeto glossary_version, para que edições posteriores nunca alterem silenciosamente o trabalho concluído.Sim. A API de tradução de vídeo da Rask aceita um ficheiro ou link de vídeo e um idioma de destino, transcreve a fala, traduz-la, gera a locução e mistura-a com o áudio de fundo original. Obtém o vídeo traduzido, ficheiros de legendas e o texto traduzido, sem qualquer passo manual intermédio. Adicione uma revisão humana antes de publicar quando a precisão for importante.
O acesso à API está incluído nos planos pagos. Gera o seu ID de cliente e segredo na aplicação e pode começar a fazer chamadas imediatamente. Termos para empresas, preços por volume e cobertura de idiomas personalizados são tratados pela nossa equipa.
Credenciais de cliente OAuth 2.0. Troque o seu ID de cliente e segredo por um token de acesso e, em seguida, envie-o como um token bearer em cada pedido. Os tokens são válidos por uma hora, pelo que deve armazená-los em cache e reutilizá-los.
Assíncrono. A criação de um projeto retorna imediatamente e inicia a tradução. Faça polling a GET /v2/projects/{id} até que o estado seja merging_done. A entrega de webhooks faz parte da integração empresarial.
Não existem. A API não limita os pedidos e não há quota por chave. O seu débito é limitado pela profundidade da fila de processamento, e a prioridade de processamento faz parte dos termos para empresas.
Mais de 135 idiomas de destino, com variantes regionais quando relevante, para que dst_lang aceite um local como es-mx ou pt-br. O idioma de origem é detetado automaticamente ou pode defini-lo manualmente. A lista completa de idiomas suportados encontra-se na documentação da API. Para idiomas fora do catálogo, contacte a nossa equipa para discutir a viabilidade e as opções disponíveis.
Sim. Cada projeto tem um idioma de destino, por isso cria um projeto por idioma a partir do mesmo carregamento e executa-os em paralelo. Sem limites de taxa, a tradução em lote para diferentes idiomas depende apenas de quantos projetos o seu sistema cria.
O tempo de processamento varia consoante o projeto. Cada projeto indica o seu estado à medida que avança pela transcrição, tradução, geração de voz e união, para que possa mostrar o progresso aos seus utilizadores e descarregar os ficheiros quando a tradução estiver concluída.
Sete formatos de vídeo (MP4, MOV, MKV, AVI, WebM, M4V, 3GP) e quatro formatos de áudio (MP3, WAV, FLAC, M4A). Também pode carregar vídeos a partir do YouTube, Google Drive, S3, Vimeo ou de um URL direto.
Sim. Pode descarregar legendas traduzidas em .srt e .vtt juntamente com o vídeo traduzido, sincronizadas com o discurso traduzido. As legendas integradas no vídeo são criadas na aplicação Rask.
Sim. Obtenha a transcrição, edite o texto original e deixe que a Rask o traduza novamente, ou edite o texto traduzido diretamente para manter as suas próprias palavras e tom. Depois, volte a fazer a dobragem do projeto. Os glossários mantêm os nomes das marcas consistentes em todas as versões linguísticas.
Um modelo de chat geral consegue traduzir uma transcrição que lá coloque. Para publicar um vídeo traduzido, também precisa de transcrição, temporização, vozes, mistura de áudio e ficheiros de legendas. A API de tradução de vídeo da Rask produz esses resultados a partir do próprio ficheiro de vídeo.
A utilização da API é cobrada por minuto de vídeo, arredondado para o minuto inteiro seguinte, a partir do mesmo lote de minutos da aplicação Rask. Os minutos para além de um plano custam $3 por minuto, e as condições para grandes volumes são acordadas com a nossa equipa. A sincronização labial é cobrada separadamente, com um minuto de pré-visualização gratuito em cada conta, e a nova dobragem após uma edição é cobrada apenas para os segmentos alterados. Comece com uma avaliação gratuita, sem necessidade de cartão.