# 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



Wyślij plik jako dane formularza wieloczęściowego lub opublikuj link z YouTube, Google Drive, S3, Vimeo lub dowolnego bezpośredniego adresu pobierania. Otrzymasz identyfikator pliku i metadane techniczne, zanim cokolwiek wydasz.
Przekaż identyfikator pliku jako video_id oraz język docelowy. Utwórz jeden projekt dla każdego potrzebnego języka z tego samego przesłania, używając własnej transkrypcji lub słownika, jeśli go masz.
Sprawdzaj status, aż zmieni się na merging_done, a następnie pobierz przetłumaczone wideo oraz pliki z napisami dla tego języka.
# 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 stany. 0s created
11s transcription_started
87s translation_started
99s voiceover_started
154s merging_started
165s merging_done

es-mx oraz es-es podobnie. Projekt rejestruje wersja_słownika, dzięki czemu późniejsze poprawki nigdy nie zmieniają ukończonej pracy w tle.Tak. API do tłumaczenia wideo od Rask pobiera plik wideo lub link oraz język docelowy, a następnie transkrybuje mowę, tłumaczy ją, generuje lektora i miksuje go z oryginalnym dźwiękiem w tle. Otrzymujesz przetłumaczone wideo, pliki z napisami oraz przetłumaczony tekst bez konieczności wykonywania jakichkolwiek czynności manualnych. Jeśli dokładność jest dla Ciebie kluczowa, możesz dodać weryfikację przez człowieka przed publikacją.
Dostęp do API jest zawarty w planach płatnych. W aplikacji generujesz identyfikator klienta oraz klucz tajny i możesz od razu zacząć wysyłać zapytania. Warunki dla firm, ceny wolumenowe i niestandardowe pakiety językowe są omawiane z naszym zespołem.
Za pomocą poświadczeń klienta OAuth 2.0. Wymień swój identyfikator klienta (id) i klucz tajny na token dostępu, a następnie przesyłaj go jako token bearer w każdym żądaniu. Tokeny są ważne przez godzinę, dlatego warto je zapisywać w pamięci podręcznej i używać ponownie.
Asynchronicznie. Utworzenie projektu zwraca odpowiedź natychmiast i rozpoczyna tłumaczenie. Wysyłaj zapytania GET na adres /v2/projects/{id}, dopóki status nie zmieni się na merging_done. Dostarczanie za pomocą webhooków jest częścią wdrażania dla klientów korporacyjnych.
Nie ma żadnych. API nie ogranicza liczby zapytań ani nie ma limitów na klucz. Przepustowość zależy od wielkości kolejki przetwarzania, a priorytet przetwarzania jest częścią oferty dla firm.
Na ponad 135 języków docelowych, z uwzględnieniem wariantów regionalnych tam, gdzie to istotne (parametr dst_lang obsługuje kody takie jak es-mx czy pt-br). Język źródłowy jest wykrywany automatycznie lub możesz go ustawić ręcznie. Pełna lista obsługiwanych języków znajduje się w dokumentacji API. W przypadku języków spoza katalogu skontaktuj się z naszym zespołem, aby omówić możliwości i dostępne opcje.
Tak. Każdy projekt ma jeden język docelowy, co oznacza, że z tego samego pliku możesz utworzyć osobny projekt dla każdego języka i uruchamiać je jednocześnie. Ponieważ nie ma limitów prędkości, tłumaczenie na wiele języków zależy tylko od tego, ile projektów utworzysz w systemie.
Czas przetwarzania zależy od projektu. Każdy projekt na bieżąco informuje o swoim statusie – od transkrypcji i tłumaczenia, po generowanie głosu i łączenie plików – dzięki czemu możesz pokazać postęp użytkownikom i pobrać gotowy materiał po zakończeniu pracy.
Obsługujemy siedem formatów wideo (MP4, MOV, MKV, AVI, WebM, M4V, 3GP) oraz cztery formaty audio (MP3, WAV, FLAC, M4A). Możesz też przesłać wideo z YouTube, Google Drive, S3, Vimeo lub bezpośredniego linku.
Tak. Wraz z przetłumaczonym wideo możesz pobrać napisy w plikach .srt i .vtt, idealnie zsynchronizowane z przetłumaczoną mową. Napisy wtopione w film można utworzyć bezpośrednio w aplikacji Rask.
Tak. Możesz pobrać transkrypcję, edytować tekst źródłowy i pozwolić Rask przetłumaczyć go ponownie lub bezpośrednio zmienić przetłumaczony tekst, aby zachować własny styl i ton wypowiedzi. Następnie wystarczy ponownie wygenerować dubbing. Słowniczki pomagają utrzymać spójność nazw marek we wszystkich wersjach językowych.
Zwykły model czatu może przetłumaczyć wklejoną do niego transkrypcję. Aby jednak opublikować przetłumaczony film, potrzebujesz także transkrypcji, dopasowania czasu, głosów, miksowania dźwięku i plików z napisami. API do tłumaczenia wideo Rask generuje te elementy bezpośrednio z pliku wideo.
Korzystanie z API jest rozliczane za każdą minutę wideo (zaokrąglając w górę do pełnej minuty) z tej samej puli minut co w aplikacji Rask. Minuty przekraczające limit planu kosztują 3 USD za minutę, a warunki dla dużych wolumenów ustalamy indywidualnie z naszym zespołem. Synchronizacja warg jest rozliczana osobno (każde konto ma jedną darmową minutę podglądu), a ponowne nagranie dubbingu po edycji dotyczy tylko zmienionych fragmentów. Możesz zacząć od darmowego okresu próbnego – karta kredytowa nie jest wymagana.