# 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



Wyślij plik jako dane formularza multipart lub prześlij link z YouTube, Google Dysku, S3, Vimeo albo dowolny bezpośredni adres URL. Mowa w tym wideo stanowi próbkę głosu dla każdego szybkiego klonowania głosu.
Przekaż identyfikator pliku jako video_id oraz język docelowy. Każdy wykryty mówca otrzymuje szybki klon głosu w obsługiwanych językach, a dubbing rozpoczyna się natychmiast.
Wyświetl listę głosów dla projektu, przypisz własny klon lub gotowe ustawienie do dowolnego mówcy, a następnie wywołaj /generate i pobierz pliki po zakończeniu dubbingu.
# 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 oraz es-es podobnie. Projekt rejestruje wersja_słownika, dzięki czemu późniejsze poprawki nigdy nie zmieniają ukończonej pracy w tle.Tak. API klonowania głosu od Rask klonuje głos każdego mówcy w ramach dubbingowania wideo. Utwórz projekt z językiem docelowym, a każdy mówca otrzyma błyskawiczny klon głosu w obsługiwanych językach. Możesz również przypisać niestandardowy klon głosu utworzony w aplikacji Rask do dowolnego mówcy.
Błyskawiczne klonowanie głosu wykorzystuje głosy osób mówiących z oryginalnego wideo dla obsługiwanych języków docelowych. Aby uzyskać wielorazowy niestandardowy klon głosu, utwórz go w aplikacji Rask za zgodą osoby mówiącej, a następnie przypisz go przez API. Wyniki zależą od oryginalnego audio oraz wybranego języka i głosu.
Błyskawiczny klon głosu jest tworzony automatycznie na podstawie mowy w dubbingowanym wideo, bez konieczności nagrywania krótkich próbek audio. Niestandardowy klon głosu jest trenowany na podstawie przesłanych wcześniej próbek audio, zapisany w bibliotece głosów i ponownie wykorzystywany w każdym projekcie za pomocą voice_id. Na liście głosów błyskawiczny klon głosu jest oznaczony jako "Voice Clone", a jego płeć to "auto".
Tworzenie niestandardowego klonu głosu jest dostępne na platformie internetowej Rask. Gdy klon zostanie zapisany, pobierz jego voice_id za pomocą endpointu pobierania głosów projektu i przypisz go do mówcy przez API.
Prześlij od 1 do 10 minut pliku audio lub wideo (maksymalnie 10 plików po maksymalnie 10 MB każdy w formacie MP4, MOV, WEBM, MKV, MP3, M4A lub WAV) lub wklej link do serwisu YouTube lub Google Drive. Aby uzyskać najlepsze rezultaty, użyj nagrania jednej osoby mówiącej w spójnym stylu, zrealizowanego w cichym pomieszczeniu za pomocą dobrego mikrofonu, bez szumów w tle.
Klonowanie głosu obsługuje 32 języki bazowe oraz ich warianty regionalne. Warianty regionalne korzystają z bazowego modelu klonowania – na przykład brytyjska odmiana języka angielskiego wykorzystuje amerykański model głosu. Dla pozostałych języków docelowych wybierz gotowy głos AI. Pełną listę znajdziesz w katalogu języków API.
API dubbinguje zarówno nagrania wideo, jak i audio, w tym podcasty i wywiady w formie samego dźwięku. Aby użyć własnych słów, edytuj przetłumaczony tekst fragment po fragmencie lub utwórz transkrypcję z własnego pliku .srt przed rozpoczęciem projektu, a sklonowany głos wypowie Twój tekst. Ponieważ na wejściu zawsze wymagane jest nagranie, do tworzenia głosów wyłącznie z tekstu lepiej sprawdza się API typu text-to-speech.
Pobierz dostępne opcje głosów za pomocą polecenia GET /v2/projects/{id}/voices, a następnie wyślij żądanie PATCH /v2/projects/{id} z mapą głosów obejmującą wszystkich mówiących – zarówno tych zmienionych, jak i niezmienionych. Wywołaj /generate, aby ponownie wykonać dubbing. Ponowny dubbing jest rozliczany na podstawie łącznego czasu zmienionych fragmentów, przy czym minimalny czas rozliczeniowy dla jednego uruchomienia wynosi jedną minutę.
Plany Creator Pro obejmują do 3 niestandardowych głosów, plany Business do 10 współdzielonych głosów zespołowych, a plany Enterprise oferują bibliotekę niestandardowych głosów.
Tak. Niestandardowe klony głosów są tworzone za zgodą osoby mówiącej i powinieneś dubbingować tylko te nagrania, na których użyczenie głosu wyrażono zgodę. Rask korzysta z klonowania głosów opartego na zgodzie oraz mechanizmów bezpieczeństwa AI, a Twoje nagrania nigdy nie są wykorzystywane do trenowania ogólnych modeli.
Klon odtwarza cechy identyfikacyjne głosu, w tym barwę i wysokość, dzięki czemu mówiący brzmi znajomo w innym języku. Ton emocjonalny, kadencja i rytm zależą od oryginalnego nagrania oraz przetłumaczonego tekstu, dlatego wyraźna i ekspresyjna wypowiedź źródłowa zapewnia najlepsze rezultaty.
Możesz publikować zdubbingowane wideo ze sklonowanymi głosami w swoich materiałach komercyjnych, jeśli masz prawa do wideo źródłowego oraz zgodę osób mówiących. Szczegółowe informacje dotyczące Twojego planu znajdziesz w Regulaminie Rask.
Klonowanie głosu jest częścią dubbingu i nie wiąże się z osobnymi opłatami: korzystanie z API jest rozliczane za minutę wideo (zaokrąglając w górę do pełnej minuty) z tej samej puli minut, co w aplikacji Rask. Minuty przekraczające limit planu kosztują 3 USD za minutę. Ponowny dubbing po zmianie głosu jest rozliczany tylko dla zmienionych fragmentów. Rozpocznij od bezpłatnego okresu próbnego, karta kredytowa nie jest wymagana.