# 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



Bir dosyayı çok parçalı form verisi olarak gönderin veya YouTube, Google Drive, S3, Vimeo ya da herhangi bir doğrudan URL'den bir bağlantı ekleyin. Bu videodaki konuşma, her Anında Ses Klonu için ses örneğidir.
Medya kimliğini video_id olarak ve hedef bir dil geçirin. Tespit edilen her konuşmacıya desteklenen dillerde bir Anında Ses Klonu atanır ve dublaj hemen başlar.
Proje için sesleri listeleyin, herhangi bir konuşmacıya özel bir klon veya ön ayar atayın, ardından /generate komutunu çağırın ve dublaj tamamlandığında dosyaları indirin.
# 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 ve es-es benzer şekilde hizmet eder. Proje kayıtları sözlük_sürümü, böylece daha sonra yapılan düzenlemeler tamamlanan çalışmayı habersiz değiştirmez.Evet. Rask ses klonlama API'si, video dublajının bir parçası olarak her konuşmacının sesini klonlar. Hedef dilde bir proje oluşturduğunuzda, desteklenen dillerdeki tüm konuşmacılara Anında Ses Klonu tanımlanır. Ayrıca Rask uygulamasında oluşturduğunuz Özel Ses Klonunu da dilediğiniz konuşmacıya atayabilirsiniz.
Anında Ses Klonu, desteklenen hedef diller için kaynak videonuzdaki konuşmacıların seslerini kullanır. Tekrar kullanılabilen bir Özel Ses Klonu için, bunu konuşmacının onayıyla Rask uygulamasında oluşturun ve ardından API aracılığıyla atayın. Sonuçlar; kaynak ses dosyasına, seçilen dile ve sese bağlı olarak değişiklik gösterir.
Anında Ses Klonu, kaydetmeniz gereken kısa ses örnekleri olmaksızın, dublajını yaptığınız videodaki konuşmadan otomatik olarak oluşturulur. Özel Ses Klonu ise bir kez yüklediğiniz ses örnekleriyle eğitilir, ses kütüphanenize kaydedilir ve voice_id'si kullanılarak herhangi bir projede yeniden kullanılabilir. Ses listesinde Anında Ses Klonu "Ses Klonu" etiketine ve "otomatik" cinsiyete sahiptir.
Özel Ses Klonu oluşturma işlemi Rask web platformunda kullanılabilir. Klon kaydedildikten sonra, proje seslerini getirme uç noktası (get project voices endpoint) ile voice_id'sini alın ve API aracılığıyla bir konuşmacıya atayın.
MP4, MOV, WEBM, MKV, MP3, M4A veya WAV formatında, her biri en fazla 10 MB olan en fazla 10 dosya olmak üzere 1 ila 10 dakika arası ses veya video yükleyin ya da bir YouTube veya Google Drive bağlantısı yapıştırın. En iyi sonuçlar için, iyi bir mikrofonla ve arka plan gürültüsü olmayan sessiz bir odada kaydedilmiş, tutarlı konuşma tarzına sahip tek bir konuşmacı kullanın.
Ses klonlama, 57 temel dili ve bu dillerin bölgesel varyantlarını destekler. Bölgesel varyantlar temel klonlama modelini kullanır: örneğin, İngiltere İngilizcesi metni ABD İngilizcesi ses modelini kullanır. Diğer hedef diller için bir yapay zeka ses ön ayarı seçin. Listenin tamamı için API dil kataloğuna bakın.
API, yalnızca ses içeren podcast'ler ve röportajlar dahil olmak üzere hem video hem de ses kayıtlarını seslendirir. Kendi ifadelerinizi kullanmak için çevrilmiş metni segment segment düzenleyin veya projeyi oluşturmadan önce kendi .srt dosyanızdan metni oluşturun; böylece klonlanan ses sizin metninizi seslendirir. Girdi her zaman bir kayıttır, bu nedenle yalnızca metin içeren seslendirmeler için metinden sese API'si daha uygundur.
GET /v2/projects/{id}/voices ile ses seçeneklerini alın, ardından her konuşmacıyı, değiştirilenleri ve değiştirilmeyenleri içeren bir ses haritasıyla PATCH /v2/projects/{id} isteği gönderin. Yeniden seslendirmek için /generate işlevini çağırın. Yeniden seslendirme, ücretlendirilen çalışma başına en az bir dakika olacak şekilde, değiştirilen segmentlerin toplam süresi üzerinden ücretlendirilir.
Creator Pro planları 3'e kadar özel ses, Business planları 10'a kadar paylaşılan ekip sesi ve Enterprise planları özel bir ses kütüphanesi içerir.
Evet. Özel ses klonları konuşmacının onayıyla oluşturulur ve yalnızca konuşmacıların onay verdiği videoları seslendirmeniz gerekir. Rask, onay tabanlı ses klonlama ve yapay zeka güvenliği kontrolleri kullanır; sesiniz asla genel modelleri eğitmek için kullanılmaz.
Klon, tını ve perdesi dahil olmak üzere konuşmacının ses kimliğini taklit eder, böylece başka bir dilde de kendi sesleriyle konuşuyor gibi duyulurlar. Duygusal ton, akış ve ritim kaynak ses ile çevrilmiş betiği takip eder; bu nedenle net ve ifade dolu kaynak konuşma en iyi sonuçları verir.
Kaynak videonun haklarına ve konuşmacıların onayına sahip olduğunuz sürece, klonlanmış seslerin yer aldığı dublajlı videoları ticari içeriklerinizde yayınlayabilirsiniz. Planınız için geçerli olan ayrıntıları öğrenmek üzere Rask Hizmet Şartları'nı inceleyin.
Ses klonlama, dublaj özelliğinin bir parçasıdır ve için ayrıca bir ücret alınmaz: API kullanımı, Rask uygulamasındaki dakika havuzundan düşülmek suretiyle, bir sonraki tam dakikaya yuvarlanarak video dakikası başına ücretlendirilir. Plan limitini aşan dakikalar için dakika başına 3 dolar ücret alınır. Ses değişikliğinden sonraki yeniden dublaj işlemleri yalnızca değiştirilen bölümler üzerinden ücretlendirilir. Kredi kartı gerekmeden ücretsiz deneme ile hemen başlayın.