API de subtítulos para archivos SRT y VTT traducidos

Sube un video una sola vez y obtén archivos de subtítulos en SRT y WebVTT para cada idioma de destino, sincronizados con el contenido hablado. Corrige cualquier línea a través de la API y descarga los archivos actualizados para tu reproductor, aplicación o software de edición de video.
SRT y WebVTT
Más de 135 idiomas y variantes regionales
REST + Python SDK
upload, create, download
OAuth 2.0
# 1. upload the video once - YouTube, Drive, S3, Vimeo or direct URL
curl -X POST https://api.rask.ai/api/library/v1/media/link \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"link": "https://example.com/onboarding.mp4", "name": "onboarding"}'

# 2. one project per subtitle language
for lang in es-mx fr-fr ja-jp; 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\"}"
done
GET /v2/projects/{project_id}
.srt + .vtt
# When status is merging_done, download both subtitle files
P=$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN")
curl -s -o onboarding.es-mx.srt "$(echo $P | jq -r .translation_srt_path)"
curl -s -o onboarding.es-mx.vtt "$(echo $P | jq -r .translation_vtt_path)"
Utilizado por equipos globales
Funciones

Todo lo que ofrece la API de subtítulos

Crea archivos SRT y WebVTT traducidos a partir de grabaciones de video o audio, incluyendo podcasts y entrevistas. Elige un idioma de destino para cada proyecto y obtén los archivos de subtítulos junto con la transcripción, la traducción y el contenido con doblaje.

Archivos SRT y WebVTT

Cada proyecto terminado incluye un archivo .srt y un archivo .vtt en el idioma de destino: SRT para software de edición de video y la mayoría de las plataformas, y WebVTT para reproducción de video en la web.

Subtítulos en otro idioma

Elimina las barreras de idioma para tu audiencia en cualquier mercado: crea un proyecto por idioma de destino (como es-mx, pt-br o fr-ca) a partir de la misma carga. El idioma de origen se detecta automáticamente.

Sincronizados con el contenido hablado

Cada subtítulo sigue un segmento de la transcripción con un tiempo de inicio y fin, para que cada línea aparezca en pantalla exactamente cuando se pronuncia.

Subtítulos en el idioma original

La transcripción contiene el texto original de cada segmento con sus marcas de tiempo. Conviértela en un archivo SRT o VTT para tener subtítulos en el mismo idioma con unas pocas líneas de código.

Etiquetas de orador para los diálogos

Cada segmento de la transcripción incluye una etiqueta de orador, lo que te permite identificar a las personas que hablan en entrevistas, paneles y diálogos.

Edita una línea antes de publicar

Corrige el texto o el tiempo de cualquier segmento a través de la API y vuélvelo a generar. Las palabras poco claras, los nombres y los acentos se solucionan de una vez en todos los formatos.

Términos coherentes en todos los idiomas

Un glosario mantiene los nombres de productos y términos técnicos idénticos en todos los idiomas de subtítulos, o en el idioma original si así lo prefieres.

Subtítulos y versión con doblaje

El mismo proyecto también ofrece las pistas de video y audio traducidas, por lo que obtienes los subtítulos y una versión con doblaje a partir de una sola carga.

Escala sin límites

Sin límites de velocidad, sin cuotas de simultaneidad y sin restricciones por clave. Agrega subtítulos a toda tu biblioteca de videos en cada idioma de destino de forma paralela.
Míralo en acción

Un video, cinco versiones de idioma

El mismo clip en inglés, francés, alemán, portugués y español. Cada versión de idioma incluye sus propios archivos de subtítulos SRT y VTT.
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
Flujo de trabajo

Tres solicitudes desde la subida del video hasta el archivo de subtítulos

Al crear el proyecto se inicia la transcripción, la traducción y la versión doblada en un solo paso. Usa el endpoint /generate después de editar las líneas de subtítulos.
1

Sube tu video

Envía el video como archivo o publica un enlace de YouTube, Google Drive, S3, Vimeo o cualquier URL directa. Una sola subida sirve para todos los idiomas de subtítulos.

POST /api/library/v1/media/link
2

Crear el proyecto

Pasa el id multimedia como video_id y un idioma de destino por proyecto. Los proyectos para diferentes idiomas se ejecutan en paralelo.

POST /v2/projects
3

Descarga los archivos de subtítulos

Lee el estado hasta que llegue a merging_done, luego descarga los archivos .srt y .vtt y guárdalos de tu lado.

GET /v2/projects/{project_id}
El tiempo de procesamiento varía según la duración del video, la cantidad de oradores y el idioma de destino. En una prueba, un video de 3:47 terminó en 165 segundos.
Diseñado a tu medida

¿Necesitas un formato de subtítulos o una entrega que no aparece en la lista? Habla con nuestro equipo

Otro formato de subtítulos, entrega a tu propio almacenamiento, un idioma fuera del catálogo o mayor rendimiento: nuestro equipo analiza lo que necesita tu flujo de producción y las opciones disponibles.

Idiomas y voces

¿Necesitas subtítulos en un idioma fuera del catálogo público? Habla con nuestro equipo sobre tus requerimientos y las opciones disponibles.

Entrega e integración

Webhooks, envío a tu propia cola, entrega directa a tu S3, endpoints personalizados. Cuéntanos cómo quieres alimentar tu flujo.

Volumen y capacidad

El tamaño de los lotes, los idiomas de destino por acción y la prioridad de procesamiento son términos contractuales, no límites fijos del producto.

Seguridad y alojamiento

La residencia de datos, SSO y SAML, las reglas de retención y el soporte para revisión de seguridad se gestionan como parte de la incorporación para empresas.
Casos de uso

¿Quién usa una API de subtítulos?

Plataformas con video integrado

Plataformas de LMS y educación de clientes, plataformas de creadores y de video, herramientas de seminarios web y eventos virtuales, SaaS de alojamiento y flujos de video, plataformas de adopción digital, compras en vivo. Convierte los subtítulos en todos los idiomas en una función de tus cargas de video.

Agencias de localización y producción

Entrega archivos SRT y VTT para cada idioma de cliente desde una sola subida. Los revisores corrigen las líneas a través de la API y los archivos se actualizan sin que nadie tenga que ajustar los tiempos.

Producción interna de video continua

Retail y comercio electrónico internacional, franquicias globales, medios de comunicación, universidades corporativas. Haz que el contenido de capacitación y los videos de productos sean accesibles para todos los mercados y para los espectadores que ven sin sonido.
Casos de éxito

Equipos reales, resultados medibles

Cómo las empresas localizan videos con Rask, en sus propios números.
flecha
flecha
Código

Ejemplos de código de la API de subtítulos

Un ejemplo completo en cada idioma: sube un video, crea un proyecto por idioma de subtítulos, espera y luego guarda los archivos .srt y .vtt o agrégalos a un reproductor HTML5.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio, urllib.request
from rask_sdk import clients, enums, schemas

LANGS = ["es-mx", "fr-fr", "ja-jp"]

async def subtitle(client, video_id, lang):
    job = await client.create_project(data=schemas.ProjectCreate(video_id=video_id, dst_lang=lang))
    while job.status is not enums.ProjectStatus.MERGING_DONE:
        await asyncio.sleep(10)
        job = await client.get_project(project_id=job.id)
    # links are presigned for one hour - save the files right away
    urllib.request.urlretrieve(job.translation_srt_path, f"video.{lang}.srt")
    urllib.request.urlretrieve(job.translation_vtt_path, f"video.{lang}.vtt")

async def main():
    client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
    media = await client.create_media_link(data=schemas.MediaCreateLink(link="https://example.com/onboarding.mp4"))
    while media.status is enums.MediaStatus.PROCESSING:
        await asyncio.sleep(5)
        media = await client.get_media(media_id=media.id)
    await asyncio.gather(*(subtitle(client, media.id, l) for l in LANGS))

asyncio.run(main())
github.com/braskai/rask-sdk
async, typed models
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}"}

pid = requests.post(f"{API}/v2/projects", headers=h,
                    json={"video_id": VIDEO_ID, "dst_lang": "de-de"}).json()["id"]
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
    time.sleep(10)

# translated subtitles: download the files
open("video.de-de.vtt", "wb").write(requests.get(p["translation_vtt_path"]).content)

# original-language captions: build a WebVTT file from the transcript segments
segs = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()["segments"]
cues = [f"{s['start'].replace(',', '.')} --> {s['end'].replace(',', '.')}\n{s['src']['text']}" for s in segs]
open("video.en.vtt", "w").write("WEBVTT\n\n" + "\n\n".join(cues) + "\n")
requests + polling
same-language captions
// no dependencies, Node 18+ global fetch
import { writeFile } from 'node:fs/promises';
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 langs = ['es-mx', 'pt-br', 'ko-kr'];
const tracks = await Promise.all(langs.map(async (dst_lang) => {
  let p = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang });
  while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
  const file = `subs/${dst_lang}.vtt`;
  await writeFile(file, await ((await fetch(p.translation_vtt_path)).text()));
  return `<track kind="subtitles" srclang="${dst_lang}" src="/${file}">`;
}));
console.log(tracks.join('\n'));   // paste inside your <video> element
fetch, Node 18+
HTML5 track elements
# 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 project for one subtitle language
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\": \"it-it\"}" | jq -r .id)

# 3. wait for merging_done
until [ "$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq -r .status)" = merging_done ]; do
  sleep 10
done

# 4. save both subtitle files
P=$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN")
curl -s -o video.it-it.srt "$(echo $P | jq -r .translation_srt_path)"
curl -s -o video.it-it.vtt "$(echo $P | jq -r .translation_vtt_path)"
download .srt and .vtt
shell script
<?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']];

foreach (['es-mx', 'tr-tr'] as $lang) {
    $p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
        'video_id' => $videoId, 'dst_lang' => $lang]]));
    while ($p['status'] !== 'merging_done') {
        sleep(10);
        $p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
    }
    // presigned links, valid for one hour
    file_put_contents("video.$lang.srt", file_get_contents($p['translation_srt_path']));
    file_put_contents("video.$lang.vtt", file_get_contents($p['translation_vtt_path']));
}
Guzzle 7
plain HTTP
Python es el SDK oficial. Las pestañas de Node, PHP y cURL son ejemplos de HTTP plano para los mismos endpoints.
Progreso

Cómo reporta el progreso un proyecto de subtítulos

Cada proyecto pasa por estados documentados, por lo que los usuarios que suben videos en tu aplicación pueden seguir el progreso de cada idioma de subtítulos. Solo necesitas actuar en tres grupos.

Éxito, detente aquí

merging_done
Los archivos de subtítulos están listos. Vuelve a consultar el proyecto para obtener nuevos enlaces de descarga.

En progreso, continúa consultando

created
uploading
transcription_started
separate_background_started
determine_speakers_started
translation_started
voiceover_started
merging_started
Además del equivalente _done estados. Estos se adaptan perfectamente a una interfaz de progreso por etapas.

Error, detener y reportar

failed
upload_failed
transcription_failed
translation_failed
voiceover_failed
merging_failed
no_audio
no_words
forbidden_link
no_audio, no_words y forbidden_link son lo suficientemente específicos como para mostrárselos directamente a tu propio usuario.
Observed run, 3:47 source video, en → es-mx
GET /v2/projects/{project_id}
   0s  created
  11s  transcription_started
  87s  translation_started
  99s  voiceover_started
 154s  merging_started
 165s  merging_done

O puedes omitir el sondeo por completo

Apúntanos a un endpoint de webhook y cada cambio de estado llegará como una petición POST, para que tu cola de tareas reaccione a cada cambio en el momento en que ocurre. La entrega por webhook forma parte de la incorporación para empresas (enterprise).
Leer la documentación
preserveAspectRatio="xMidYMid meet" aria-hidden="true" role="img">
Resultado

Primero los archivos de subtítulos, todo lo demás a la par

Cada proyecto finalizado incluye ambos formatos de subtítulos, los segmentos de transcripción y el contenido multimedia doblado. Los enlaces de descarga están firmados previamente y son válidos por una hora, así que copia los archivos a tu propio almacenamiento.
Campo
Formato
Qué es
translation_srt_path
.srt
Subtítulos en el idioma de destino, para software de edición y la mayoría de las plataformas de video
translation_vtt_path
.vtt
Subtítulos WebVTT para la reproducción de videos en HTML5 y reproductores web
/transcription
JSON
Texto fuente, traducción, etiqueta de orador y marcas de tiempo para cada segmento
translated_video
MP4
El video con doblaje, si también publicas una versión con voz
translated_audio
WAV
Voz traducida mezclada con la música y los efectos de sonido originales
original_video
MP4
Tu archivo de origen guardado como referencia
Control

Corrige una línea de subtítulos y regenera solo esa parte

Los subtítulos provienen de los segmentos de transcripción. Edita el texto o la sincronización de una línea, vuelve a generar y los archivos de subtítulos y la versión doblada se actualizarán juntos. La facturación cubre los segmentos modificados, con un mínimo de un minuto por ejecución.

Edición por segmentos

Edición por segmentos
Cada proyecto expone su transcripción como segmentos accesibles, por lo que una palabra incorrecta o un subtítulo retrasado se solucionan con una sola solicitud.
Obtén la transcripción y sus segmentos
Actualiza el texto original y nosotros volvemos a hacer la traducción
Modifica el texto traducido directamente para conservar tus propias palabras
Ajusta las marcas de tiempo, agrega segmentos o elimínalos
Cambia la voz asignada a cualquier hablante

Glosarios para tu terminología

Glosarios para tu terminología
Agrega un glosario para que los nombres de marca y los términos técnicos se lean igual en los subtítulos de todos los idiomas, o mantenlos en el idioma original a propósito.

Un glosario cubre un par de idiomas y se aplica a todas las variantes regionales de ese idioma de destino; por lo tanto, un solo glosario en español funciona para 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.
Entrada

Formatos de archivo compatibles

Sube un video o una grabación de audio compatible, o usa una URL de medios compatible. Crea un proyecto para cada idioma de destino y descarga sus archivos SRT y WebVTT.

Video

7 formatos
.mp4
.mov
.mkv
.avi
.webm
.m4v
.3gp

Audio

4 formatos
.mp3
.wav
.flac
.m4a

Metadatos antes de gastar

El endpoint de medios devuelve la duración, el tamaño del archivo, el códec de video, la velocidad de cuadros, la resolución, el códec de audio, la frecuencia de muestreo y la distribución de canales. Valida un archivo y calcula el costo por adelantado, ya que los proyectos se cobran por minuto de video.
Seguridad y cumplimiento normativo

Seguridad y cumplimiento para tu contenido de video

Brask Inc cuenta con la certificación SOC 2 Tipo II, opera bajo el marco del GDPR y publica el estado de control en vivo en su Trust Center para tu revisión de seguridad.

Certificaciones

SOC 2 Type II
GDPR
Miembro de CAI y C2PA

Cifrado

TLS 1.2 en tránsito
AES-256 en reposo
Llaves administradas SSE-S3
Rotación de llaves al menos cada 12 meses

Tu contenido

Entorno de AI cerrado
Nunca se usa para entrenar modelos generales
Exportación completa, sin ataduras

Acceso

SSO y SAML
Control de acceso basado en roles
Credenciales de cliente OAuth 2.0

Empresa

Opciones de residencia de datos
SLA personalizados
Gerente de cuenta dedicado

Derechos de voz

Voces sintéticas con derechos de uso
Clonación de voz basada en consentimiento
Controles de seguridad de AI, supervisión humana
Comparación

Rask API en comparación con una plataforma de subtítulos creada por ti

Los subtítulos en otro idioma requieren transcripción, traducción, sincronización y exportación de archivos. Aquí tienes el mismo resultado obtenido de dos maneras diferentes.
Lo que necesitas
Rask API
Armado por partes
Transcripción con marcas de tiempo
Incluido
Una API de conversión de voz a texto
Subtítulos en otro idioma
Más de 135 idiomas y variantes regionales
Una API de traducción más resincronización
Exportación en SRT y WebVTT
Ambos formatos en cada proyecto
Tu propio creador de archivos
Terminología consistente
Glosarios
Postprocesamiento personalizado
Corregir una línea
Una solicitud de actualización y luego regenerar
Editar cada archivo manualmente
Una versión doblada del mismo video
Incluido en el mismo proyecto
Un proveedor de conversión de texto a voz más tu propia mezcla de audio
Límites de velocidad
Ninguno
Lo que tus proveedores establezcan
Subtítulos integrados en el video
En la aplicación web de Rask, aún no en la API
Tu propio renderizado de video
Fuente, tamaño y diseño
Configurado en tu reproductor de video
Configurado en tu reproductor de video
Preguntas frecuentes

API de subtítulos: preguntas frecuentes

¿No encuentras lo que buscas? Ponte en contacto con el departamento de ventas.

¿Rask cuenta con una API de subtítulos?

¿Qué formatos de subtítulos devuelve la API?

¿Puedo obtener subtítulos en el idioma original?

¿Qué idiomas son compatibles?

¿La API puede integrar subtítulos en el video?

¿Puedo cambiar la fuente, el tamaño o el diseño de los subtítulos?

¿Los subtítulos describen la música y los efectos de sonido?

¿Se identifican los hablantes?

¿Cómo corrijo una línea de subtítulos?

¿Cuánto tiempo son válidos los enlaces de descarga?

¿Puedo usar mis propios subtítulos?

¿Cómo se cobra la API de subtítulos?

¿Cómo obtengo acceso a la API y una clave de API?

Empieza a hacer doblaje en una sola tarde

Haz tu primera solicitud hoy y habla con nosotros cuando necesites tarifas por volumen o un idioma que nadie más tenga.