# 1. 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" -H "Content-Type: application/json" \
-d '{"link": "https://example.com/onboarding.mp4", "name": "onboarding"}'
# 2. one project per subtitle language
for lang in es-mx fr-fr ja-jp; do
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"$lang\"}"
done# When status is merging_done, download both subtitle files
P=$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN")
curl -s -o onboarding.es-mx.srt "$(echo $P | jq -r .translation_srt_path)"
curl -s -o onboarding.es-mx.vtt "$(echo $P | jq -r .translation_vtt_path)"



Videoyu dosya olarak gönderin veya YouTube, Google Drive, S3, Vimeo ya da herhangi bir doğrudan URL'den bağlantı paylaşın. Tek bir yükleme, her altyazı dili için geçerlidir.
Media ID'yi video_id olarak ve proje başına bir hedef dil belirtin. Farklı diller için projeler aynı anda çalışır.
Durum merging_done aşamasına ulaşana kadar kontrol edin, ardından .srt ve .vtt dosyalarını indirip kendi tarafınıza kaydedin.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio, urllib.request
from rask_sdk import clients, enums, schemas
LANGS = ["es-mx", "fr-fr", "ja-jp"]
async def subtitle(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)
# links are presigned for one hour - save the files right away
urllib.request.urlretrieve(job.translation_srt_path, f"video.{lang}.srt")
urllib.request.urlretrieve(job.translation_vtt_path, f"video.{lang}.vtt")
async def main():
client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
media = await client.create_media_link(data=schemas.MediaCreateLink(link="https://example.com/onboarding.mp4"))
while media.status is enums.MediaStatus.PROCESSING:
await asyncio.sleep(5)
media = await client.get_media(media_id=media.id)
await asyncio.gather(*(subtitle(client, media.id, l) for l in LANGS))
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}"}
pid = requests.post(f"{API}/v2/projects", headers=h,
json={"video_id": VIDEO_ID, "dst_lang": "de-de"}).json()["id"]
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
time.sleep(10)
# translated subtitles: download the files
open("video.de-de.vtt", "wb").write(requests.get(p["translation_vtt_path"]).content)
# original-language captions: build a WebVTT file from the transcript segments
segs = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()["segments"]
cues = [f"{s['start'].replace(',', '.')} --> {s['end'].replace(',', '.')}\n{s['src']['text']}" for s in segs]
open("video.en.vtt", "w").write("WEBVTT\n\n" + "\n\n".join(cues) + "\n")// no dependencies, Node 18+ global fetch
import { writeFile } from 'node:fs/promises';
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 call = (method, path, body) => fetch(API + path, { method, headers: h, body: body && JSON.stringify(body) }).then((r) => r.json());
const langs = ['es-mx', 'pt-br', 'ko-kr'];
const tracks = await Promise.all(langs.map(async (dst_lang) => {
let p = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
const file = `subs/${dst_lang}.vtt`;
await writeFile(file, await ((await fetch(p.translation_vtt_path)).text()));
return `<track kind="subtitles" srclang="${dst_lang}" src="/${file}">`;
}));
console.log(tracks.join('\n')); // paste inside your <video> element# 1. token (valid 1 hour - cache and reuse it)
TOKEN=$(curl -s -X POST https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token \
-u "$CLIENT_ID:$CLIENT_SECRET" -d "grant_type=client_credentials" | jq -r .access_token)
# 2. create the project for one subtitle language
ID=$(curl -s -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"it-it\"}" | jq -r .id)
# 3. wait for merging_done
until [ "$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq -r .status)" = merging_done ]; do
sleep 10
done
# 4. save both subtitle files
P=$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN")
curl -s -o video.it-it.srt "$(echo $P | jq -r .translation_srt_path)"
curl -s -o video.it-it.vtt "$(echo $P | jq -r .translation_vtt_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']];
foreach (['es-mx', 'tr-tr'] as $lang) {
$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
'video_id' => $videoId, 'dst_lang' => $lang]]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
// presigned links, valid for one hour
file_put_contents("video.$lang.srt", file_get_contents($p['translation_srt_path']));
file_put_contents("video.$lang.vtt", file_get_contents($p['translation_vtt_path']));
} 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. Her Rask projesi, hedef dilde SRT ve WebVTT formatlarında altyazı dosyaları sunar. Bir video yükleyin, her altyazı dili için ayrı bir proje oluşturun ve işlem tamamlandığında dosyaları indirin.
Her projede iki format sunulur: hedef dilde bir SRT dosyası ve bir WebVTT (VTT) dosyası. Platformunuzun farklı bir altyazı formatına ihtiyacı varsa, metin dökümü (transcript) zaman damgalı JSON segmentleri olarak da kullanılabilir.
Altyazı dosyaları hedef dildedir. Orijinal dilde altyazılar için metin dökümü segmentlerini kullanabilirsiniz: her biri başlangıç ve bitiş zamanlarıyla birlikte kaynak metni içerir; bu sayede sadece birkaç satır kodla bir SRT veya VTT dosyası oluşturabilirsiniz.
Altyazılar; es-mx, pt-br ve fr-ca gibi bölgesel seçenekler dahil olmak üzere 135'ten fazla dilde ve 75 kaynak dilden çevrilebilir. Her projede tek bir hedef dili seçebilirsiniz; aynı videoyu yükleyerek her dil için ayrı bir proje oluşturun.
Henüz değil. API, video oynatıcınız veya video düzenleme yazılımınız için altyazı dosyaları sunar. Altyazıların videoya gömülü olduğu bir sürüm elde etmek için Rask web uygulamasını kullanın.
Dosyalar yalnızca metin ve zamanlama bilgilerini içerir. Yazı tipi, boyut, renk ve konum bilgileri video oynatıcınız, uygulamanız veya düzenleme yazılımınız tarafından belirlenir; böylece tek bir altyazı dosyası her yerde kullanılabilir.
Dosyalar yalnızca konuşulan diyalogları içerir. İşitme engelli izleyiciler için müzik ve ses efekti açıklamaları otomatik olarak oluşturulmaz; bunları kendi altyazı düzenleme adımınızda ekleyebilirsiniz.
Her transkript parçası SPEAKER_XX formatında bir konuşmacı etiketine sahiptir, böylece röportajlar ve diyaloglar için altyazı oluştururken konuşmacı adları ekleyebilirsiniz.
API aracılığıyla parçanın metnini veya zamanlamasını güncelleyin ve projeyi yeniden oluşturun. Altyazı dosyaları, dublajlı versiyonla birlikte güncellenir. Yeniden oluşturma işlemi, çalıştırma başına minimum bir dakika olmak üzere değişen parçalar üzerinden ücretlendirilir.
İndirme bağlantıları önceden imzalanmıştır ve bir saat boyunca geçerlidir. Dosyaları kendi depolama alanınıza kaydedin veya yeni bağlantılar almak için projeyi tekrar çağırın.
Evet. Transkript içe aktarma özelliğine sahip planlarda, proje oluştururken kaynak dildeki altyazıları, onaylanmış hedef dildeki bir SRT'yi veya her ikisini birden yükleyebilirsiniz. Mevcut altyazıları kaynak olarak kullanın veya hedef dil altyazıları ve dublaj için onaylanmış çevirinizi koruyun.
Projeler, Rask uygulamasıyla aynı dakika havuzundan, bir sonraki tam dakikaya yuvarlanarak video dakikası başına ücretlendirilir. Fiyata transkripsiyon, çeviri, altyazı ve dublajlı versiyon dahildir. Uygun standart planlarda ek dakikaların dakikası 3$'dır. Kurumsal fiyatlandırma anlaşmanıza göre özel olarak belirlenir.
API erişimi, Creator Pro, Business ve Enterprise planlarında sunulmakta olup özellikler planınıza göre belirlenir. Uygulamada istemci kimliğinizi ve gizli anahtarınızı oluşturarak hemen kullanmaya başlayabilirsiniz. Kurumsal şartlar, hacim bazlı fiyatlandırma ve özel dil kapsamı ekibimiz aracılığıyla yürütülür.