# 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 multipart, ou publiez un lien depuis YouTube, Google Drive, S3, Vimeo ou toute URL directe. La parole dans cette vidéo sert d'échantillon vocal pour chaque clone de voix instantané.
Transmettez l'identifiant du média en tant que video_id ainsi qu'une langue cible. Chaque intervenant détecté reçoit un clone de voix instantané dans les langues prises en charge, et le doublage commence immédiatement.
Répertoriez les voix du projet, attribuez un clone personnalisé ou un préréglage à 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 la même manière. L'historique du projet glossary_version, de sorte que les modifications ultérieures ne modifient jamais discrètement le travail déjà terminé.Oui. L'API de clonage de voix 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 de voix instantané dans les langues prises en charge. Vous pouvez également attribuer un clone de voix personnalisé créé dans l'application Rask à n'importe quel locuteur.
Le clonage de voix instantané utilise les voix des locuteurs de votre vidéo source pour les langues cibles prises en charge. Pour 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 de voix instantané est créé automatiquement à partir de la parole de la vidéo que vous doublaigez, sans nécessiter d'enregistrer de courts échantillons audio. Le clone de voix personnalisé est entraîné à partir d'échantillons audio que vous téléchargez une seule fois, enregistrés dans votre bibliothèque vocale et réutilisés dans n'importe quel projet grâce à leur voice_id. Dans la liste des voix, un clone de voix instantané porte l'étiquette "Voice Clone" et le genre "auto".
La création d'un clone de voix personnalisé est disponible sur la plateforme web de Rask. Une fois le clone enregistré, récupérez son voice_id à l'aide du point de terminaison permettant d'obtenir les voix du projet et attribuez-le à un locuteur via l'API.
Téléchargez 1 à 10 minutes d'audio ou de vidéo (jusqu'à 10 fichiers de 10 Mo maximum chacun) au format 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 d'élocution régulier, enregistré dans une pièce calme avec un bon microphone et sans bruit de fond.
Le clonage de voix prend en charge 32 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 vocal de l'anglais américain. Pour d'autres langues cible, choisissez une voix IA prédéfinie. 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 entretiens audio. Pour utiliser vos propres mots, modifiez le texte traduit segment par segment, ou créez la transcription à partir de votre propre fichier .srt avant de créer le projet, et la voix clonée prononcera votre texte. L'entrée étant toujours un enregistrement, une API de synthèse vocale sera plus adaptée pour une voix hors champ purement textuelle.
Obtenez les options vocales avec GET /v2/projects/{id}/voices, puis envoyez une requête PATCH /v2/projects/{id} avec une correspondance vocale incluant chaque interlocuteur, qu'il ait été modifié ou non. 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 d'équipe partagées, et les abonnements Enterprise 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 de voix 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 le timbre et la hauteur, afin qu'il se reconnaisse dans une autre langue. Le ton émotionnel, la cadence et le rythme suivent l'audio source et le script traduit ; une source claire et expressive garantit donc les meilleurs résultats.
Vous pouvez publier des vidéos doublées avec des voix clonées dans votre contenu commercial si vous détenez les droits de la vidéo source 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 piochant dans le même quota de minutes que l'application Rask. Les minutes excédant votre abonnement coûtent 3 $ par minute. Le nouveau doublage suite à un changement de voix n'est facturé que pour les segments modifiés. Commencez par un essai gratuit, sans carte de crédit requise.