Actualizado 5 junio 2026 · 10 min de lectura
Cómo generar videos desde texto con API en español
Crear videos para TikTok, Reels o YouTube Shorts de forma manual consume horas. Guionizar, grabar, editar, añadir música, exportar. Pero ¿qué pasa si puedes enviar un texto y recibir un video MP4 listo para publicar en segundos?
En este tutorial te muestro cómo usar la API de Videora para convertir texto en video con narración, música de fondo, transiciones y subtítulos automáticos — todo desde código.
Por qué automatizar la creación de videos
Si generas contenido para redes sociales, podcasts visuales, resúmenes de noticias o material educativo, probablemente enfrentas el mismo problema: crear un video de 30 segundos toma 45+ minutos entre edición, exportación y ajustes.
Con una API de generación de video puedes:
- Automatizar series completas — genera 30 videos desde un CSV de textos en una sola corrida
- Integrar en tu workflow — conecta con tu CMS, newsletter o cron para publicar automáticamente
- Escalar sin contratar editores — un freelancer edita ~5 videos/día, la API genera 50+
- Mantener consistencia de marca — misma tipografía, colores, intro/outro en todos los videos
Alternativas y por qué Videora es diferente
| Herramienta | Precio | Limitación |
|---|---|---|
| Synthesia | $22/mes | Solo avatares. No acepta JSON. Sin API batch. |
| HeyGen | $24/mes | Enfocado en talking heads. Lento para batch. |
| Lumen5 | $29/mes | Sin API pública. Solo editor visual. |
| InVideo | $25/mes | Sin API. Requiere edición manual por video. |
| Videora | Free — $19/mes | API-first. JSON → MP4. Batch nativo. Voces en español. |
Paso 1: Define tus escenas en JSON
Cada video se compone de escenas. Cada escena tiene un texto que se narra, una imagen de fondo (opcional) y una duración.
{
"title": "3 tips para dormir mejor",
"aspect_ratio": "9:16",
"voice": "es-MX-Jorge",
"scenes": [
{
"text": "Tip número uno: evita pantallas una hora antes de dormir.",
"image_url": "https://images.pexels.com/photos/1028741/pexels-photo-1028741.jpeg",
"duration": 5
},
{
"text": "Tip dos: mantén tu habitación a 18 grados centígrados.",
"image_url": "https://images.pexels.com/photos/271743/pexels-photo-271743.jpeg",
"duration": 5
},
{
"text": "Tip tres: no tomes café después de las 2 de la tarde.",
"image_url": "https://images.pexels.com/photos/302899/pexels-photo-302899.jpeg",
"duration": 5
}
]
}
Paso 2: Envía a la API
Python
import requests
payload = {
"title": "3 tips para dormir mejor",
"aspect_ratio": "9:16",
"voice": "es-MX-Jorge",
"scenes": [
{"text": "Tip uno: evita pantallas antes de dormir.", "duration": 5},
{"text": "Tip dos: habitación a 18 grados.", "duration": 5},
{"text": "Tip tres: no café después de las 2pm.", "duration": 5}
]
}
resp = requests.post(
"https://videora.4l3.org/v1/video/render",
json=payload,
headers={"Authorization": "Bearer TU_API_KEY"}
)
job = resp.json()
print(f"Job ID: {job['job_id']}")
print(f"Status: {job['status']}")
# Cuando status == "done" → descarga de job["output_url"]
JavaScript (Node.js)
const resp = await fetch("https://videora.4l3.org/v1/video/render", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer TU_API_KEY"
},
body: JSON.stringify({
title: "3 tips para dormir mejor",
aspect_ratio: "9:16",
voice: "es-MX-Jorge",
scenes: [
{ text: "Tip uno: evita pantallas.", duration: 5 },
{ text: "Tip dos: 18 grados.", duration: 5 },
{ text: "Tip tres: no café.", duration: 5 }
]
})
});
const job = await resp.json();
console.log(`Job: ${job.job_id}, Status: ${job.status}`);
cURL
curl -X POST https://videora.4l3.org/v1/video/render \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TU_API_KEY" \
-d '{
"title": "3 tips para dormir",
"aspect_ratio": "9:16",
"voice": "es-MX-Jorge",
"scenes": [
{"text": "Tip uno: evita pantallas.", "duration": 5},
{"text": "Tip dos: 18 grados.", "duration": 5}
]
}'
PHP
$ch = curl_init("https://videora.4l3.org/v1/video/render");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer TU_API_KEY"
],
CURLOPT_POSTFIELDS => json_encode([
"title" => "3 tips para dormir",
"aspect_ratio" => "9:16",
"voice" => "es-MX-Jorge",
"scenes" => [
["text" => "Tip uno.", "duration" => 5],
["text" => "Tip dos.", "duration" => 5]
]
])
]);
$result = json_decode(curl_exec($ch), true);
echo "Job: " . $result["job_id"];
Paso 3: Consulta el estado y descarga
Los videos se generan de forma asíncrona. Consulta el estado del job:
# Consultar estado
curl https://videora.4l3.org/v1/jobs/TU_JOB_ID
# Respuesta cuando está listo:
{
"job_id": "abc123",
"status": "done",
"output_url": "/output/abc123.mp4",
"duration_seconds": 15,
"created_at": "2026-06-05T10:30:00Z"
}
Cuando status sea "done", descarga el MP4 desde output_url.
Casos de uso reales
- Agencias de marketing — genera variantes de anuncios A/B en segundos cambiando solo el texto
- Creadores de contenido — convierte hilos de Twitter/X o newsletters en videos para Reels
- E-commerce — videos de producto automáticos desde tu catálogo CSV
- Educación — cápsulas de 60 segundos por lección, generadas desde el temario
- Noticias — resúmenes diarios narrados con imágenes relevantes
Configuraciones avanzadas
Aspectos de video
- 9:16 — vertical (TikTok, Reels, Shorts)
- 16:9 — horizontal (YouTube)
- 1:1 — cuadrado (Instagram feed)
Voces disponibles
- es-MX-Jorge — masculina, México
- es-MX-Dalia — femenina, México
- es-ES-Alvaro — masculina, España
- es-ES-Elvira — femenina, España
Genera tu primer video gratis
3 videos/mes sin tarjeta de crédito. Probar Videora →
Preguntas frecuentes
¿Necesito una API key?
El plan Free no requiere API key para los primeros 3 videos. Para Pro y Premium, obtén tu key en el panel de Videora.
¿Puedo agregar música de fondo?
Sí. Añade el campo "music": "upbeat" al JSON raíz. Las pistas de música están libres de derechos.
¿Los subtítulos se generan automáticamente?
Sí. Videora quema los subtítulos directamente en el video, sincronizados con la narración.
¿Puedo generar videos en lote?
Sí. Envía múltiples requests a /v1/video/render. Cada uno devuelve un job_id independiente que puedes consultar en paralelo.