Viral TikTok Video Machine

  1. Resumen general

Este workflow convierte automáticamente una foto + idea que envías a un bot de Telegram en un vídeo tipo UGC “talking head” (labios sincronizados) usando VEED/FAL + ElevenLabs, genera el guion y el audio con IA, crea una caption optimizada para TikTok, lo registra en Google Sheets y lo publica en múltiples redes vía Blotato (TikTok, IG, YouTube, etc.).
El disparador es el nodo “Telegram Trigger”, que se activa cuando envías un mensaje (idealmente, una foto con un caption que describe el tema del vídeo).
El flujo: extrae la foto y el tema, investiga tendencias con Perplexity, genera guion con GPT-4, sintetiza la voz con ElevenLabs, monta el vídeo con FAL/VEED, crea la caption, guarda todo en Sheets, te devuelve el vídeo por Telegram y lo envía a Blotato para publicación multicanal, actualizando el estado a “DONE” en la hoja.


  1. Mapa rápido de nodos

Nodo Tipo Descripción corta
Telegram Trigger Trigger (Telegram) Dispara el workflow al recibir mensaje/foto en el bot.
Workflow Configuration Set Configuración estática: API keys, voz, modelo Perplexity, etc.
Extract Photo and Theme Set Extrae photoUrl (file_id) y el theme del caption/texto.
Get Photo File from Telegram Telegram (file) Descarga el fichero de la foto desde Telegram (binario).
Build Public Image URL HTTP Request Sube la foto a tmpfiles.org y obtiene una URL pública.
Search Trends with Perplexity Perplexity (custom) Busca 3 tendencias virales relacionadas con el tema.
Generate Script with GPT-4 OpenAI (Chat) Genera un guion corto (máx. ~30 s) basado en tendencias + tema.
ElevenLabs Voice Synthesis HTTP Request Convierte el guion en audio usando ElevenLabs (voz clonada).
Convert .mpga to .mp3 Code Duplica el binario de audio y lo normaliza a .mp3 + audio/mpeg.
Upload Audio to Public URL HTTP Request Sube el MP3 a tmpfiles.org y obtiene URL pública de audio.
FAL.ai Video Generation HTTP Request Envía imagen + audio a FAL/VEED para generar el vídeo talking-head.
Wait for VEED Wait Espera 10 min antes de consultar el resultado del vídeo.
Download VEED Video HTTP Request Consulta el estado del job en FAL y obtiene la URL del vídeo final.
Generate Caption with GPT-4 OpenAI (Chat) Crea una caption de TikTok con hashtags virales para el vídeo.
Save to Google Sheets Google Sheets Guarda IDEA, CAPTION, URL IMAGE/AUDIO/VIDEO en una fila nueva.
Send a video Telegram Envía el vídeo generado al chat de Telegram original.
Upload Video to BLOTATO Blotato Sube el vídeo a Blotato para su distribución multicanal.
Tiktok / Instagram / Youtube / etc. Blotato Publican el vídeo en distintas redes sociales.
Merge1 Merge Fusiona las salidas de los nodos Blotato para continuar el flujo.
Update Status to “DONE” Google Sheets Marca en la hoja que el vídeo ha sido publicado (STATUS = DONE).
Step 1–5 / How It Works Sticky Note Documentación visual del flujo (no afectan a la ejecución).

  1. Explicación nodo por nodo (detalle)

3.1. Disparador y configuración inicial

🧩 Telegram Trigger (n8n-nodes-base.telegramTrigger)

🧩 Workflow Configuration (Set)

Mejora de seguridad: aquí estás guardando API keys en texto plano. En n8n es más seguro usar Credenciales y leerlas desde los nodos HTTP/IA en vez de un Set con claves visibles.

🧩 Extract Photo and Theme (Set)

Riesgos / mejoras

  • Si no hay foto (photoUrl == ''), el nodo de descarga de foto fallará: convendría añadir un nodo IF para controlar “¿hay foto?” y manejar el caso sin foto.

  • Buen uso del fallback del theme.

3.2. Obtención de imagen y URL pública

🧩 Get Photo File from Telegram (Telegram)

🧩 Build Public Image URL (HTTP Request)

Detalle técnico n8n
El HTTP Request normalmente reemplaza el JSON de entrada por la respuesta. Como estás referenciando $('Extract Photo and Theme') en otros nodos, no te afecta aquí, pero es bueno saber que el JSON de este item ahora es el de tmpfiles.org.

3.3. Investigación de tendencias y generación de guion

🧩 Search Trends with Perplexity (n8n-nodes-base.perplexity)

Mejora concreta

  • Si el usuario no manda caption pero sí texto (message.text), aquí no se hace fallback. Yo cambiaría a usar $('Extract Photo and Theme').first().json.theme para no duplicar lógica y beneficiarte del fallback ya definido.

🧩 Generate Script with GPT-4 (@n8n/n8n-nodes-langchain.openAi)

Mejora posible

  • Si quieres respetar el scriptMaxDuration del config, podrías interpolar ese valor en el prompt en vez de hardcodear “30 seconds”.

3.4. Síntesis de voz y normalización de audio

🧩 ElevenLabs Voice Synthesis (HTTP Request)

Riesgo

  • Dependes de que la estructura de salida del nodo GPT-4 sea siempre message.content. Si la versión del nodo cambia, podría romperse. Una alternativa es usar {{ $json.content }} si el nodo lo expone así, revisando la salida real en n8n.

🧩 Convert .mpga to .mp3 (Code)

Este nodo es un Code node (JavaScript). Código:

return items.map(item => {
const b = item.binary?.audio; // <-- tu propiedad binaria actual
if (!b) return item;

// clone bajo un nuevo nombre de propiedad
item.binary.audio_mp3 = {
…b,
fileName: (b.fileName || ‘audio.mp3’).replace(/\.mpga$/i, ‘.mp3’),
mimeType: ‘audio/mpeg’
};

// (opcional) mantener el original:
// delete item.binary.audio;

return item;
});

Mejoras del Code node

  • Podrías validar el tamaño del archivo (por límites de tmpfiles.org o FAL).

  • Si siempre recibes un audio/mpeg correcto de ElevenLabs, podrías saltarte este paso y renombrar solo en el upload.

🧩 Upload Audio to Public URL (HTTP Request)

3.5. Generación de vídeo con FAL / VEED

🧩 FAL.ai Video Generation (HTTP Request)

Detalle interesante
Aquí mezclas datos de un nodo anterior ($('Build Public Image URL')) con el JSON actual ($json.data.url). Es una técnica muy típica en n8n: usar $() para “saltar” a otro nodo y no depender de si el JSON actual arrastra ese dato.

🧩 Wait for VEED (Wait)

Mejora importante

  • Un wait fijo de 10 minutos es simple pero poco eficiente:

    • Si el vídeo se genera en 1–2 minutos, estás “parado” 8–9 min.

    • Sería mejor un bucle de polling: cada X segundos/minutos haces un HTTP GET y un IF status === "completed".
      O, si FAL tiene webhooks, usar el modo “Wait for webhook” del Wait node.

🧩 Download VEED Video (HTTP Request)

Falta manejador de error

  • Si statuscompleted (fallo, timeout, etc.), el flujo sigue como si nada. Lo ideal: nodo IF o Switch para verificar status y derivar a un flujo de error.

   3.6. Caption, registro en Sheets y envío

🧩 Generate Caption with GPT-4


🧩 Save to Google Sheets (Google Sheets – append)

Buena práctica

  • Estás guardando tanto las URLs como la idea original y la caption. Esto te permite tener trazabilidad completa de qué se publicó y con qué contenido.


🧩 Send a video (Telegram)


3.7. Publicación multicanal con Blotato y actualización de estado

🧩 Upload Video to BLOTATO


🧩 Nodos Tiktok / Linkedin / Facebook / Instagram / Twitter (X) / Youtube / Threads / Bluesky / Pinterest

Oportunidad de mejora

  • Aquí sería muy útil capturar el ID de cada post devolvido por Blotato (si lo hace) y guardarlo en la hoja o en otra tabla para tener trazabilidad por plataforma.


🧩 Merge1 (Merge)

Problema de diseño

  • Con chooseBranch, solo una de las plataformas (por ejemplo, TikTok) será la que pase el item al nodo siguiente.

  • Sin embargo, la ejecución de las otras ramas sí se realiza, simplemente no “pasas” sus items.

  • Si tu intención es: “cuando todas las plataformas terminen, entonces actualizo el status en Sheets”, este diseño no lo garantiza.

  • Para ese caso, podrías:

    • Usar un patrón con Merge by Index + configuración adecuada, o

    • No usar Merge, y simplemente actualizar el estado justo después de Save to Google Sheets (indicando que se ha lanzado la publicación, no necesariamente completado).


🧩 Update Status to “DONE” (Google Sheets – appendOrUpdate)

Detalle sutil

  • Estás usando como referencia $('Save to Google Sheets'), no el JSON actual, lo cual evita problemas si en las ramas de Blotato cambian el JSON.


3.8. Stickies (documentación)

Nodos:

Todos son nodos stickyNote, puramente documentativos:

agents ian - agents ian consultora experta en soluciones de inteligencia artificial para empresas de mediano y gran tamaño.

  1. Alternativas y mejoras

4.1. Claridad y estructura del flujo

4.2. Rendimiento y robustez

4.3. Seguridad

4.4. Diseño de publicación


  1. Recomendaciones prácticas y variaciones

5.1. Qué cambiaría yo para optimizar este workflow

  1. Centralizar tema y caption

    • Cambiar el prompt de Perplexity a usar {{ $('Extract Photo and Theme').first().json.theme }}.

    • De esta forma, da igual si el usuario escribe texto sin foto, caption, etc.

  2. Eliminar claves del Set

    • Mover elevenLabsApiKey, falApiKey y cualquier otra clave a Credenciales de n8n y dejar solo IDs de modelo/voz en Workflow Configuration.

  3. Mejorar la espera de VEED

    • Reemplazar Wait for VEED por:

      • HTTP Request (status)IF status == "completed":

        • Sí → Download VEED Video.

        • No → Wait 30s → volver a HTTP Request (status) mediante Loop.

  4. Validar presencia de foto y audio

    • Añadir un nodo IF después de Extract Photo and Theme:

      • Si photoUrl == '' → enviar mensaje al usuario por Telegram explicando que hace falta una foto.

    • Después de ElevenLabs, otro IF:

      • Si no hay binary.audio, parar y notificar error.

  5. Arreglar Merge1 según objetivo

    • Si solo te interesa saber que se ha lanzado publicación, puedes:

      • Mover Update Status to “DONE” justo después de Save to Google Sheets, sin pasar por Merge.

    • Si quieres indicador de “publicado en X redes”, diseñar un sistema de contadores o registrar estado por red.

5.2. Variaciones útiles del mismo flujo

  1. Versión “batch desde Google Sheets”

    • Trigger: Google Sheets Trigger o Schedule.

    • Por cada fila con STATUS = "PENDING":

      • Leer IDEA + URL_IMAGE (o solo texto).

      • Generar script+audio+vídeo.

      • Actualizar la misma fila con URL_VIDEO, CAPTION, STATUS="DONE".

    • Ideal para tener una lista de ideas predefinidas en la hoja.

  2. Versión “solo TikTok” (más simple)

    • Eliminar nodos Blotato y redes adicionales.

    • Publicar solo en TikTok (o incluso solo en Telegram + Sheets).

    • Perfecto para tener un flujo mínimo mientras pruebas la calidad del vídeo/voz/guion, antes de escalar a multicanal.

DOWNLOD ESTE IA AGENT

 

Leave a Reply

Your email address will not be published. Required fields are marked *