# 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



أرسل ملفاً كبيانات نموذج متعددة الأجزاء، أو انشر رابطاً من يوتيوب أو جوجل درايف أو إس 3 أو فيميو أو أي رابط تحميل مباشر. تحصد على معرف الوسائط البيانات التقنية الوصفية قبل إنفاق أي شيء.
قم بتمرير معرف الوسائط كـ video_id واللغة المستهدفة. أنشئ مشروعاً لكل لغة تحتاجها من نفس التحميل، مع النص الخاص بك أو مسرد مصطلحات إذا كان لديك واحد.
اقرأ الحالة حتى تصل إلى merging_done، ثم قم بتنزيل الفيديو المترجم وملفات الترجمة لتلك اللغة.
# 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 حالات. 0s created
11s transcription_started
87s translation_started
99s voiceover_started
154s merging_started
165s merging_done

es-mx و es-es على حد سواء. يسجل المشروع glossary_version، بحيث لا تؤدي التعديلات اللاحقة إلى تغيير العمل المكتمل دون إشعار.نعم. تأخذ واجهة برمجة تطبيقات ترجمة الفيديو من Rask ملف فيديو أو رابطاً ولغة مستهدفة، ثم تقوم بنسخ الكلام، وترجمته، وتوليد التعليق الصوتي ودمجه مع صوت الخلفية الأصلي. تحصل على الفيديو المترجم، وملفات الترجمة، والنص المترجم، دون أي خطوة يدوية في المنتصف. أضف مراجعة بشرية قبل النشر عندما تكون الدقة أمراً مهمًا.
تم تضمين صلاحية استخدام واجهة برمجة التطبيقات مع الباقات المدفوعة. يمكنك إنشاء معرف العميل الخاص بك وكلمة السر في التطبيق والبدء في استخدام الخدمة فوراً. بالنسبة لشركات الأعمال، أسعار الكميات، وتغطية اللغات المخصصة، فيتم ترتيبها عبر فريقنا.
بيانات اعتماد عميل OAuth 2.0. قم بتبديل معرف العميل الخاص بك والرمز السري للحصول على رمز وصول، ثم أرسله كرمز حامل مع كل طلب. تكون الرموز صالحة لمدة ساعة واحدة، لذا قم بتخزينها مؤقتاً وإعادة استخدامها.
غير متزامن. يتم إنشاء المشروع فوراً ويبدأ عملية الترجمة. قم بالاستعلام عن GET /v2/projects/{id} حتى تصبح الحالة merging_done. يعد تسليم الإجابات عبر الويب جزءاً من عملية إعداد الشركات.
لا توجد أي حدود. لا تقيد واجهة برمجة التطبيقات الطلبات ولا يوجد حد أقصى للحصص لكل مفتاح. سرعتك وقدرتك على المعالجة تعتمد على حجم قائمة الانتظار، وأولويات المعالجة تعد جزءاً من شروط باقات الشركات.
أكثر من 135 لغة مستهدفة، مع وجود متغيرات إقليمية عند الحاجة، بحيث يأخذ dst_lang موقعاً جغرافياً مثل es-mx أو pt-br. يتم اكتشاف لغة المصدر تلقائياً، أو يمكنك تعيينها بنفسك. القائمة الكاملة للغات المدعومة موجودة في توثيق واجهة برمجة التطبيقات. بالنسبة للغات خارج القائمة، اتصل بفريقنا لمناقشة مدى الإمكانية والخيارات المتاحة.
نعم. يحتوي كل مشروع على لغة مستهدفة واحدة، لذا يمكنك إنشاء مشروع واحد لكل لغة من نفس ملف التحميل وتشغيلها بالتوازي. مع عدم وجود قيود على معدل الطلبات، تعتمد الترجمة المجمعة إلى لغات مختلفة فقط على عدد المشاريع التي ينشئها نظامك.
يختلف وقت المعالجة حسب المشروع. يوضح كل مشروع حالته أثناء مروره بمراحل النسخ، والترجمة، وتوليد الصوت، والدمج، لكي تتمكن من متابعة التقدم مع المستخدمين وتنزيل الملفات فور اكتمال الترجمة.
سبع صيغ للفيديو (MP4، MOV، MKV، AVI، WebM، M4V، 3GP) وأربع صيغ للصوت (MP3، WAV، FLAC، M4A). يمكنك أيضاً رفع فيديو من يوتيوب، أو جوجل درايف، أو S3، أو فيميو، أو عبر رابط مباشر.
نعم. يمكنك تنزيل الترجمات النصية المترجمة بصيغ .srt و .vtt بجانب الفيديو المترجم، بحيث تكون متزامنة مع الكلام المترجم. ويتم إنشاء الترجمات المدمجة في الفيديو داخل تطبيق Rask.
نعم. يمكنك جلب النص، وتعديل النص الأصلي السماح لـ Rask بترجمته مرة أخرى، أو تعديل النص المترجم مباشرة للحفاظ على صياغتك ونبرتك الخاصة. ثم إعادة دبلجة المشروع. تساعد مسارد المصطلحات في الحفاظ على ثبات أسماء العلامات التجارية عبر جميع النسخ اللغات.
يمكن لنموذج الدردشة العام ترجمة النص الذي تنسخه إليه. ولكي تنشر فيديو مترجماً، فأنت بحاجة أيضاً إلى النسخ، والتوقيت، والأصوات، ومزج الصوت، وملفات الترجمة. تنتج واجهة برمجة تطبيقات (API) الترجمة الخاصة بالفيديو من Rask هذه المخرجات من ملف الفيديو نفسه.
يتم محاسبة استخدام واجهة برمجة التطبيقات (API) بناءً على دقائق الفيديو، مع تقريبها لأقرب دقيقة كاملة، وذلك من نفس رصيد الدقائق في تطبيق Rask. الدقائق التي تتجاوز الباقة تكلف 3 دولارات لكل دقيقة، ويتم الاتفاق على شروط الكميات الكبيرة مع فريقنا. تتم محاسبة المزامنة بشكل منفصل، مع دقيقة معاينة مجانية واحدة في كل حساب، أما إعادة الدبلجة بعد التعديل فيتم محاسبتها فقط على الأجزاء التي تم تغييرها. ابدأ بتجربة مجانية دون الحاجة بطاقة ائتمان.