# 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. El discurso en este vídeo es la muestra de voz para cada clonación de voz instantánea.
Pasa el ID de medios 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.
Lista las voces del proyecto, asigna un clon personalizado o un ajuste preestablecido a cualquier hablante, luego llama a /generate y descarga los archivos cuando el doblaje esté completo.
# 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 registro del proyecto glossary_version, para que las modificaciones posteriores nunca alteren en silencio el trabajo ya terminado.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 recibirá una clonación de voz instantánea en los idiomas compatibles. También puedes asignar una clonación de voz personalizada creada en la aplicación de Rask a cualquier hablante.
La clonación de voz instantánea utiliza las voces de los hablantes de tu video original para los idiomas de destino compatibles. Si prefieres una clonación de voz personalizada y reutilizable, créala en la aplicación de Rask con el consentimiento del hablante y, después, asígnala a través de la API. Los resultados dependen del audio original y del idioma y la voz que hayas seleccionado.
La clonación de voz instantánea se crea de forma automática a partir de la voz en el video que doblas, sin necesidad de grabar muestras cortas de audio. La clonación de voz personalizada se entrena con muestras de audio que subes una sola vez, se guarda en tu biblioteca de voces y se puede reutilizar en cualquier proyecto mediante su voice_id. En la lista de voces, una clonación de voz instantánea aparece con la etiqueta "Voice Clone" y el género "auto".
La creación de una clonación de voz personalizada está disponible en la plataforma web de Rask. Una vez guardada la clonación, obtén su voice_id con el endpoint para recuperar las voces del proyecto y asígnasela a un hablante a través de la API.
Sube de 1 a 10 minutos de audio o video (hasta 10 archivos de máximo 10 MB cada uno) en formatos MP4, MOV, WEBM, MKV, MP3, M4A o WAV, o bien pega un enlace de YouTube o Google Drive. Para obtener los mejores resultados, usa una sola persona hablando con un estilo constante, grabada en una habitación silenciosa, con un buen micrófono y sin ruido de fondo.
La clonación de voz es compatible con 32 idiomas base y sus respectivas variantes regionales. Las variantes regionales utilizan el modelo base de clonación; por ejemplo, el texto en inglés británico utiliza el modelo de voz en inglés de Estados Unidos. Para otros idiomas de destino, puedes elegir una voz AI predefinida. Consulta el catálogo de idiomas de la API para ver la lista completa.
La API realiza el doblaje de grabaciones de video y audio, incluidos pódcasts y entrevistas solo de audio. Si quieres 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 iniciar el proyecto, y la voz clonada dirá tu texto. La entrada siempre es una grabación, por lo que para locuciones basadas únicamente en texto es mejor opción una API de texto a voz.
Obtén las opciones de voz con GET /v2/projects/{id}/voices, luego envía una solicitud PATCH /v2/projects/{id} con un mapa de voz que incluya a todas las personas, tanto la que cambiaste como las que no. Llama a /generate para volver a hacer el doblaje. Volver a doblar se cobra según la duración combinada de los segmentos modificados, con un mínimo de un minuto por cada ejecución cobrable.
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 de la persona, y solo debes doblar videos en los que las personas 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 utiliza para entrenar modelos generales.
El clon replica la identidad vocal de la persona, incluido el timbre y el tono, para que suene como ella misma en otro idioma. El tono emocional, la cadencia y el ritmo siguen al audio original y al guion traducido, por lo que un discurso de origen 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 las personas. Consulta los Términos de servicio de Rask para conocer los detalles aplicables a tu plan.
La clonación de voz forma parte del doblaje y no tiene un costo adicional: el uso de la API se cobra por minuto de video (redondeando hacia arriba al siguiente minuto completo) utilizando la misma bolsa de minutos de la app de Rask. Los minutos adicionales que superen los de tu plan cuestan $3 por minuto. Volver a doblar tras un cambio de voz se cobra únicamente por los segmentos modificados. Empieza con una prueba gratis, sin necesidad de tarjeta de crédito.