# 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



Senden Sie eine Datei als Multipart-Formulardaten oder posten Sie einen Link von YouTube, Google Drive, S3, Vimeo oder einer beliebigen direkten URL. Die Sprache in diesem Video dient als Sprachprobe für jeden Instant Voice Clone.
Übergeben Sie die Medien-ID als video_id und eine Zielsprache. Jeder erkannte Sprecher erhält in den unterstützten Sprachen einen Instant Voice Clone und die Synchronisation beginnt sofort.
Listen Sie Stimmen für das Projekt auf, weisen Sie einem Sprecher einen benutzerdefinierten Klon oder eine Voreinstellung zu, rufen Sie dann /generate auf und laden Sie die Dateien herunter, wenn die Synchronisation abgeschlossen ist.
# 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 und es-es gleichermaßen dient. Das Projekt speichert glossary_version, sodass spätere Änderungen bereits fertiggestellte Arbeit nicht unbemerkt verändern.Ja. Die Stimmklon-API von Rask klont die Stimme jedes Sprechers im Rahmen der Videosynchronisation. Erstellen Sie ein Projekt mit einer Zielsprache, und jeder Sprecher erhält in den unterstützten Sprachen einen sofortigen Stimmklon. Sie können jedem Sprecher auch einen in der Rask-App erstellten, individuellen Stimmklon zuweisen.
Der sofortige Stimmklon nutzt die Stimmen der Sprecher aus Ihrem Quellvideo für unterstützte Zielsprachen. Für einen wiederverwendbaren eigenen Stimmklon erstellen Sie diesen mit der Einwilligung des Sprechers in der Rask-App und weisen ihn dann über die API zu. Die Ergebnisse hängen vom Ausgangsaudio sowie von der ausgewählten Sprache und Stimme ab.
Der sofortige Stimmklon wird automatisch aus der Sprache im zu synchronisierenden Video erstellt, ganz ohne kurze Audioaufnahmen. Ein eigener Stimmklon wird anhand von Audiosproben trainiert, die Sie einmal hochladen, in Ihrer Sprachbibliothek speichern und in jedem Projekt über die voice_id wiederverwenden. In der Liste der Stimmen trägt ein sofortiger Stimmklon das Label „Stimmklon“ und das Geschlecht „auto“.
Das Erstellen eines eigenen Stimmklons ist in der Rask-Webplattform verfügbar. Sobald der Klon gespeichert ist, rufen Sie dessen voice_id über den entsprechenden Endpunkt ab und weisen ihn über die API einem Sprecher zu.
Laden Sie 1 bis 10 Minuten Audio oder Video hoch (bis zu 10 Dateien mit jeweils maximal 10 MB in den Formaten MP4, MOV, WEBM, MKV, MP3, M4A oder WAV) oder fügen Sie einen YouTube- oder Google-Drive-Link ein. Für beste Ergebnisse verwenden Sie einen einzelnen Sprecher mit einem gleichmäßigen Sprechstil, aufgenommen in einem ruhigen Raum mit einem guten Mikrofon und ohne Hintergrundgeräusche.
Das Klonen von Stimmen unterstützt 32 Basissprachen und die dazugehörigen regionalen Varianten. Regionale Varianten verwenden das Basis-Klonmodell: Beispielsweise verwendet britisches Englisch das US-englische Sprachmodell. Für andere Zielsprachen wählen Sie eine KI-Stimmvorlage. Die vollständige Liste finden Sie im API-Sprachenkatalog.
Die API synchronisiert sowohl Video- als auch Audioaufnahmen, einschließlich reiner Audio-Podcasts und Interviews. Um eigene Formulierungen zu verwenden, bearbeiten Sie den übersetzten Text Segment für Segment oder erstellen Sie das Transkript aus Ihrer eigenen .srt-Datei, bevor Sie das Projekt starten. Die geklonte Stimme spricht dann Ihren Text. Da die Eingabe immer eine Aufnahme ist, eignet sich für reine Text-Voiceovers eine Text-zu-Sprache-API besser.
Rufen Sie die Sprachoptionen mit GET /v2/projects/{id}/voices ab und senden Sie anschließend PATCH /v2/projects/{id} mit einer Stimmzuordnung, die jeden Sprecher enthält (sowohl die geänderten als auch die unveränderten). Rufen Sie /generate auf, um die Synchronisation zu wiederholen. Die erneute Synchronisation wird basierend auf der kombinierten Dauer der geänderten Segmente abgerechnet, mit einer Mindestdauer von einer Minute pro gebührenpflichtigem Durchlauf.
Creator-Pro-Pakete beinhalten bis zu 3 individuelle Stimmen, Business-Pakete bis zu 10 gemeinsam genutzte Teamstimmen und Enterprise-Pakete eine eigene Stimmbibliothek.
Ja. Individuelle Sprachklone werden mit der Einwilligung des Sprechers erstellt, und Sie sollten nur Videos synchronisieren, deren Sprecher zugestimmt haben. Rask verwendet zustimmungsbasiertes Sprachklonen und KI-Sicherheitskontrollen, und Ihre Audiodaten werden niemals zum Training allgemeiner Modelle verwendet.
Der Klon repliziert die stimmliche Identität des Sprechers, einschließlich Klangfarbe und Tonhöhe, sodass er in einer anderen Sprache wie er selbst klingt. Emotionale Tonalität, Kadenz und Rhythmus orientieren sich an der Audioquelle und dem übersetzten Skript, weshalb eine klare, expressive Quellsprache die besten Ergebnisse liefert.
Sie können synchronisierte Videos mit geklonten Stimmen in Ihren kommerziellen Inhalten veröffentlichen, wenn Sie über die Rechte am Quellvideo und die Einwilligung der Sprecher verfügen. Details dazu, die für Ihr Paket gelten, finden Sie in den Nutzungsbedingungen von Rask.
Das Klonen von Stimmen ist Teil der Synchronisation und kostet keine separate Gebühr: Die API-Nutzung wird pro Videominute (aufgerundet auf die nächste volle Minute) aus demselben Minutenkontingent der Rask-App abgerechnet. Minuten, die das Paket überschreiten, kosten 3 $ pro Minute. Eine erneute Synchronisation nach einer Stimmänderung wird nur für die geänderten Segmente berechnet. Starten Sie mit einer kostenlosen Testversion – keine Kreditkarte erforderlich.