# 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



Envoyez un fichier sous forme de données de formulaire multipartite, ou publiez un lien depuis YouTube, Google Drive, S3, Vimeo ou toute autre URL directe. La voix de cette vidéo sert d'échantillon pour chaque clonage de voix instantané.
Transmettez l'ID du média en tant que video_id ainsi qu'une langue cible. Chaque intervenant détecté bénéficie d'un clonage de voix instantané dans les langues prises en charge, et le doublage commence immédiatement.
Affichez la liste des voix du projet, attribuez un clone personnalisé ou une voix prédéfinie à n'importe quel intervenant, puis appelez /generate et téléchargez les fichiers une fois le doublage terminé.
# 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 et es-es de même. Les enregistrements du projet glossary_version, de sorte que les modifications ultérieures ne modifient jamais le travail terminé sans que vous le sachiez.Oui. L'API de clonage vocal de Rask clone la voix de chaque locuteur lors du doublage d'une vidéo. Créez un projet avec une langue cible et chaque locuteur bénéficie d'un clonage vocal instantané dans les langues prises en charge. Vous pouvez également attribuer à n'importe quel locuteur un clone de voix personnalisé créé dans l'application Rask.
Le clonage vocal instantané utilise les voix des locuteurs de votre vidéo source pour les langues cibles prises en charge. Pour obtenir un clone de voix personnalisé et réutilisable, créez-le dans l'application Rask avec le consentement du locuteur, puis attribuez-le via l'API. Les résultats dépendent de l'audio source, ainsi que de la langue et de la voix sélectionnées.
Le clonage vocal instantané est créé automatiquement à partir de la voix de la vidéo que vous دوبlez, sans avoir à enregistrer de courts échantillons audio. Le clone de voix personnalisé est entraîné à partir d'échantillons audio que vous importez une seule fois, enregistrés dans votre bibliothèque vocale et réutilisés dans n'importe quel projet grâce à son voice_id. Dans la liste des voix, un clonage vocal instantané porte l'étiquette « Clonage vocal » et le genre « auto ».
La création d'un clone de voix personnalisé est disponible sur la plateforme web Rask. Une fois le clone enregistré, récupérez son voice_id grâce à l'endpoint permettant d'obtenir les voix du projet, puis attribuez-le à un locuteur via l'API.
Téléchargez 1 à 10 minutes de contenu audio ou vidéo (jusqu'à 10 fichiers de 10 Mo maximum chacun, aux formats MP4, MOV, WEBM, MKV, MP3, M4A ou WAV), ou collez un lien YouTube ou Google Drive. Pour de meilleurs résultats, utilisez un seul interlocuteur avec un style de voix régulier, enregistré dans une pièce calme avec un bon micro et sans bruit de fond.
Le clonage de voix prend en charge 57 langues de base ainsi que leurs variantes régionales. Les variantes régionales utilisent le modèle de clonage de base : par exemple, le texte en anglais britannique utilise le modèle de voix de l'anglais américain. Pour les autres langues cibles, choisissez une voix prédéfinie par l'IA. Consultez le catalogue des langues de l'API pour voir la liste complète.
L'API double à la fois les enregistrements vidéo et audio, y compris les podcasts et les interviews uniquement audio. Pour utiliser vos propres mots, modifiez le texte traduit segment par segment ou importez votre propre fichier .srt avant de créer le projet, et la voix clonée prononcée s'adaptera à votre texte. L'élément de départ est toujours un enregistrement. Pour les voix off générées uniquement à partir de texte, une API de synthèse vocale sera donc plus adaptée.
Récupérez les options de voix avec GET /v2/projects/{id}/voices, puis envoyez une requête PATCH /v2/projects/{id} avec une correspondance vocale incluant tous les intervenants (celui qui a changé et ceux qui n'ont pas changé). Appelez /generate pour relancer le doublage. Le nouveau doublage est facturé sur la durée combinée des segments modifiés, avec un minimum d'une minute par exécution facturée.
Les abonnements Creator Pro incluent jusqu'à 3 voix personnalisées, les abonnements Business jusqu'à 10 voix partagées au sein de l'équipe, et les abonnements Enterprise proposent une bibliothèque de voix personnalisées.
Oui. Les clones de voix personnalisés sont créés avec le consentement de l'interlocuteur, et vous ne devez doubler que les vidéos dont les intervenants ont donné leur accord. Rask utilise un clonage vocal basé sur le consentement et des contrôles de sécurité de l'IA, et vos fichiers audio ne sont jamais utilisés pour entraîner des modèles généraux.
Le clone reproduit l'identité vocale de l'interlocuteur, y compris son timbre et sa hauteur, afin qu'il se reconnaisse dans une autre langue. Le ton émotionnel, la cadence et le rythme suivent l'audio d'origine et le script traduit. Un discours source clair et expressif garantit donc les meilleurs résultats.
Vous pouvez publier des vidéos doublées avec des voix clonées dans vos contenus commerciaux si vous possédez les droits sur la vidéo d'origine et le consentement des intervenants. Consultez les conditions d'utilisation de Rask pour connaître les détails applicables à votre abonnement.
Le clonage de voix fait partie du doublage et n'entraîne pas de frais supplémentaires : l'utilisation de l'API est facturée par minute de vidéo, arrondie à la minute supérieure, en puisant dans le même solde de minutes que l'application Rask. Les minutes excédant votre forfait coûtent 3 $ chacune. Le redoublage après un changement de voix est facturé uniquement pour les segments modifiés. Commencez par un essai gratuit, sans carte bancaire requise.