# 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، فيميو أو أي رابط مباشر. رفع واحد يكفي لكل لغات الترجمة.
قم بتمرير معرف الوسائط كـ 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 لغة وخيار إقليمي، مثل الإسبانية المكسيكية (es-mx) والبرتغالية البرازيلية (pt-br) والفرنسية الكندية (fr-ca)، وذلك لأكثر من 75 لغة مصدر. يتيح كل مشروع لغة مستهدفة واحدة؛ لذا يمكنك إنشاء مشروع مستقل لكل لغة باستخدام نفس الملف المرفوع.
ليس بعد. توفر واجهة برمجة التطبيقات ملفات الترجمة لتستخدمها في مشغل الفيديو أو برنامج المونتاج الخاص بك. وللصول على فيديو تظهر فيه الترجمة مدمجة بداخله، يُرجى استخدام تطبيق Rask على الويب.
تحتوي الملفات على النصوص والتوقيتات فقط. أما نوع الخط، والحجم، واللون، والموضع، فيتم ضبطها في مشغل الفيديو أو التطبيق أو برنامج التعديل الخاص بك، مما يتيح لك استخدام ملف ترجمة واحد في كل مكان.
تحتوي الملفات على الحوار المنطوق فقط. لا يتم إنشاء وصف للموسيقى والمؤثرات الصوتية المخصصة للصم وضعاف السمع بشكل تلقائي؛ بل يمكنك إضافتها بنفسك أثناء خطوة تحرير التعليقات التوضيحية.
يتضمن كل جزء من النص تسمية للمتحدث بتنسيق SPEAKER_XX، مما يتيح لك إضافة أسماء المتحدثين عند إعداد الترجمات للمقابلات والحوارات.
قم بتعديل النص أو توقيت الجزء المعني عبر واجهة برمجة التطبيقات وأعد إنشاء المشروع. يتم تحديث ملفات الترجمة بالتزامن مع النسخة المدبلجة. تُحتسب رسوم إعادة الإنشاء بناءً على الأجزاء التي تم تعديلها، وبحد أدنى دقيقة واحدة لكل عملية.
روابط التنزيل مؤقتة وتظل سارية لمدة ساعة واحدة. احفظ الملفات في مساحة التخزين الخاصة بك، أو قم بطلب المشروع مرة أخرى للحصول على روابط جديدة.
نعم. في الخطط التي تتيح استيراد النصوص، يمكنك رفع الترجمة بلغتها الأصلية، أو ملف ترجمة معتمد باللغة المستهدفة، أو كلاهما عند إنشاء المشروع. استخدم التياشير الموجودة كمرجع، أو احتفظ بترجمتك المعتمدة لترجمة النصوص والدبلجة.
يتم محاسبة المشاريع بناءً على دقائق الفيديو، مع التقريب إلى أقرب دقيقة كاملة، وذلك من نفس رصيد الدقائق المتاح في تطبيق Rask. يشمل السعر كتابة النصوص، والترجمة، والنصوص المترجمة، والنسخة المدبلجة. تكلفة الدقائق الإضافية هي 3 دولارات لكل دقيقة في الخطط القياسية المؤهلة. أما أسعار خطط الشركات فتتم مراجعتها حسب اتفاقك.
يتوفر الوصول إلى واجهة برمجة التطبيقات (API) في خطط Creator Pro، وBusiness، وEnterprise، وتتحدد الميزات بناءً على خطتك. يمكنك إنشاء معرف العميل (client id) وكلمة المرور السرية (secret) داخل التطبيق والبدء في الاستخدام فوراً. أما بالنسبة لشروط الشركات، والأسعار حسب حجم الاستخدام، وتغطية اللغات المخصصة، فيمكنك التنسيق مع فريقنا بشأنها.