Video ads con RunPod
Generare clip parlate e scene con Wan 2.2 e InfiniteTalk sul tuo pod RunPod, con gli script RoyLead che fanno il grosso del lavoro. Costi, setup, trappole.
Aggiornata il 21 settembre 2026
💡 Consigliata se usi Claude Code. Terminale,
ssheffmpegli usa Claude al posto tuo: a te servono solo un account RunPod con la carta collegata e il setup qui sotto, una volta. Paghi la GPU a ore invece che a clip, e con più video di fila conviene. Se lavori in chat (claude.ai, ChatGPT, Claude Desktop), che il terminale non lo possono usare, scegli fal.ai: stessi modelli, si paga a clip, niente da installare.
Con RunPod affitti una GPU a ore e ci fai girare i modelli open source: Wan 2.2 per le scene mute (image-to-video) e InfiniteTalk per le battute parlate con labiale sincronizzato. Gli script RoyLead fanno la parte noiosa: aspettano che ComfyUI sia pronto, sistemano InfiniteTalk, caricano foto e voci, generano le clip in fila, le scaricano e montano il video finale.
Quanto costa
| Voce | Costo |
|---|---|
| GPU RTX PRO 6000 (96 GB), Secure Cloud | 2,09 $ l'ora, solo da accesa |
| GPU RTX 5090 Community | 0,69 $ l'ora, ma 62 GB di RAM: con i modelli pieni può andare fuori memoria |
| Disco di rete (facoltativo, sconsigliato) | 14 $ al mese per 200 GB, sempre |
| Una scena muta o una clip parlata sulla PRO 6000 | circa 2 minuti, circa 0,07 $ |
| Un video da 8 scene (pod appena acceso) | circa 25 minuti, meno di 1 $ |
| Corto da 60 s, 12 shot per 3 tentativi | circa 2 ore di GPU |
Il pod si cancella a fine sessione: un pod fermo ma non cancellato continua a costare. Senza disco non resta niente da pagare.
Account, chiave SSH, disco
- Crea l'account su runpod.io e carica credito.
- In Settings → SSH Public Keys registra la tua chiave pubblica (
~/.ssh/id_ed25519.pub; se non ce l'hai:ssh-keygen -t ed25519). Gli script usano~/.ssh/id_ed25519; per una chiave diversa impostaRUNPOD_SSH_KEY=/percorso/chiaveprima di lanciarli. - Il disco di rete è facoltativo, e spesso conviene non averlo. Un Network Volume da
200 GB tiene i modelli (circa 176 GB) e te li fa scaricare una volta sola, ma costa 14 $ al
mese e soprattutto ti incatena al suo data center: il pod nasce per forza lì, e se in
quel data center la GPU giusta non c'è, sei bloccato.
Senza disco il template scarica da solo i modelli all'accensione: con
download_wan22=true(scene mute) edownload_wan21=true(clip parlate) ci mette 1-3 minuti, pochi centesimi. I file di InfiniteTalk invece il template non li scarica: se ti servono clip parlate, aggiungili come al passo 3 (pochi minuti). Così prendi la GPU in qualunque data center dove c'è. Verificato il 2026-09-21 su pod senza disco: scene mute, clip parlate e immagini. Il disco conviene solo se generi tutti i giorni o hai modelli tuoi: in quel caso mettilo dove la RTX PRO 6000 c'è più spesso, mai in un data center che ha solo GPU da 32 GB.
Il pod
💡 Fallo gestire a Claude. Se colleghi il tuo account RunPod a Claude Code, il pod lo crea, lo spegne appena le clip sono scaricate e lo cancella (solo con la tua conferma) Claude da solo: niente pod dimenticati accesi. Il collegamento ufficiale di RunPod, da terminale, con la tua API key di RunPod (Settings → API Keys):
claude mcp add --transport http runpod -s user https://mcp.getrunpod.io/ --header "Authorization: Bearer <la tua API key>", poi/mcpin Claude Code per ricaricare. Istruzioni complete e alternative: github.com/runpod/runpod-mcp. Senza collegamento, il pod lo crei tu come qui sotto.
Template consigliato: "One Click - ComfyUI Wan2.1 - Wan 2.2" (autore Hearmeman, id
758dsjwiqz). Alla creazione:
- GPU: RTX PRO 6000 Blackwell (96 GB) in Secure Cloud. Con meno RAM i modelli pieni (28 GB l'uno) mandano il pod fuori memoria al caricamento del secondo.
- La GPU dev'essere Blackwell, non una scheda più vecchia. Se la PRO 6000 non è
disponibile, ripiega su un'altra Blackwell dello stesso data center (RTX PRO 4500 da 32 GB
costa 0,72 $ l'ora, ma regge solo le scene mute: le clip parlate vanno fuori memoria
anche da 7 secondi). Su architetture precedenti — A100, 4090, 5090 — le scene mute
con Wan vengono benissimo, ma InfiniteTalk produce un fotogramma e poi nero: il modello
parlato va in NaN e non dà nessun errore, né nel log di ComfyUI né in
orchestrate.sh, che scriveDONEe scarica una clip nera. Te ne accorgi solo aprendo il file. - Disco: nessuno (consigliato). Se hai un network volume, montalo su
/workspace. - Variabili del template: senza disco, a ogni pod,
download_wan22=true(scene mute) edownload_wan21=true(clip parlate): 1-3 minuti. Con un disco,truesolo la prima volta, poifalse: i modelli sono già lì e riscaricarli lo riempie. - Porta 8188: è ComfyUI nel browser, all'indirizzo
https://<pod_id>-8188.proxy.runpod.net.
Dalla scheda del pod, in Connect, prendi due cose che servono agli script: il pod id
(è nell'URL) e l'utente SSH del proxy (<pod_id>-<codice>@ssh.runpod.io).
InfiniteTalk (solo per le clip parlate)
Un volto solo per clip. InfiniteTalk muove la bocca a tutte le facce che trova nel fotogramma, con lo stesso audio — compresi i volti di sfondo e quelli riflessi in uno specchio. Due persone inquadrate diventano due che dicono la stessa frase insieme. Le scene di dialogo si spezzano in due clip, una per battuta, e chi non parla resta di spalle, sfocato o fuori dal bordo.
Il template (v29) non scarica questi file: controlla con
ls /workspace/ComfyUI/models/diffusion_models | grep -i infinitetalk, e se mancano aggiungili
in /workspace/ComfyUI/models/ (da Hugging Face; senza disco, a ogni pod nuovo):
| Cartella | File | Repository |
|---|---|---|
diffusion_models | Wan2_1-InfiniTetalk-Single_fp16.safetensors | Kijai/WanVideo_comfy (cartella InfiniteTalk) |
wav2vec2 | wav2vec2-chinese-base_fp16.safetensors | Kijai/wav2vec2_safetensors |
text_encoders | umt5-xxl-enc-bf16.safetensors | Kijai/WanVideo_comfy |
vae | Wan2_1_VAE_bf16.safetensors | Kijai/WanVideo_comfy |
loras | lightx2v_I2V_14B_480p_cfg_step_distill_rank64_bf16.safetensors | Kijai/WanVideo_comfy (cartella Lightx2v) |
Il modello base wan2.1_i2v_480p_14B_bf16.safetensors lo scarica già il template.
💡 Spazio. Un disco da "200 GB" ne contiene circa 186 veri. Con tutto installato restano circa 20 GB per i video: se i download si fermano senza errori, è pieno. Il file
wan2.1_t2v_14B_bf16.safetensors(27 GB, Wan da testo) non serve: si può cancellare.
Le altre due cose che InfiniteTalk richiede (un collegamento di cartella e una patch per la
libreria transformers 5) le fa orchestrate.sh da solo a ogni pod nuovo, perché stanno sul
disco del container e si perdono quando il pod viene cancellato.
Gli script sul tuo PC
Scaricali in una cartella, tutti insieme (si cercano a vicenda):
- lib_video.sh ↗ — i controlli condivisi
- orchestrate.sh ↗ — genera le clip sul pod
- gen_video.py ↗ — una clip (lo usa orchestrate)
- fix_wav2vec_tf5.py ↗ — la patch per InfiniteTalk (la applica orchestrate)
- monta_video.sh ↗ — monta il video parlato
- monta_short.sh ↗ — monta gli short senza voce
- esempi: clip.tsv.esempio ↗, montaggio.tsv.esempio ↗, chiusura.txt.esempio ↗
Da terminale:
mkdir -p ~/video-tools && cd ~/video-tools
for f in lib_video.sh orchestrate.sh gen_video.py fix_wav2vec_tf5.py monta_video.sh monta_short.sh clip.tsv.esempio montaggio.tsv.esempio chiusura.txt.esempio; do
curl -fsSLO "https://app.roylead.com/supporto/video-tools/$f"
done
chmod +x *.sh
Servono anche ffmpeg (con libx264 e libass), ffprobe, python3, curl, ssh.
Gli script non si modificano: leggono tutto da file di dati nella cartella del video.
La cartella di un video
mio-video/
clip.tsv i lavori: nome, tipo (it = parlata, wan = scena muta), immagine, battuta o fotogrammi, prompt
immagini/ i fotogrammi di partenza (uno per shot, generati con ChatGPT dalle foto del prodotto)
audio/battute/ le battute mp3, una per clip parlata
montaggio.tsv l'ordine delle clip nel video, con l'mp3 da mettere sotto le scene mute
montaggio/sottotitoli.ass i sottotitoli (su Meta si guarda senza audio)
chiusura.txt 3 righe: offerta, riga 2, riga 3 (opzionale)
prodotto.png foto del prodotto per la chiusura (opzionale, va con chiusura.txt)
Le voci si fanno con ElevenLabs, un testo intero per personaggio con [long pause] tra le
battute, poi si tagliano sulle pause in un mp3 per battuta (ffmpeg -af silencedetect).
Se usi il playbook del lancio con Claude Code, sceneggiatura, clip.tsv, montaggio.tsv,
sottotitoli e tagli delle voci li prepara lui.
Generare e montare
# accendi il pod, prendi pod_id e utente ssh da "Connect", poi:
nohup ./orchestrate.sh <pod_id> <utente_ssh> ~/mio-video > ~/mio-video/orchestrate.log 2>&1 &
tail -f ~/mio-video/orchestrate.log # READY, MODELS, UPLOADED, poi un DONE per clip, ALL_DONE
Le clip arrivano in mio-video/clip/. Le mani con gli oggetti sbagliano spesso: metti in conto
2-3 tentativi per scena (cambia il seme rilanciando, o il prompt). Tempi misurati sulla RTX PRO
6000: prima clip 5-7 minuti (carica i modelli), poi 1-4 minuti l'una.
./monta_video.sh ~/mio-video # → mio-video/video-finale.mp4 (1080x1920, 30 fps, -16 LUFS)
./monta_short.sh ~/mio-video # → mio-video/short-<nome>.mp4, uno per clip, con la grafica sopra
monta_video.sh si ferma da solo se la voce ha buchi oltre 1,5 secondi: meglio un errore adesso
che un video muto online. Il file finale si scrive sul disco di sistema e poi si copia: su un
disco Windows montato in WSL l'unione può fermarsi con "No space left on device".
Poi cancella il pod.
Trappole già incontrate
- ComfyUI risponde 403 (error 1010) alle chiamate senza User-Agent da browser: gli script lo
mandano; se usi curl a mano, aggiungi
-A "Mozilla/5.0". - SSH diretto rifiutato: si passa dal proxy
ssh.runpod.iocon-tte i comandi da stdin (lo falib_video.sh). - ComfyUI non parte su alcune macchine Community (502 fisso, nel log "could not bind on any
address"): la macchina non ha IPv6.
orchestrate.shlo rilancia da solo su0.0.0.0. - Fuori memoria con la RTX 5090: 62 GB di RAM non bastano per due modelli pieni da 28 GB. O
una GPU con più RAM, o le versioni
fp8_scaleddei modelli. - GPU non disponibile al momento della creazione: ripiego che ha funzionato, RTX PRO 6000
Max-Q in Community senza disco di rete, con
download_wan22=true(riscarica in 8 minuti). Attenzione a dove sta il disco di rete: il pod nasce per forza nel suo data center, e lì la PRO 6000 può non esserci anche se il catalogo la dà disponibile altrove. - Clip parlate nere (un fotogramma e poi buio, l'audio c'è): la GPU non è Blackwell. È
successo su A100 80 GB, senza un solo errore nei log —
orchestrate.shscriveDONEe scarica una clip nera. Prima di montare, controlla che le parlate non siano buie:ffmpeg -i clip/shot-01.mp4 -vf "signalstats,metadata=print:key=lavfi.signalstats.YAVG" -f null -— se dopo il primo fotogramma YAVG resta intorno a 16, sono nere. Si rigenerano su una Blackwell riscrivendoclip.tsvcon le sole righeit: le scene già scaricate non si toccano. - La chiave SSH dev'essere registrata sull'account (Settings → SSH Public Keys) prima di
creare il pod: le chiavi aggiunte dopo non entrano nei pod già accesi, e il proxy risponde
Permission denied (publickey). Senza SSHorchestrate.shnon fallisce subito: arriva fino aPATCH output:vuoto e si ferma lì. - ComfyUI muore e il template non lo riavvia:
orchestrate.shlo rilancia; a mano:python3 /ComfyUI/main.py --listen 0.0.0.0 --use-sage-attention --extra-model-paths-config /ComfyUI/extra_model_paths.yaml.
Regole Meta per i video con AI
- In Ads Manager va dichiarato che il contenuto è generato con AI.
- Il personaggio si presenta come portavoce, mai come "cliente vero": Meta lo considera ingannevole.
- Sottotitoli sempre: la maggior parte guarda senza audio.
Pronto a metterlo in pratica?
Crea il tuo account RoyLead e parti in pochi minuti.