# 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 video o la grabación de audio a la que pertenece tu voz en off usando un archivo o una URL de medios compatible. Su línea de tiempo establece el tiempo de tu guion.
Crea una transcripción a partir de fragmentos 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.
Enumera las voces, asigna un preajuste o una clonación a cada hablante, vuelve a generar si es necesario y descarga la voz en off, el video y los archivos de 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 proyecto registra glossary_version, de modo que las ediciones posteriores nunca modifiquen el trabajo finalizado en segundo plano.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 con sonido 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 conversión de texto a voz con streaming es la 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 genera.
Crea una transcripción con POST /v2/transcriptions a partir de segmentos que incluyan un hablante, un tiempo 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 idioma de destino cuenta con voces AI predefinidas con género asignado en la biblioteca de voces. Obtén las opciones para un proyecto con GET /v2/projects/{id}/voices y asigna una por hablante usando su ID de voz. En los idiomas compatibles con 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 hablante y, después, asigna su ID de voz a cualquier hablante mediante la API en los idiomas compatibles con clonación de voz. Funciona muy bien como 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. Las voces AI están disponibles para cualquier 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, incluida la puntuación. Para lograr un rango emocional que coincida con una actuación real, una clonación de voz del hablante original conserva mejor su identidad vocal.
Puedes usar un video o una grabación de audio. Sube el archivo multimedia de origen y proporciona un guion con marcas de tiempo para generar la voz en off a lo largo de su duración. Se requiere un archivo multimedia.
No. El uso se cobra por minuto de video, redondeado hacia arriba al siguiente minuto completo, utilizando la misma bolsa de minutos de la app de Rask. Los minutos adicionales cuestan $3/min 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.
Empieza con una prueba gratis en la app de Rask, sin tarjeta de crédito, para escuchar las voces en tu propio video. El acceso a la API está disponible en los planes Creator Pro, Business y Enterprise, y sus funciones dependen de tu plan.
El acceso a la API está disponible en los planes Creator Pro, Business y Enterprise, con las funciones que correspondan a tu plan. Puedes generar tu ID de cliente y 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 personalizada se gestionan a través de nuestro equipo.