# 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



Ošlete soubor jako multipart formulářová data nebo vložte odkaz z YouTube, Google Drive, S3, Vimeo či jakoukoli přímou adresu URL. Mluvené slovo v tomto videu slouží jako ukázka hlasu pro každý okamžitě klonovaný hlas.
Předejte ID média jako video_id a cílový jazyk. Každý rozpoznaný mluvčí získá v podpořených jazycích okamžitě klonovaný hlas a dabing začne okamžitě.
Zobrazte seznam hlasů pro daný projekt, přiřaďte libovolnému mluvčímu vlastní klon nebo předvolbu, zavolejte funkci /generate a po dokončení dabingu stáhněte soubory.
# 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 a es-es stejně tak. Projekt uchovává záznamy glossary_version, takže pozdější úpravy nikdy nepozorovaně nezmění hotovou práci.Ano. API pro klonování hlasu od Rasku vytvoří klon hlasu každého mluvčího v rámci dabování videa. Vytvořte projekt s cílovým jazykem a každý mluvčí získá okamžitý klon hlasu v podporovaných jazycích. Kterémukoli mluvčímu můžete také přiřadit vlastní klon hlasu vytvořený v aplikaci Rask.
Funkce okamžitého klonování hlasu využívá hlasy mluvčích z původního videa pro podporované cílové jazyky. Pokud chcete opakovaně použitelný vlastní klon hlasu, vytvořte ho v aplikaci Rask se souhlasem mluvčího a poté jej přiřaďte přes API. Výsledky závisí na původním zvuku a vybraném jazyku a hlasu.
Okamžitý klon hlasu se vytvoří automaticky z mluveného slova v dabovaném videu, aniž by bylo nutné nahrávat krátké ukázky zvuku. Vlastní klon hlasu se trénuje z ukázek, které jednou nahrátete, uložíte do knihovny hlasů a můžete je kdykoli znovu použít v jakémkoli projektu pomocí voice_id. V seznamu hlasů je okamžitý klon hlasu označen štítkem „Voice Clone“ a pohlaví je nastaveno na „auto“.
Vytvoření vlastního klonu hlasu je k dispozici na webové platformě Rask. Jakmile je klon uložen, získejte jeho ID pomocí koncového bodu pro načtení hlasů projektu a přiřaďte jej mluvčímu prostřednictvím API.
Nahrajte 1 až 10 minut zvuku nebo videa (až 10 souborů o velikosti do 10 MB ve formátu MP4, MOV, WEBM, MKV, MP3, M4A nebo WAV) případně vložte odkaz na YouTube nebo Disk Google. Pro nejlepší výsledky použijte nahrávku jednoho mluvčího s konzistentním projevem, pořízenou v tiché místnosti s kvalitním mikrofonem a bez rušivých zvuků na pozadí.
Klonování hlasu podporuje 32 základních jazyků a jejich regionální varianty. Regionální varianty využívají základní model pro klonování – britská angličtina například používá hlasový model pro americkou angličtinu. Pro ostatní cílové jazyky zvolte předvolbu hlasu AI. Kompletní seznam najdete v jazykovém katalogu API.
API dabuje video i zvukové nahrávky, včetně čistě zvukových podcastů a rozhovorů. Pokud chcete použít vlastní text, upravte přeložený text po jednotlivých segmentech nebo před vytvořením projektu nahrajte vlastní soubor .srt a klonovaný hlas váš text namluví. Vstupem je vždy nahrávka, takže pro mluvené slovo ze samotného textu je vhodnější API pro převod textu na řeč.
Možnosti hlasů získáte pomocí požadavku GET /v2/projects/{id}/voices a poté odešlete PATCH /v2/projects/{id} s mapou hlasů, která obsahuje všechny mluvčí – jak ty změněné, tak nezměněné. Opětovný dabing spustíte voláním /generate. Účtuje se za celkovou délku změněných segmentů, přičemž minimální délka zpoplatněného spuštění je jedna minuta.
Tarify Creator Pro zahrnují až 3 vlastní hlasy, tarify Business až 10 sdílených týmových hlasů a tarify Enterprise nabízejí knihovnu vlastních hlasů.
Ano. Vlastní klony hlasů se vytvářejí se souhlasem mluvčího a dabovat byste měli pouze videa, jejichž autoři či účinkující s tím souhlasili. Rask využívá klonování hlasu založené na souhlasu a bezpečnostní prvky AI a vaše nahrávky se nikdy nepoužívají k trénování obecných modelů.
Klon kopíruje hlasovou identitu mluvčího včetně barvy a výšky tónu, takže v jiném jazyce zní přirozeně jako on sám. Emocionální tón, kadence a rytmus vycházejí z původního zvuku a přeloženého scénáře, takže nejlepších výsledků dosáhnete s čistým a expresivním původním projevem.
Dabovaná videa s klonovanými hlasy můžete ve svém komerčním obsahu publikovat, pokud vlastníte práva k původnímu videu a máte souhlas mluvčích. Podrobnosti platné pro váš tarif najdete v podmínkách použití služby Rask.
Klonování hlasu je součástí dabingu a není za něj účtován žádný samostatný poplatek: využití API se účtuje za minutu videa zaokrouhlenou nahoru na celé minuty a čerpá se ze stejného fondu minut jako aplikace Rask. Minuty nad rámec tarifu stojí 3 USD za minutu. Opětovný dabing po změně hlasu se účtuje pouze za změněné segmenty. Začněte s bezplatnou zkušební verzí, není potřeba zadávat platební kartu.