# 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، بحيث لا تؤدي التعديلات لاحقاً إلى تغيير العمل المكتمل دون ملاحظة ذلك.نعم. تعمل واجهة برمجة تطبيقات (API) استنساخ الأصوات في Rask على نسخ صوت كل متحدث كجزء من عملية دبلجة الفيديو. أنشئ مشروعاً بلغة مستهدفة، وسيتحصل كل متحدث على استنساخ صوتي فوري باللغات المدعومة. يمكنك أيضاً تعيين استنساخ صوتي مخصص أنشأته في تطبيق Rask لأي متحدث.
يستخدم الاستنساخ الصوتي الفوري أصوات المتحدثين من فيديو المصدر الخاص بك للغات المستهدفة المدعومة. للحصول على استنساخ صوتي مخصص وقابل لإعادة الاستخدام، أنشئه في تطبيق Rask بموافقة المتحدث، ثم قم بتعيينه عبر واجهة برمجة التطبيقات (API). تعتمد النتائج على الصوت الأصلي واللغة والصوت المختارين.
يتم إنشاء الاستنساخ الصوتي الفوري تلقائياً من الكلام الموجود في الفيديو الذي تدبلجه، دون الحاجة لتسجيل مقاطع صوتية قصيرة. أما الاستنساخ الصوتي المخصص، فيتم تدريبه من عينات صوتية تقوم برفعها مرة واحدة، وحفظها في مكتبة الأصوات الخاصة بك وإعادة استخدامها في أي مشروع باستخدام معرف الصوت (voice_id). في قائمة الأصوات، يحمل الاستنساخ الصوتي الفوري تسمية "استنساخ الصوت" ونوع الجنس "تلقائي".
يتوفر إنشاء الاستنساخ الصوتي المخصص على منصة Rask الويب. بمجرد حفظ الاستنساخ، احصل على معرف الصوت (voice_id) الخاص به باستخدام نقطة نهاية أصوات المشروع (get project voices endpoint) وقم بتعيينه لمتحدث عبر واجهة برمجة التطبيقات (API).
قم برفع ملف صوتي أو فيديو يتراوح مدته بين دقيقة واحدة و10 دقائق، وبحد أقصى 10 ملفات حجم كل منها يصل إلى 10 ميجابايت، بالصيغ التالية: MP4 أو MOV أو WEBM أو MKV أو MP3 أو M4A أو WAV، أو ألصق رابطاً من YouTube أو Google Drive. للحصول على أفضل النتائج، استخدم متحدثاً واحداً بأسلوب كلام ثابٍت، ومسجلاً في غرفة هادئة بميكروفون جيد وبدون ضوضاء في الخلفية.
تدعم ميزة استنساخ الصوت 57 لغة أساسية ولهجاتها المختلفة. تستخدم اللهجات الإقليمية نموذج الاستنساخ الأساسي؛ فعلى سبيل المثال، يستخدم النص بالإنجليزية البريطانية نموذج الصوت للإنجليزية الأمريكية. أما بالنسبة للغات الأخرى، فيمكنك اختيار صوت جاهز بالذكاء الاصطناعي. اطلع على دليل لغات الـ API للاطلاع على القائمة الكاملة.
تقوم واجهة برمجة التطبيقات (API) بدبلجة تسجيلات الفيديو والصوت على حد سواء، بما في ذلك البودكاست والمقابلات الصوتية فقط. لاستخدام صياغتك الخاصة، قم بتعديل النص المترجم مقطعاً تلو الآخر، أو أنشئ النص المكتوب من ملف srt. الخاص بك قبل إنشاء المشروع، وسينطق الصوت المستسخ نصك. المدخلات هي دائماً تسجيل، لذا بالنسبة للتعليقات الصوتية النصية فقط، تكون واجهة برمجة تطبيقات (API) تحويل النص إلى كلام خياراً أفضل.
احصل على خيارات الصوت باستخدام GET /v2/projects/{id}/voices، ثم أرسل PATCH /v2/projects/{id} مع خريطة صوت تتضمن كل متحدث، سواء الذي تم تغييره أو الذي لم يتم تغiيره. اتصل بـ /generate لإعادة الدبلجة. تتم محاسبة إعادة الدبلجة بناءً على المدة الإجمالية للمقاطع التي تم تغييرها، بحد أدنى دقيقة واحدة لكل عملية يتم محاسبتها.
تتضمن خطط Creator Pro ما يصل إلى 3 أصوات مخصصة، وخطط Business ما يصل إلى 10 أصوات مشتركة للفريق، وخطط Enterprise مكتبة أصوات مخصصة.
نعم. يتم إنشاء الاستنساخ الصوتي المخصص بموافقة المتحدث، ويجب عليك فقط دبلجة الفيديوهات التي وافق أصحاب أصواتها على ذلك. تستخدم Rask استنساخ الأصوات القائم على الموافقة وأدوات الأمان الخاصة بالذكاء الاصطناعي، ولا يتم استخدام الصوت الخاص بك أبداً لتدريب النماذج العامة.
يحاكي الصوت المستسخ هوية صوت المتحدث، بما في ذلك نبرة الصوت وطبقته، بحيث يبدو وكأنه صوته الحقيقي بلغة أخرى. أما النبرة العاطفية وإيقاع وسرعة الكلام فتتبع الصوت الأصلي والنص المترجم، لذا فإن الكلام الأصلي الواضح والمعبر يعطي أفضل النتائج.
يمكنك نشر الفيديوهات المدبلجة بأصوات مستسخة في محتواك التجاري عندما تملك حقوق فيديو المصدر وموافقة المتحدثين. راجع شروط خدمة Rask لمعرفة التفاصيل التي تنطبق على خطتك.
يُعد استنساخ الأصوات جزءاً من الدبلجة ولا يتضمن رسوماً منفصلة: تتم محاسبة استخدام واجهة برمجة التطبيقات (API) لكل دقيقة فيديو، ويتم تقريبها إلى الدقيقة الكاملة التالية، من نفس رصيد الدقائق الخاص بتطبيق Rask. الدقائق التي تتجاوز الخطة تبتكلف 3 دولارات لكل دقيقة. تتم محاسبة إعادة الدبلجة بعد تغيير الصوت على المقاطع التي تم تغييرها فقط. ابدأ بتجربة مجانية، دون الحاجة بطاقة ائتمان.