# 1. upload an audio or video file by link
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/interview.mp3", "name": "interview"}'
# 2. create the project - speech recognition starts automatically
# src_lang is optional: leave it out and the language is detected
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$MEDIA_ID\", \"dst_lang\": \"es-mx\"}"# Read the transcript: one object per segment
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
| jq '.segments[] | {speaker, start, end, text: .src.text}'



Envía un archivo de audio o video como datos de formulario multipart, o comparte un enlace de YouTube, Google Drive, S3, Vimeo o cualquier URL directa. Obtendrás un ID de contenido multimedia y los metadatos del archivo antes de gastar algo.
Pasa el ID de contenido multimedia como video_id y un idioma de destino. Agrega el idioma de origen o el número de hablantes si los conoces. El reconocimiento comienza de inmediato.
Lee la transcripción en cuanto sus segmentos estén disponibles, mientras el contenido multimedia traducido se sigue procesando. Descarga los archivos de subtítulos y multimedia cuando el proyecto esté completo.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
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/interview.mp3"))
while media.status is enums.MediaStatus.PROCESSING:
await asyncio.sleep(5)
media = await client.get_media(media_id=media.id)
# src_lang omitted: the source language is detected automatically
job = await client.create_project(data=schemas.ProjectCreate(video_id=media.id, dst_lang="es-mx"))
while job.status is not enums.ProjectStatus.MERGING_DONE:
await asyncio.sleep(10)
job = await client.get_project(project_id=job.id)
transcript = await client.get_project_transcription(project_id=job.id)
for seg in transcript.segments:
print(seg.start, seg.end, seg.speaker, seg.src.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}"}
with open("interview.mp3", "rb") as f:
media = requests.post(f"{API}/api/library/v1/media", headers=h,
params={"kind": "audio"}, files={"data": f}).json()
while media["status"] == "processing":
time.sleep(5)
media = requests.get(f"{API}/api/library/v1/media/{media['id']}", headers=h).json()
pid = requests.post(f"{API}/v2/projects", headers=h, json={
"video_id": media["id"], "dst_lang": "es-mx", "num_speakers": 2}).json()["id"]
while requests.get(f"{API}/v2/projects/{pid}", headers=h).json()["status"] != "merging_done":
time.sleep(10)
# write the source transcript as an .srt file
segments = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()["segments"]
with open("interview_en.srt", "w") as out:
for i, s in enumerate(segments, 1):
out.write(f"{i}\n{s['start']} --> {s['end']}\n{s['speaker']}: {s['src']['text']}\n\n")// 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());
let media = await call('POST', '/api/library/v1/media/link', { link: 'https://example.com/webinar.mp4' });
while (media.status === 'processing') { await sleep(5000); media = await call('GET', `/api/library/v1/media/${media.id}`); }
let p = await call('POST', '/v2/projects', { video_id: media.id, src_lang: 'en', dst_lang: 'de-de' });
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.forEach((s) => console.log(`[${s.start}] ${s.speaker}: ${s.src.text}`));
console.log(p.translation_vtt_path); // German subtitles for your player# 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. upload a local audio file
MEDIA_ID=$(curl -s -X POST "https://api.rask.ai/api/library/v1/media?kind=audio" \
-H "Authorization: Bearer $TOKEN" -F "data=@podcast_episode.mp3" | jq -r .id)
# 3. create the project once the media status is ready
ID=$(curl -s -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$MEDIA_ID\", \"dst_lang\": \"fr-fr\"}" | jq -r .id)
# 4. when status is merging_done, read the transcript with speaker labels
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
| jq -r '.segments[] | "\(.start) \(.speaker): \(.src.text)"'<?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']];
$media = $json($http->post('/api/library/v1/media/link', ['headers' => $h, 'json' => [
'link' => 'https://example.com/interview.mp3']]));
while ($media['status'] === 'processing') {
sleep(5);
$media = $json($http->get("/api/library/v1/media/{$media['id']}", ['headers' => $h]));
}
$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
'video_id' => $media['id'], 'dst_lang' => 'es-mx']]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
$t = $json($http->get("/v2/projects/{$p['id']}/transcription", ['headers' => $h]));
foreach ($t['segments'] as $s) {
echo $s['start'], ' ', $s['speaker'], ': ', $s['src']['text'], PHP_EOL;
}{"segments": [
{"speaker": "SPEAKER_00", "start": "00:00:00,320", "end": "00:00:07,316", "status": "done",
"src": {"text": "Thanks for joining us. Let's start with the new release.", "lang": "en"},
"dst": {"text": "Gracias por acompañarnos. Empecemos con la nueva versión.", "lang": "es-mx"}},
{"speaker": "SPEAKER_01", "start": "00:00:07,640", "end": "00:00:11,900", "status": "done",
"src": {"text": "Sure. The biggest change is the reporting view.", "lang": "en"},
"dst": {"text": "Claro. El cambio más grande es la vista de reportes.", "lang": "es-mx"}}
]}

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í. El reconocimiento de voz es la primera etapa de cada proyecto en Rask. Sube audio o video, crea un proyecto y lee la transcripción en segmentos con etiquetas de oradores y marcas de tiempo desde GET /v2/projects/{id}/transcription. Ese mismo proyecto traduce la transcripción y devuelve subtítulos y audio con doblaje.
La API acepta 75 idiomas de origen. Deja src_lang vacío y el idioma se detectará automáticamente, o ingresa un código de dos letras como en o de. La transcripción se puede traducir a más de 135 opciones de idiomas y regiones.
Sí. Sube archivos de audio en MP3, WAV, FLAC o M4A, como podcasts, entrevistas y llamadas grabadas, y el proyecto los transcribirá de la misma manera que un video.
Sí. Los diferentes hablantes se detectan automáticamente y cada segmento incluye una etiqueta de hablante en el formato SPEAKER_XX. Ingresa num_speakers si conoces la cantidad y corrige al hablante de cualquier segmento a través de la API.
No. Las marcas de tiempo son a nivel de segmento: cada segmento tiene una hora de inicio y de fin en formato HH:MM:SS,mmm. Esa es la sincronización que usan los subtítulos y leyendas. Si necesitas una marca de tiempo para cada palabra, elige una API de conversión de voz a texto dedicada.
No. Rask transcribe archivos de audio y video completos y pregrabados. Para subtítulos en tiempo real, agentes de voz, IA conversacional y centros de contacto, donde el texto debe aparecer mientras la persona aún está hablando, una API de conversión de voz a texto por streaming es la mejor opción.
La precisión depende del audio: los micrófonos, los acentos, las voces encimadas y el ruido de fondo influyen. Prueba la API con una muestra de tus propias grabaciones y corrige cualquier segmento a través de la API antes de publicarlo o traducirlo.
El reconocimiento no incluye una lista de vocabulario personalizado. Corrige palabras específicas en la transcripción a través del endpoint de segmentos. Cuando la transcripción se traduce, un glosario mantiene la consistencia de los nombres de productos, nombres propios y términos especializados.
El proyecto terminado incluye archivos de subtítulos en formato SRT y VTT en el idioma de destino. La transcripción en el idioma de origen se entrega como segmentos JSON con tiempos de inicio y fin, los cuales se pueden convertir a SRT con unas cuantas líneas de código.
Sí. En los planes con importación de transcripciones, puedes proporcionar una transcripción de origen existente, una traducción aprobada en el idioma de destino, o ambas en archivos SRT o segmentos de texto con marca de tiempo al crear el proyecto. Rask puede traducir tu guion de origen o usar tu traducción aprobada para el doblaje.
Los proyectos se cobran por minuto de audio o video, redondeado al siguiente minuto completo, utilizando la misma bolsa de minutos de la app de Rask. El precio incluye transcripción, traducción, doblaje y subtítulos. Los minutos adicionales cuestan $3 por minuto en los planes estándar elegibles. Los precios para empresas se adaptan a tu acuerdo. Si solo necesitas una transcripción, una API dedicada de voz a texto cuesta menos.
Comienza con una prueba gratuita en la app de Rask, sin necesidad de tarjeta, para probar la transcripción y traducción con tus propios archivos. 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 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.