# 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



Bir dosyayı çok parçalı form verisi olarak gönderin ya da YouTube, Google Drive, S3, Vimeo veya herhangi bir doğrudan indirme URL’sinden bir bağlantı paylaşın. Herhangi bir ödeme yapmadan önce bir medya kimliği ve teknik meta verileri alırsınız.
Medya kimliğini video_id olarak ve hedef dili belirtin. Aynı yüklemeden ihtiyacınız olan her dil için birer proje oluşturun; varsa kendi transkriptinizi veya sözlüğünüzü ekleyin.
merging_done durumuna ulaşana kadar durumu okuyun, ardından çevrilen videoyu ve o dil için altyazı dosyalarını indirin.
# 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);
}_tamamlandı durumlar. 0s created
11s transcription_started
87s translation_started
99s voiceover_started
154s merging_started
165s merging_done

es-mx ve es-es benzer şekilde hizmet eder. Proje kayıtları glossary_version, böylece sonraki düzenlemeler tamamlanan çalışmaları asla habersiz değiştirmez.Evet. Rask video çevirisi API'si bir video dosyası veya bağlantısı ile hedef dili alır, ardından konuşmayı metne dönüştürür, çevirir, seslendirme oluşturur ve bunu orijinal arka plan sesiyle birleştirir. Aşamalar arasında hiçbir manuel işlem yapmadan çevrilmiş videoyu, altyazı dosyalarını ve çevrilmiş metni elde edersiniz. Doğruluğun önemli olduğu durumlarda yayınlamadan önce insan kontrolü ekleyin.
API erişimi ücretli planlara dahildir. Uygulama içinde istemci kimliğinizi (client id) ve gizli anahtarınızı (secret) oluşturup hemen kullanmaya başlayabilirsiniz. Kurumsal koşullar, hacim bazlı fiyatlandırma ve özel dil kapsamı için ekibimizle iletişime geçebilirsiniz.
OAuth 2.0 istemci kimlik bilgileriyle. İstemci kimliğinizi ve gizli anahtarınızı bir erişim belirteci (token) ile değiştirin, ardından bunu her istekte bir bearer token olarak gönderin. Token'lar bir saat geçerlidir, bu yüzden bunları önbelleğe alıp yeniden kullanın.
Asenkron olarak. Bir proje oluşturulduğunda işlem hemen başlar ve çeviri tetiklenir. Durum merging_done olana kadar GET /v2/projects/{id} adresini sorgulayın. Webhook teslimi, kurumsal sisteme geçiş sürecinin bir parçasıdır.
Herhangi bir sınır yoktur. API, istekleri kısıtlamaz ve anahtar başına bir kota uygulanmaz. İşlem kapasiteniz, işleme kuyruğunun derinliğine bağlıdır ve işlem önceliği kurumsal koşulların bir parçasıdır.
Önemli olduğu bölgelerdeki yerel varyasyonlar dahil 135'ten fazla hedef dil; böylece dst_lang es-mx veya pt-br gibi bir yerel ayar kullanır. Kaynak dil otomatik olarak algılanır veya dilerseniz kendiniz ayarlayabilirsiniz. Desteklenen dillerin tam listesi API belgelerinde yer almaktadır. Kataloğun dışındaki diller için yapılabilirliği ve mevcut seçenekleri görüşmek üzere ekibimizle iletişime geçin.
Evet. Her projenin bir hedef dili vardır, bu nedenle aynı yüklemeden dil başına bir proje oluşturabilir ve bunları aynı anda çalıştırabilirsiniz. İstek sınırı olmadığından, farklı dillere toplu çeviri yalnızca sisteminizin kaç proje oluşturduğuna bağlıdır.
İşlem süresi projeye göre değişir. Her proje; transkripsiyon, çeviri, ses üretimi ve birleştirme aşamalarından geçerken durumunu bildirir; böylece kullanıcılarınıza ilerlemeyi gösterebilir ve çeviri tamamlandığında dosyaları indirebilirsiniz.
Yedi video formatı (MP4, MOV, MKV, AVI, WebM, M4V, 3GP) ve dört ses formatı (MP3, WAV, FLAC, M4A) desteklenir. Ayrıca YouTube, Google Drive, S3, Vimeo veya doğrudan bir URL üzerinden de video yükleyebilirsiniz.
Evet. Çevrilen konuşmayla senkronize edilmiş .srt ve .vtt formatındaki altyazıları çevrilen videoyla birlikte indirebilirsiniz. Videonun içine gömülen altyazılar Rask uygulamasında oluşturulur.
Evet. Metni alıp kaynak metni düzenleyebilir ve Rask'ın yeniden çevirmesini sağlayabilir ya da kendi kelimelerinizi ve tonunuzu korumak için çevrilen metni doğrudan düzenleyebilirsiniz. Ardından projeyi yeniden seslendirebilirsiniz. Sözlükler, marka adlarının her dilde tutarlı kalmasını sağlar.
Genel bir sohbet modeli, içine yapıştırdığınız bir metni çevirebilir. Çevrilmiş bir video yayınlamak için ayrıca transkripsiyona, zamanlamaya, seslere, ses miksajına ve altyazı dosyalarına ihtiyacınız vardır. Rask video çevirisi API'si bu çıktıları doğrudan video dosyasından üretir.
API kullanımı, sonraki tam dakikaya yuvarlanarak video dakikası başına ücretlendirilir ve Rask uygulamasındaki dakika havuzundan düşer. Planın üzerindeki dakikalar dakika başına 3 dolardır ve toplu kullanım koşulları ekibimizle belirlenir. Dudak senkronizasyonu ayrı olarak ücretlendirilir; her hesapta bir dakikalık ücretsiz önizleme hakkı bulunur ve bir düzenlemeden sonraki yeniden seslendirmeler yalnızca değiştirilen segmentler için ücretlendirilir. Kredi kartı gerektirmeyen ücretsiz deneme sürümüyle başlayın.