Short narrati, pubblicati in automatico
Scegli la nicchia: arriva uno short narrato e sottotitolato, in bozza su TikTok e pubblicato su Instagram.
- Python
- Flask
- OpenRouter
- Edge TTS
- faster-whisper
- FFmpeg
- TikTok API
- Postiz
Cosa produce
Video veri generati dal sistema.
- 13video narrati dal motore interno, da 24 a 70 secondi l'uno
- 6 + 1bozze TikTok caricate e post Instagram creato end-to-end in un test
- 33video generati dal pannello nei primi otto giorni, con entrambi i motori
Una nicchia dentro, uno short narrato fuori
Scegli la nicchia: scrive il copione, lo doppia in italiano, dà il tempo a ogni parola, copre la voce con clip stock e manda l'MP4 in bozza su TikTok e su Instagram.
Tocca un blocco per vedere cosa fa.
- Ingresso
- AI
- Logica
- Uscita
Ingresso
Pannello
Flask sulla porta 5000: scegli la nicchia, scrivi un argomento o lascialo vuoto, lancia uno o N video di fila; job in thread in background, stato ogni 1,5 s.
- Flask
- JavaScript
Passa a Copione
AI
Copione
Modello gratuito da 550B su OpenRouter; il profilo di nicchia fissa gancio e struttura; prima frase = gancio, 6-8 frasi; riscritto più lungo se la voce è sotto i 30 s.
- OpenRouter
Riceve da PannelloPassa a Voce italiana, Clip stock
AI
Voce italiana
Edge TTS con una di quattro voci neurali italiane, scelta a caso per video; la durata della voce decide quella del video.
- Edge TTS
Riceve da CopionePassa a Sottotitoli a tempo, Montaggio finale
Logica
Clip stock
6 termini di ricerca in inglese dall'LLM più termini fissi di nicchia; clip verticali dalle API Pexels e Pixabay, fino a 5 s l'una, finché la voce è coperta.
- Pexels API
- Pixabay API
Riceve da CopionePassa a Montaggio finale
AI
Sottotitoli a tempo
faster-whisper (small, int8, CPU) trascrive la voce con i tempi di ogni parola; le parole vanno a coppie in un file ASS, Arial Black 70 con contorno.
- faster-whisper
- ASS
Riceve da Voce italianaPassa a Montaggio finale
Logica
Montaggio finale
Crop a 1080×1920, unione delle clip, sottotitoli impressi, voce su un tappeto di accordi sintetizzato (niente musica con licenza), limiter, H.264 + AAC.
- FFmpeg
Riceve da Voce italiana, Clip stock, Sottotitoli a tempoPassa a Bozza TikTok, Post Instagram
Uscita
Bozza TikTok
Mio client della Content Posting API, scope user.info.basic + video.upload; OAuth via tunnel Cloudflare, token rinnovato a ~23 h; il video aspetta in inbox l'approvazione.
- TikTok API
- Cloudflare Tunnel
Riceve da Montaggio finalePassa a Notifica
Uscita
Post Instagram
Postiz self-hosted in Docker: trova il canale, carica, pubblica subito. L'API pubblica sta sotto /api/public/v1, non al percorso dei doc della versione hosted.
- Postiz
- Docker
Riceve da Montaggio finale
Uscita
Notifica
Interroga lo stato su TikTok (fino a 8 × 15 s) e manda la notifica via ntfy solo quando la bozza è davvero in inbox; altrimenti invia un avviso.
- ntfy
Riceve da Bozza TikTok
Il problema
Una pagina narrata (oroscopi, abitudini col denaro, curiosità) ha bisogno quasi ogni giorno di un video nuovo da 30-70 secondi: copione, voce, clip coerenti, sottotitoli a tempo con le parole, poi il caricamento su ogni piattaforma. Il generatore open source che avevo provato girava come app separata nel suo ambiente, e la pubblicazione restava a mano.
Cosa ho costruito
- Ho scritto un profilo di prompt per ogni nicchia (stile del gancio, struttura, temi vietati come i consigli d'investimento) e un passaggio LLM che scrive il copione in italiano, propone l'argomento se il campo è vuoto e lo riscrive più lungo se la voce dura meno di 30 secondi.
- Ho dato la voce con Edge TTS e sincronizzato i sottotitoli trascrivendo l'audio con faster-whisper, così le coppie di parole compaiono esattamente quando vengono dette; li imprimo nel video come sottotitoli ASS stilizzati.
- Ho preso le clip dalle API di Pexels e Pixabay con termini di ricerca scritti dall'LLM più termini fissi per nicchia; l'astrologia usa solo il suo pool visivo, così un oroscopo sul lavoro non finisce mai in un ufficio.
- Ho messo i due motori video dietro un pannello Flask con job in background, un lock per motore, generazioni in serie e uno storico, aperto da un'icona sul desktop senza finestra di console.
- Pubblico dallo stesso job: bozze su TikTok con un mio client della Content Posting API, Instagram tramite Postiz self-hosted e una notifica sul telefono via ntfy quando TikTok conferma la bozza.
La parte difficile
L'accesso a TikTok. Il connettore di Postiz chiedeva sei scope, tra cui video.publish, che richiede un audit dell'app: TikTok rifiutava persino il mio account. Ho scritto un client OAuth minimo con soli user.info.basic e video.upload, dietro un tunnel Cloudflare perché TikTok non accetta localhost; carica il video nell'inbox come bozza e controlla lo stato prima di notificare.
Risultato
Il motore ha prodotto 13 video narrati e il pannello 33 video, con entrambi i motori, nei primi otto giorni. In un test end-to-end l'app ha caricato 6 bozze su TikTok (3 erano prove) e creato 1 post Instagram tramite Postiz.
Il mio ruolo
Progetto in solitaria. Ho scelto le nicchie, scritto le regole dei prompt e il flusso con revisione prima della pubblicazione, configurato l'app sviluppatore TikTok, Docker, Postiz e il tunnel, e provato ogni passaggio; il Python e il pannello li ha scritti in gran parte Claude Code.