# 1. one Spanish glossary - it applies to every Spanish regional variant
curl -X POST https://api.rask.ai/v2/glossaries \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"name": "Brand terms", "src_lang": "en", "dst_lang": "es",
"entries": {"Rask Studio": "Rask Studio", "onboarding": "incorporación"}}'
# 2. a localized version per market, both with the same glossary
for lang in es-mx es-es; do
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\": \"$lang\", \"glossary_id\": \"$GLOSSARY_ID\"}"
done# Review: source and translated text, segment by segment
curl -s https://api.rask.ai/v2/projects/$ID/transcription \
-H "Authorization: Bearer $TOKEN" \
| jq '.segments[] | {speaker, src: .src.text, dst: .dst.text}'



Crea un glosario para cada par de idiomas, guarda voces personalizadas para los presentadores recurrentes y elige la región para cada mercado en el que publiques.
Sube el video original una vez y luego crea un proyecto para cada mercado de destino con tu glosario, o bien con una traducción aprobada importada desde un archivo SRT.
Lee el texto traducido lado a lado, edita lo que los revisores señalen, vuelve a hacer el doblaje de los segmentos modificados y descarga el video localizado junto con los subtítulos.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
MARKETS = ["es-mx", "es-es"]
async def localize(client, video_id, locale, glossary_id):
job = await client.create_project(data=schemas.ProjectCreate(
video_id=video_id, dst_lang=locale, glossary_id=glossary_id))
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)
glossary = await client.create_glossary(data=schemas.GlossaryCreate(
name="Brand terms", src_lang="en", dst_lang="es",
entries={"Rask Studio": "Rask Studio", "onboarding": "incorporación"}))
jobs = await asyncio.gather(*(localize(client, VIDEO_ID, m, glossary.id) for m in MARKETS))
for job in jobs: # review before publishing
script = await client.get_project_transcription(project_id=job.id)
for seg in script.segments[:3]:
print(job.dst_lang, seg.speaker, seg.src.text, "->", seg.dst.text)
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}"}
glossary = requests.post(f"{API}/v2/glossaries", headers=h, json={
"name": "Brand terms", "src_lang": "en", "dst_lang": "es",
"entries": {"Rask Studio": "Rask Studio", "onboarding": "incorporación"}}).json()
ids = [requests.post(f"{API}/v2/projects", headers=h, json={
"video_id": VIDEO_ID, "dst_lang": locale, "glossary_id": glossary["id"]}).json()["id"]
for locale in ["es-mx", "es-es"]]
for pid in ids:
while requests.get(f"{API}/v2/projects/{pid}", headers=h).json()["status"] != "merging_done":
time.sleep(10)
script = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()
for seg in script["segments"][:3]:
print(seg["src"]["text"], "->", seg["dst"]["text"])// 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 glossary = await call('POST', '/v2/glossaries', {
name: 'Brand terms', src_lang: 'en', dst_lang: 'es',
entries: { 'Rask Studio': 'Rask Studio', onboarding: 'incorporación' },
});
for (const dst_lang of ['es-mx', 'es-es']) {
let p = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang, glossary_id: glossary.id });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
const { segments } = await call('GET', `/v2/projects/${p.id}/transcription`);
segments.slice(0, 3).forEach((s) => console.log(dst_lang, s.src.text, '->', s.dst.text));
}# 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. import the translation your reviewers approved (source and translated .srt)
TRANSCRIPT_ID=$(curl -s -X POST "https://api.rask.ai/v2/transcriptions/srt?src_lang=en&dst_lang=es-mx" \
-H "Authorization: Bearer $TOKEN" \
-F "src=@source_en.srt" -F "dst=@approved_es-mx.srt" | jq -r .id)
# 3. create the localized version from it - Rask voices the approved script
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\"}"<?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']];
$glossary = $json($http->post('/v2/glossaries', ['headers' => $h, 'json' => [
'name' => 'Brand terms', 'src_lang' => 'en', 'dst_lang' => 'es',
'entries' => ['Rask Studio' => 'Rask Studio', 'onboarding' => 'incorporación'],
]]));
foreach (['es-mx', 'es-es'] as $locale) {
$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
'video_id' => $videoId, 'dst_lang' => $locale, 'glossary_id' => $glossary['id']]]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
$script = $json($http->get("/v2/projects/{$p['id']}/transcription", ['headers' => $h]));
echo $locale, ': ', $script['segments'][0]['dst']['text'], PHP_EOL;
} 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.Una API de localización de video convierte un video original en distintas versiones para otros mercados mediante la automatización en tu propio código: voz traducida y doblada, subtítulos, terminología consistente y sincronización labial opcional. Con Rask, cada versión para un mercado es un proyecto que creas, revisas y descargas a través de una sola REST API.
La traducción cambia las palabras. La localización prepara el mismo video para un mercado específico: la variante de idioma regional, los términos de marca que se mantienen consistentes, las voces de los hablantes, los subtítulos y un paso de revisión antes de publicarlo. La API de Rask admite todo esto en un solo flujo de trabajo.
Sí. Crea un proyecto para cada región de destino, como es-mx para México y es-es para España, y reutiliza un glosario en español para mantener los términos de marca consistentes. Revisa la redacción para cada mercado. Cuando el acento regional sea importante, elige una voz AI preestablecida disponible para esa región; la clonación de voz utiliza el modelo de lenguaje base y no garantiza un acento regional distinto.
Crea un glosario para cada par de idiomas y adjúntalo al crear el proyecto. Cada proyecto registra la versión del glosario que utilizó, por lo que editar un glosario más tarde nunca afecta el trabajo terminado. No se puede agregar un glosario a un proyecto después de haberlo creado.
Sí, en los planes con subida de SRT. Importa tu archivo SRT en el idioma de destino aprobado al crear el proyecto; un archivo SRT en el idioma de origen por separado es opcional. También puedes proporcionar ambos archivos cuando los tengas. Rask usa tu traducción aprobada para el doblaje.
La relevancia cultural requiere criterio humano. La API ofrece a los revisores cada segmento para adaptar referencias, modismos y ejemplos al mercado antes de la publicación, y Rask puede agregar control de calidad humano al flujo de trabajo cuando tu equipo no pueda revisar cada video.
Los endpoints documentados de la API localizan la voz y los subtítulos. El texto que forma parte de la imagen, como los títulos en la grabación, se queda tal como fue filmado. Habla con nuestro equipo si el texto en pantalla es parte de tu flujo de trabajo de localización.
Localiza a múltiples idiomas a partir de más de 135 opciones de idiomas y regiones, incluyendo español de México y de España, portugués de Brasil y de Europa, y francés canadiense. Cada proyecto toma una región de destino. La lista completa está en la documentación de la API, y nuestro equipo puede hablar sobre opciones fuera de ella.
Sí, en los idiomas compatibles con la clonación de voz. Utiliza la clonación de voz instantánea para preservar la identidad del locutor, o una clonación de voz personalizada guardada para un presentador recurrente. La clonación utiliza el modelo de lenguaje base, por lo que seleccionar una región específica no garantiza el acento de esa zona. Elige una voz AI preestablecida disponible cuando el acento regional sea la prioridad.
La sincronización labial es un paso opcional para grabaciones en las que una persona real habla ante la cámara. Ejecútala en la versión localizada después de la revisión. Cada generación de sincronización labial de video completo se factura por separado del doblaje, incluidas las generaciones posteriores a ediciones subsecuentes.
El uso de la API se cobra por minuto de video para cada versión de mercado, 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 su contrato. El nuevo doblaje después de la revisión se cobra según la duración combinada de los segmentos modificados, con un mínimo de un minuto por ejecución, y la sincronización labial se cobra por separado. Prueba la localización en la app de Rask con una prueba gratis, sin necesidad de tarjeta. Para evaluar la API, agenda una demostración con nuestro equipo.
Sí. Para volúmenes recurrentes, nuestro equipo puede ayudar a mapear su proceso actual, definir las etapas de revisión y aprobación, configurar la terminología y las voces, conectar Rask a su CMS o LMS, y agregar control de calidad humano donde sea necesario.
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.