# 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



Invia un file come dati di modulo multipart o pubblica un link da YouTube, Google Drive, S3, Vimeo o qualsiasi URL di download diretto. Ottieni un ID multimediale e i metadati tecnici prima di spendere qualsiasi importo.
Passa l'ID multimediale come video_id e una lingua di arrivo. Crea un progetto per ogni lingua di cui hai bisogno dallo stesso caricamento, con la tua trascrizione o un glossario se ne hai uno.
Leggi lo stato finché non raggiunge merging_done, quindi scarica il video tradotto e i file dei sottotitoli per quella lingua.
# 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 stati. 0s created
11s transcription_started
87s translation_started
99s voiceover_started
154s merging_started
165s merging_done

es-mx e es-es allo stesso modo. Il progetto registra glossary_version, così le modifiche successive non alterano mai inaspettatamente il lavoro completato.Sì. L'API di traduzione video di Rask riceve un file video o un link e una lingua di arrivo, dopodiché trascrive il parlato, lo traduce, genera la voce fuori campo e la unisce all'audio di sottofondo originale. Ottieni il video tradotto, i file dei sottotitoli e il testo tradotto, senza passaggi manuali intermedi. Aggiungi una revisione umana prima della pubblicazione quando la precisione è fondamentale.
L'accesso alle API è incluso nei piani a pagamento. Puoi generare l'ID cliente e la password segreta direttamente nell'app e iniziare a fare chiamate da subito. Per le condizioni aziendali, i prezzi basati sul volume e la copertura di lingue personalizzate, puoi rivolgerti al nostro team.
Credenziali client OAuth 2.0. Scambia il tuo ID client e la chiave segreta con un token di accesso, quindi invialo come bearer token in ogni richiesta. I token durano un'ora, quindi è consigliabile memorizzarli nella cache e riutilizzarli.
Asincrona. La creazione di un progetto restituisce subito una risposta e avvia la traduzione. Interroga GET /v2/projects/{id} finché lo stato non diventa merging_done. La consegna tramite webhook è inclusa nell'onboarding per le aziende.
Non ce ne sono. L'API non limita le richieste e non esiste una quota per singola chiave. La velocità di elaborazione dipende dalla lunghezza della coda e la priorità di elaborazione fa parte dei contratti aziendali.
Oltre 135 lingue di arrivo, con varianti regionali dove necessario; il parametro dst_lang accetta codici come es-mx o pt-br. La lingua di origine viene rilevata automaticamente oppure puoi impostarla tu. L'elenco completo delle lingue supportate si trova nella documentazione delle API. Per le lingue non presenti nel catalogo, contatta il nostro team per valutare la fattibilità e le opzioni disponibili.
Sì. Ogni progetto ha una sola lingua di arrivo, quindi potete creare un progetto per ciascuna lingua partendo dallo stesso file caricato ed eseguirli contemporaneamente. Senza limiti di velocità, la traduzione in blocco in diverse lingue dipende solo da quanti progetti il vostro sistema crea.
Il tempo di elaborazione varia a seconda del progetto. Ciascun progetto mostra il suo stato durante la trascrizione, la traduzione, la creazione della voce e l'unione, così potete mostrare i progressi ai vostri utenti e scaricare i file quando la traduzione è completata.
Sette formati video (MP4, MOV, MKV, AVI, WebM, M4V, 3GP) e quattro formati audio (MP3, WAV, FLAC, M4A). Potete anche caricare video da YouTube, Google Drive, S3, Vimeo o tramite un URL diretto.
Sì. Potete scaricare i sottotitoli tradotti in formato .srt e .vtt insieme al video tradotto, sincronizzati con il parlato tradotto. I sottotitoli impressi nel video vengono creati direttamente nell'app di Rask.
Sì. Recuperate la trascrizione, modificate il testo di partenza e fate tradurre nuovamente a Rask, oppure modificate direttamente il testo tradotto per mantenere le vostre parole e il vostro tono. Dopodiché, rigenerate il doppiaggio del progetto. I glossari mantengono i nomi dei marchi coerenti in ogni versione linguistica.
Un normale modello di chat può tradurre una trascrizione che gli incollate. Per pubblicare un video tradotto, però, vi servono anche la trascrizione, la sincronizzazione temporale, le voci, il missaggio audio e i file dei sottotitoli. L'API di traduzione video di Rask genera tutti questi elementi direttamente dal file video.
L'uso dell'API viene fatturato al minuto di video, arrotondato per eccesso al minuto intero successivo, attingendo dallo stesso monte minuti dell'app Rask. I minuti eccedenti il piano costano 3 dollari l'uno, mentre le tariffe per grandi volumi vengono concordate con il nostro team. La sincronizzazione labial viene fatturata separatamente, con un minuto di prova gratuito su ogni account, e il nuovo doppiaggio dopo una modifica viene addebitato solo per i segmenti modificati. Iniziate con una prova gratuita, senza carta di credito richiesta.