# 1. send your script as timed segments - one speaker per line
curl -X POST https://api.rask.ai/v2/transcriptions \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"segments": [
{"speaker": "SPEAKER_00", "start": "00:00:00,500", "end": "00:00:04,800",
"src": {"text": "Welcome to the new dashboard.", "lang": "en"},
"dst": {"text": "Bienvenido al nuevo panel.", "lang": "es-mx"}}
]}'
# 2. voice the script over your video
curl -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\", \"transcript_id\": \"$TRANSCRIPT_ID\"}"# When status is merging_done, read the voiceover links
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
| jq '{status, voiceover, translated_audio, translated_video}'



Sube el archivo de video o audio al que pertenece tu voz usando un archivo o una URL de medios compatible. Su línea de tiempo proporciona la sincronización para tu guion.
Crea una transcripción a partir de segmentos de texto con marcas de tiempo y hablantes, o desde un archivo SRT, y luego crea el proyecto con su transcript_id y un idioma de destino.
Consulta las voces, asigna una predeterminada o una clonada a cada hablante, vuelve a generar si es necesario y descarga la voz, el video y los subtítulos.
# 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)
script = await client.create_transcription(data=schemas.TranscriptionCreate(segments=[
schemas.SegmentCreate(speaker="SPEAKER_00", start="00:00:00,500", end="00:00:04,800",
src=schemas.SegmentTextCreatePatch(text="Welcome to the new dashboard.", lang="en"),
dst=schemas.SegmentTextCreatePatch(text="Bienvenido al nuevo panel.", lang="es-mx")),
]))
job = await wait(client, await client.create_project(data=schemas.ProjectCreate(
video_id=VIDEO_ID, dst_lang="es-mx", transcript_id=script.id)))
# pick a female AI voice preset from the library for SPEAKER_00
voices = await client.get_project_voices(project_id=job.id)
preset = next(v for v in voices if v.gender == "female")
await client.patch_project(project_id=job.id, data=schemas.ProjectPatch(voice={**job.voice, "SPEAKER_00": preset.id}))
job = await wait(client, await client.generate_project(project_id=job.id))
print(job.voiceover, job.translated_video)
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
script = requests.post(f"{API}/v2/transcriptions", headers=h, json={"segments": [
{"speaker": "SPEAKER_00", "start": "00:00:00,500", "end": "00:00:04,800",
"src": {"text": "Welcome to the new dashboard.", "lang": "en"},
"dst": {"text": "Bienvenido al nuevo panel.", "lang": "es-mx"}},
]}).json()
pid = requests.post(f"{API}/v2/projects", headers=h, json={
"video_id": VIDEO_ID, "dst_lang": "es-mx", "transcript_id": script["id"]}).json()["id"]
project = wait(pid)
voices = requests.get(f"{API}/v2/projects/{pid}/voices", headers=h).json()
preset = next(v for v in voices if v["gender"] == "female")
requests.patch(f"{API}/v2/projects/{pid}", headers=h,
json={"voice": {**project["voice"], "SPEAKER_00": preset["id"]}})
requests.post(f"{API}/v2/projects/{pid}/generate", headers=h)
print(wait(pid)["voiceover"])// 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; };
const script = await call('POST', '/v2/transcriptions', { segments: [
{ speaker: 'SPEAKER_00', start: '00:00:00,500', end: '00:00:04,800',
src: { text: 'Welcome to the new dashboard.', lang: 'en' },
dst: { text: 'Bienvenido al nuevo panel.', lang: 'es-mx' } },
] });
const { id } = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang: 'es-mx', transcript_id: script.id });
const project = await wait(id);
const voices = await call('GET', `/v2/projects/${id}/voices`);
const preset = voices.find((v) => v.gender === 'female');
await call('PATCH', `/v2/projects/${id}`, { voice: { ...project.voice, SPEAKER_00: preset.id } });
await call('POST', `/v2/projects/${id}/generate`);
console.log((await wait(id)).voiceover);# 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. your script as an SRT file in the target language
TRANSCRIPT_ID=$(curl -s -X POST "https://api.rask.ai/v2/transcriptions/srt?dst_lang=es-mx" \
-H "Authorization: Bearer $TOKEN" -F "dst=@script_es-mx.srt" | jq -r .id)
# 3. voice it over the video
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\", \"transcript_id\": \"$TRANSCRIPT_ID\"}" | jq -r .id)
# 4. when status is merging_done, read the voiceover links
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
| jq '{status, voiceover, translated_video}'<?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']];
$script = $json($http->post('/v2/transcriptions', ['headers' => $h, 'json' => ['segments' => [[
'speaker' => 'SPEAKER_00', 'start' => '00:00:00,500', 'end' => '00:00:04,800',
'src' => ['text' => 'Welcome to the new dashboard.', 'lang' => 'en'],
'dst' => ['text' => 'Bienvenido al nuevo panel.', 'lang' => 'es-mx'],
]]]]));
$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
'video_id' => $videoId, 'dst_lang' => 'es-mx', 'transcript_id' => $script['id']]]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
echo $p['voiceover'];{"label": "Renata", "gender": "female", "sample_src": "https://..."} AI voice preset
{"label": "Gerardo", "gender": "male", "sample_src": "https://..."} AI voice preset
{"label": "Maria Lopez", "gender": "auto", "sample_src": "https://..."} custom voice clone
{"label": "Voice Clone", "gender": "auto", "sample_src": null} instant voice clone

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í, para locución de video. Envía tu guion como segmentos de texto con marca de tiempo o un archivo SRT junto con un video, y la API genera voz natural sincronizada con la imagen, usando voces AI o clonación de voz, con subtítulos y pistas de audio en el mismo proyecto.
Rask genera voz para proyectos completos y entrega archivos, lo cual es ideal para videos publicados, contenido de capacitación y marketing. Para agentes de voz, centros de contacto y otras aplicaciones de baja latencia que necesitan audio en segundos, una API de texto a voz con streaming es una mejor opción.
La voz se entrega cuando finaliza la generación del proyecto: la locución en formato WAV en los planes elegibles, el audio mezclado y el video. La API no transmite fragmentos ni bytes de audio mientras se está generando.
Crea una transcripción con POST /v2/transcriptions a partir de segmentos que incluyan un locutor, hora de inicio y fin en formato HH:MM:SS,mmm, y el texto. También puedes subir un archivo SRT a POST /v2/transcriptions/srt. Luego, incluye el transcript_id al crear el proyecto.
Cada región de destino cuenta con voces AI predefinidas con un género específico en la biblioteca de voces. Obtén las opciones para un proyecto con GET /v2/projects/{id}/voices y asigna una por locutor usando su ID de voz. En los idiomas compatibles con la clonación de voz, también puedes usar voces clonadas.
Sí. Crea una clonación de voz personalizada una vez en la aplicación de Rask con el consentimiento del locutor, y luego asigna su ID de voz a cualquier locutor a través de la API en los idiomas compatibles con la clonación de voz. Funciona muy bien para mantener una voz de marca constante.
Elige entre más de 135 opciones de idiomas y regiones. Escribe el guion en un idioma y Rask lo traduce, o envía el guion directamente en el idioma de destino. Hay voces AI disponibles para cada región de destino.
La API acepta texto plano por segmento. Para guiar la pronunciación, ajusta la ortografía en el texto del guion. Los glosarios controlan cómo se traducen los términos, no cómo se pronuncian.
La interpretación sigue la voz seleccionada y tu texto, incluyendo la puntuación. Para lograr un rango emocional que se parezca a una actuación real, una clonación de voz del locutor original conserva mejor su identidad vocal.
Puedes usar un video o una grabación de audio. Sube el archivo multimedia y proporciona un guion con marcas de tiempo para generar la voz superpuesta a lo largo de su duración. Se requiere subir un archivo multimedia.
No. El uso 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 cuestan $3 por minuto en los planes estándar elegibles. Los precios para empresas se adaptan a tu contrato. El nuevo doblaje se cobra según los segmentos modificados, con un mínimo de un minuto por ejecución facturada.
Empieza con una prueba gratuita en la app de Rask, sin necesidad de tarjeta, para escuchar las voces en tu propio video. El acceso a la API está disponible en los planes Creator Pro, Business y Enterprise, y las funciones dependen de tu plan.
El acceso a la API está disponible en los planes Creator Pro, Business y Enterprise, con funciones definidas según tu plan. Puedes generar tu ID de cliente y tu clave secreta en la app y empezar a hacer llamadas de inmediato. Las condiciones para empresas, los precios por volumen y la cobertura de idiomas personalizados se gestionan a través de nuestro equipo.