# 1. create the dub - each speaker gets an Instant Voice Clone by default
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" \
-d '{"video_id": "b8f7835d-e8c9-4ff4-8e34-5c336d818319", "dst_lang": "es-mx"}'
# 2. list the voices available in this project
curl https://api.rask.ai/v2/projects/$ID/voices \
-H "Authorization: Bearer $TOKEN"
# "label": "Voice Clone", "gender": "auto" instant clone
# "label": "Maria Lopez", "sample_src": "https://..." your custom clone
# 3. assign your custom clone - include every speaker in the map
curl -X PATCH https://api.rask.ai/v2/projects/$ID \
-H "Authorization: Bearer $TOKEN" \
-d '{"voice": {"SPEAKER_00": "<custom_voice_id>", "SPEAKER_01": "<voice_id>"}}'# 4. re-dub with the new voices, then poll until merging_done
curl -X POST https://api.rask.ai/v2/projects/$ID/generate \
-H "Authorization: Bearer $TOKEN"
while :; do
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq .status
sleep 10
done



أرسل ملفاً كبيانات نموذج متعددة الأجزاء، أو انشر رابطاً من يوتيوب، أو جوجل درايف، أو S3، أو فيميو، أو أي رابط مباشر. يعتبر الكلام في هذا الفيديو هو عينة الصوت لكل نسخة صوتية فورية.
تمرير معرف الوسائط كـ video_id وتحديد اللغة المستهدفة. يحصل كل متحدث يتم اكتشافه على نسخة صوتية فورية باللغات المدعومة، وتبدأ الدبلجة فوراً.
عرض الأصوات للمشروع، وتعيين نسخة مخصصة أو إعداد مسبق لأي متحدث، ثم استدعاء /generate وتنزيل الملفات عند اكتمال الدبلجة.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
async def wait(client, job):
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)
# first dub: every speaker gets an Instant Voice Clone
job = await wait(client, await client.create_project(
data=schemas.ProjectCreate(video_id=video.id, dst_lang="es-mx")))
# assign a custom clone to SPEAKER_00, keep the other speakers as they are
voices = await client.get_project_voices(project_id=job.id)
custom = next(v for v in voices if v.label == "Maria Lopez")
voice_map = {**job.voice, "SPEAKER_00": custom.id}
await client.patch_project(project_id=job.id, data=schemas.ProjectPatch(voice=voice_map))
job = await wait(client, await client.generate_project(project_id=job.id))
print(job.translated_video, job.voiceover)
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}"}
def wait(pid):
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
time.sleep(10)
return p
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()
pid = requests.post(f"{API}/v2/projects", headers=h,
json={"video_id": video["id"], "dst_lang": "es-mx"}).json()["id"]
project = wait(pid)
voices = requests.get(f"{API}/v2/projects/{pid}/voices", headers=h).json()
custom = next(v for v in voices if v["label"] == "Maria Lopez")
voice_map = {**project["voice"], "SPEAKER_00": custom["id"]} # every speaker stays in the map
requests.patch(f"{API}/v2/projects/{pid}", headers=h, json={"voice": voice_map})
requests.post(f"{API}/v2/projects/{pid}/generate", headers=h)
print(wait(pid)["translated_video"])// 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 call = (method, path, body) => fetch(API + path, { method, headers: h, body: body && JSON.stringify(body) }).then((r) => r.json());
const wait = async (id) => { let p; while ((p = await call('GET', `/v2/projects/${id}`)).status !== 'merging_done') await sleep(10000); return p; };
let video = await call('POST', '/api/library/v1/media/link', { link: 'https://youtu.be/...' });
while (video.status !== 'ready') { await sleep(5000); video = await call('GET', `/api/library/v1/media/${video.id}`); }
const { id } = await call('POST', '/v2/projects', { video_id: video.id, dst_lang: 'es-mx' });
const project = await wait(id);
const voices = await call('GET', `/v2/projects/${id}/voices`);
const custom = voices.find((v) => v.label === 'Maria Lopez');
await call('PATCH', `/v2/projects/${id}`, { voice: { ...project.voice, SPEAKER_00: custom.id } });
await call('POST', `/v2/projects/${id}/generate`);
console.log((await wait(id)).translated_video);# 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 dub - Instant Voice Clones are assigned by default
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\": \"es-mx\"}" | jq -r .id)
# 3. after merging_done: read the current voice map and the voice options
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq .voice
curl -s https://api.rask.ai/v2/projects/$ID/voices -H "Authorization: Bearer $TOKEN" | jq '.[] | {id, label, gender}'
# 4. assign voices for every speaker, then re-dub
curl -s -X PATCH https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -d '{"voice": {"SPEAKER_00": "<custom_voice_id>", "SPEAKER_01": "<voice_id>"}}'
curl -s -X POST https://api.rask.ai/v2/projects/$ID/generate -H "Authorization: Bearer $TOKEN"<?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']];
$wait = function ($id) use ($http, $h, $json) {
do { sleep(10); $p = $json($http->get("/v2/projects/$id", ['headers' => $h])); }
while ($p['status'] !== 'merging_done');
return $p;
};
$id = $json($http->post('/v2/projects', ['headers' => $h,
'json' => ['video_id' => $videoId, 'dst_lang' => 'es-mx']]))['id'];
$project = $wait($id);
$voices = $json($http->get("/v2/projects/$id/voices", ['headers' => $h]));
$custom = current(array_filter($voices, fn($v) => $v['label'] === 'Maria Lopez'));
$map = array_merge($project['voice'], ['SPEAKER_00' => $custom['id']]);
$http->patch("/v2/projects/$id", ['headers' => $h, 'json' => ['voice' => $map]]);
$http->post("/v2/projects/$id/generate", ['headers' => $h]);
echo $wait($id)['translated_video']; 0s created
11s transcription_started
87s translation_started
99s voiceover_started
154s merging_started
165s merging_done

es-mx و es-es على حد سواء. يسجل المشروع glossary_version، بحيث لا تؤدي التعديلات اللاحقة إلى تغيير العمل المكتمل دون إشعار.نعم. تقوم واجهة برمجة تطبيقات نسخ الأصوات من Rask بنسخ صوت كل متحدث كجزء من عملية دبلجة الفيديو. قم بإنشاء مشروع مع تحديد لغة مستهدفة وسيحصل كل متحدث على نسخة صوتية فورية باللغات المدعومة. يمكنك أيضاً تعيين نسخة صوتية مخصصة أنشأتها في تطبيق Rask لأي متحدث.
تستخدم ميزة النسخ الصوتي الفوري أصوات المتحدثين من الفيديو الأصلي للغات المستهدفة المدعومة. للحصول على نسخة صوتية مخصصة قابلة لإعادة الاستخدام، قم بإنشائها في تطبيق Rask بموافقة المتحدث، ثم قم بتعيينها عبر واجهة برمجة التطبيقات. تعتمد النتائج على الملف الصوتي الأصلي واللغة والصوت المختارين.
يتم إنشاء النسخ الصوتي الفوري تلقائياً من الكلام الموجود في الفيديو الذي تقوم بدبلجته، دون الحاجة لتسجيل عينات صوتية قصيرة. أما النسخ الصوتي المخصّص فيتم التدريب عليه من خلال عينات صوتية تقوم بتحميلها مرة واحدة، وحفظها في مكتبة الأصوات الخاصة بك، وإعادة استخدامها في أي مشروع عبر معرف الصوت الخاص بها voice_id. في قائمة الأصوات، يحمل النسخ الصوتي الفوري تصنيف "Voice Clone" وجنس الصوت "auto".
إنشاء نسخة صوتية مخصصة متاح على منصة Rask الويب. بمجرد حفظ النسخة، استرد معرف الصوت الخاص بها عبر نقطة نهاية جلب أصوات المشروع (get project voices) وقم بتعيينه لأي متحدث عبر واجهة برمجة التطبيقات.
قم بتحميل ما بين دقيقة إلى 10 دقائق من ملفات الصوت أو الفيديو (حتى 10 ملفات وبحجم أقصى 10 ميجابايت للملف الواحد) بصيغ MP4، MOV، WEBM، MKV، MP3، M4A، أو WAV، أو يمكنك لصق رابط من يوتيوب أو جوجل درाइव. للحصول على أفضل النتائج، استخدم متحدثاً واحداً بنبرة صوت ثابتة، وقم بالتسجيل في غرفة هادئة باستخدام ميكروفون جيد وبدون ضوضاء في الخلفية.
يدعم استنساخ الصوت 32 لغة أساسية ولهجاتها الفرعية المدعومة. تستخدم اللهجات الفرعية نموذج الاستنساخ الأساسي؛ فمثلاً، يستخدم النص بالإنجليزية البريطانية نموذج الصوت للإنجليزية الأمريكية. أما بالنسبة للغات الأخرى المستهدفة، فيمكنك اختيار نبرة صوت جاهزة مدعومة بالذكاء الاصطناعي. راجع دليل لغات واجهة برمجة التطبيقات (API) للاطلاع على القائمة الكاملة.
تقوم واجهة برمجة التطبيقات بدبلجة تسجيلات الفيديو والصوت، بما في ذلك المدونات الصوتية (البودكاست) والمقابلات الصوتية فقط. وإذا أردت استخدام صياغتك الخاصة، يمكنك تعديل النص المترجم جزءاً بزء، أو إنشاء النص من ملف SRT الخاص بك قبل بدء المشروع، ليقوم الصوت المستسخ بتأدية النص الخاص بك. نظراً لأن المدخل يكون دائماً عبارة عن تسجيل صوتي، فإن واجهة تحويل النص إلى كلام تكون أكثر ملاءمة للتعليقات الصوتية النصية البحتة.
احصل على خيارات الصوت عبر إرسال طلب GET إلى /v2/projects/{id}/voices، ثم أرسل طلب PATCH إلى /v2/projects/{id} مع خريطة أصوات تتضمن كل متحدث (سواء تم تغيير صوته أو لا). بعد ذلك، قم باستدعاء الدالة /generate لإعادة الدبلجة. تُحسب تكلفة إعادة الدبلجة بناءً على المدة الإجمالية للأجزاء التي تم تغييرها فقط، بحد أدنى دقيقة واحدة لكل عملية.
تتيح خطط Creator Pro حفظ ما يصل إلى 3 أصوات مخصصة، بينما تتيح خطط Business ما يصل إلى 10 أصوات مشتركة لفريق العمل، وتوفر خطط Enterprise مكتبة أصوات مخصصة بالكامل.
نعم. يتم إنشاء النسخ الصوتية المخصصة بموافقة المتحدث، ويجب عليك دبلجة مقاطع الفيديو التي وافق أصحابها على ذلك فقط. تعتمد منصة Rask على استنساخ الأصوات المستند إلى الموافقة وأدوات الأمان للذكاء الاصطناعي، كما لا تُستخدم ملفاتك الصوتية أبداً لتدريب النماذج العامة.
يحاكي الصوت المستسخ الهوية الصوتية للمتحدث، بما في ذلك نبرة صوته وطبقته، ليظهر بصوته الطبيعي ولكن بلغة أخرى. أما النبرة العاطفية وإيقاع وسرعة الكلام فتتبع الملف الصوتي الأصلي والنص المترجم، لذا فإن استخدام تسجيلات أصلية واضحة ومعبرة يمنحك أفضل النتائج.
يمكنك نشر مقاطع الفيديو المدبلجة بأصوات مستسخة ضمن محتواك التجاري إذا كنت تمتلك حقوق الفيديو الأصلي وموافقة المتحدثين. يرجى مراجعة شروط خدمة Rask لمعرفة التفاصيل الخاصة بخطتك.
يُعد استنساخ الصوت جزءاً من خدمة الدبلجة ولا توجد له رسوم منفصلة؛ حيث تُحسب تكلفة استخدام واجهة برمجة التطبيقات (API) بناءً على دقائق الفيديو، ويتم تقريبها لأقرب دقيقة كاملة، وذلك من رصيد الدقائق نفسه الخاص بتطبيق Rask. تُحسب الدقائق التي تتجاوز حدود خطتك بمعدل 3 دولارات لكل دقيقة. أما إعادة الدبلجة بعد تغيير الصوت فتُحسب تكلفتها بناءً على الأجزاء المعدلة فقط. ابدأ تجربتك المجانية اليوم دون الحاجة لإدخال بطاقة ائتمان.