# 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)"



أرسل الفيديو كملف، أو شارك رابطاً من يوتيوب، أو جوجل درايف، أو S3، أو فيميو، أو أي رابط مباشر. يكفي رفع الفيديو مرة واحدة لتوفير الترجمة بكل لغة.
مرر معرف الوسائط (media id) كـ video_id وحدد لغة مستهدفة واحدة لكل مشروع. تعمل مشاريع اللغات المختلفة بالتوازي.
تابع حالة المعالجة حتى تكتمل (merging_done)، ثم قم بتحميل ملفات .srt و .vtt واحفظها لديك.
# 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 و es-es على حد سواء. يسجل المشروع glossary_version، بحيث لا تؤدي التعديلات لاحقاً إلى تغيير العمل المكتمل دون ملاحظة ذلك.نعم. يوفر كل مشروع على Rask ملفات ترجمة بصيغتي SRT وWebVTT باللغة المطلوبة. قم برفع الفيديو، وأنشئ مشروعاً لكل لغة ترجمة، ثم قم بتحميل الملفات عند اكتمال المشروع.
صيغتان لكل مشروع: ملف SRT وآخر WebVTT (VTT) باللغة المطلوبة. النص الأصلي متاح أيضاً كأجزاء بتنسيق JSON مع الطوابع الزمنية، وذلك في حال احتياج منصتك لصيغة أخرى.
ملفات الترجمة تكون باللغة المستهدفة. للحصول على ترجمة باللغة الأصلية، راجع أجزاء النص الأصلي: يحتوي كل جزء على النص مع وقت البداية والنهاية، ويمكن تحويله بسهولة إلى ملف SRT أو VTT ببضع أسطر برمجية.
توفر الترجمة لأكثر من 135 لغة وخياراً إقليمياً (مثل الإسبانية والبرتغالية والفرنسية بلهجاتها المختلفة)، من أصل 75 لغة مصدر. يتطلب كل مشروع لغة مستهدفة واحدة؛ يمكنك إنشاء مشروع لكل لغة من نفس ملف الفيديو المرفوع.
ليس بعد. توفر واجهة برمجة التطبيقات ملفات الترجمة لتستخدمها في المشغل أو برنامج تعديل الفيديو الخاص بك. وللحصول على فيديو تظهر فيه الترجمة مدمجة، يرجى استخدام تطبيق الويب الخاص بـ Rask.
تحتوي الملفات على النص والتوقيت فقط. يتم تحديد نوع الخط، والحجم، واللون، والمكان في مشغل الفيديو أو تطبيق التعديل الخاص بك، مما يجعل ملف ترجمة واحداً صالحاً للاستخدام في كل مكان.
تحتوي الملفات على الحوار المنطوق فقط. لا يتم إنشاء وصف للموسيقى والمؤثرات الصوتية للمشاهدين الصم أو ضعاف السمع تلقائياً، ويمكنك إضافتها بنفسك أثناء خطوة تعديل الترجمة.
يحمل كل جزء من النص علامة للمتحدث بالصيغة SPEAKER_XX، مما يتيح لك إضافة أسماء المتحدثين عند إعداد الترجمة للمقابلات والحوارات.
قم بتعديل النص أو توقيت الجزء المطلوب عبر واجهة برمجة التطبيقات وأعد تشغيل المشروع. يتم تحديث ملفات الترجمة بالتزامن مع النسخة المدبلجة. تُحسب تكلفة إعادة التشغيل بناءً على الأجزاء المعدلة، وبحد أدنى دقيقة واحدة لكل عملية.
روابط التنزيل مؤقتة وصالحة لمدة ساعة واحدة. احفظ الملفات في وحدة التخزين الخاصة بك، أو أنشئ المشروع مرة أخرى للحصول على روابط جديدة.
نعم. في الخطط التي تدعم استيراد النصوص، يمكنك تحميل ترجمات لغة المصدر، أو ملف SRT معتمد للغة المستهدفة، أو كلاهما عند إنشاء المشروع. استخدم التعليقات التوضيحية الموجودة كمصدر، أو احتفظ بترجمتك المعتمدة للترجمة النصية والدبلجة في اللغة المستهدفة.
يتم محاسبة المشاريع بناءً على دقائق الفيديو، مع التقريب إلى أقرب دقيقة كاملة، من نفس رصيد الدقائق في تطبيق Rask. السعر يشمل النسخ، والترجمة، والنصوص، والنسخة المدبلجة. تكلفة الدقائق الإضافية هي 3 دولارات لكل دقيقة في الخطط القياسية المؤهلة. أسعار المؤسسات مخصصة حسب اتفاقك.
تتوفر إمكانية الوصول ضمن خطط Creator Pro، وBusiness، وEnterprise، وتتحدد الميزات بناءً على خطتك. يمكنك إنشاء معرف العميل والرمز السري الخاص بك في التطبيق والبدء في الاستخدام فوراً. أما بالنسبة لشروط خطة Enterprise، وأسعار الكميات الكبيرة، ودعم اللغات المخصصة، فيمكنك التواصل مع فريقنا.