# 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



Envía un archivo como datos de formulario multipart, o publica un enlace de YouTube, Google Drive, S3, Vimeo o cualquier URL directa. La voz en este video sirve como muestra para cada clonación de voz instantánea.
Envía el ID multimedia como video_id y un idioma de destino. Cada hablante detectado recibe una clonación de voz instantánea en los idiomas compatibles, y el doblaje comienza de inmediato.
Haz una lista de las voces del proyecto, asigna una clonación personalizada o una preestablecida a cualquier hablante, luego usa /generate y descarga los archivos cuando el doblaje esté listo.
# 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 y es-es por igual. El proyecto registra glossary_version, de modo que las ediciones posteriores nunca modifiquen el trabajo finalizado en segundo plano.Sí. La API de clonación de voz de Rask clona la voz de cada hablante como parte del doblaje de un video. Crea un proyecto con un idioma de destino y cada hablante recibe una clonación instantánea de voz en los idiomas compatibles. También puedes asignar un clon de voz personalizado creado en la aplicación de Rask a cualquier hablante.
La clonación instantánea de voz utiliza las voces de los hablantes de tu video original para los idiomas de destino compatibles. Para obtener un clon de voz personalizado reutilizable, créalo en la aplicación de Rask con el consentimiento del hablante y luego asígnalo a través de la API. Los resultados dependen del audio de origen, así como del idioma y la voz seleccionados.
La clonación instantánea de voz se crea automáticamente a partir de la locución en el video que doblas, sin necesidad de grabar muestras de audio cortas. El clon de voz personalizado se entrena a partir de muestras de audio que subes una sola vez, se guarda en tu biblioteca de voces y se reutiliza en cualquier proyecto mediante su voice_id. En la lista de voces, una clonación instantánea de voz tiene la etiqueta "Voice Clone" y el género "auto".
La creación de un clon de voz personalizado está disponible en la plataforma web de Rask. Una vez que se guarda el clon, obtén su voice_id con el endpoint de obtención de voces del proyecto y asígnaselo a un hablante a través de la API.
Sube de 1 a 10 minutos de audio o video, hasta 10 archivos de un máximo de 10 MB cada uno, en formato MP4, MOV, WEBM, MKV, MP3, M4A o WAV, o bien pega un enlace de YouTube o Google Drive. Para obtener los mejores resultados, usa un solo hablante con un estilo constante, grabado en una habitación silenciosa con un buen micrófono y sin ruido de fondo.
La clonación de voz admite 32 idiomas base y sus variantes regionales. Las variantes regionales utilizan el modelo de clonación base; por ejemplo, el texto en inglés británico usa el modelo de voz de inglés estadounidense. Para otros idiomas de destino, elige una voz AI preestablecida. Consulta el catálogo de idiomas de la API para ver la lista completa.
La API dobla grabaciones tanto de video como de audio, incluidos podcasts solo de audio y entrevistas. Para usar tus propias palabras, edita el texto traducido segmento por segmento, o crea la transcripción a partir de tu propio archivo .srt antes de crear el proyecto, y la voz clonada hablará con tu texto. La entrada es siempre una grabación, por lo que para locuciones solo de texto, una API de texto a voz es una mejor opción.
Obtén las opciones de voz con GET /v2/projects/{id}/voices, luego envía PATCH /v2/projects/{id} con un mapa de voces que incluya a cada hablante, tanto el modificado como los que no cambiaron. Llama a /generate para volver a doblar. El nuevo doblaje se factura según la duración combinada de los segmentos modificados, con un mínimo de un minuto por ejecución cobrada.
Los planes Creator Pro incluyen hasta 3 voces personalizadas, los planes Business hasta 10 voces compartidas para el equipo, y los planes Enterprise una biblioteca de voces personalizada.
Sí. Las clonaciones de voz personalizadas se crean con el consentimiento del hablante, y solo debes doblar videos cuyos hablantes hayan dado su aprobación. Rask utiliza una clonación de voz basada en el consentimiento y controles de seguridad de IA, y tu audio nunca se usa para entrenar modelos generales.
El clon replica la identidad de la voz del hablante, incluido el timbre y el tono, para que suenen como ellos mismos en otro idioma. El tono emocional, la cadencia y el ritmo siguen el audio original y el guion traducido, por lo que un discurso original claro y expresivo ofrece los mejores resultados.
Puedes publicar videos doblados con voces clonadas en tu contenido comercial cuando tengas los derechos del video original y el consentimiento de los hablantes. Consulta los Términos de servicio de Rask para conocer los detalles aplicables a tu plan.
La clonación de voz es parte del doblaje y no tiene un costo adicional: el uso de la API se cobra por minuto de video, redondeado al siguiente minuto completo, de la misma bolsa de minutos de la app de Rask. Los minutos que excedan un plan cuestan $3 por minuto. El nuevo doblaje tras un cambio de voz se factura solo por los segmentos modificados. Comienza con una prueba gratis, sin necesidad de tarjeta de crédito.