Video ads with RunPod
Generate talking clips and scenes with Wan 2.2 and InfiniteTalk on your own RunPod pod, with the RoyLead scripts doing the heavy lifting. Costs, setup, pitfalls.
Updated on September 21, 2026
💡 Recommended if you use Claude Code. Claude runs the terminal,
sshandffmpegfor you: all you need is a RunPod account with a card on file and the setup below, once. You pay for the GPU by the hour instead of per clip, which pays off when you make several videos in a row. If you work in a chat (claude.ai, ChatGPT, Claude Desktop), which can't use a terminal, go with fal.ai: same models, pay per clip, nothing to install.
With RunPod you rent a GPU by the hour and run the open source models on it: Wan 2.2 for the silent scenes (image-to-video) and InfiniteTalk for the spoken lines with synced lips. The RoyLead scripts do the boring part: they wait for ComfyUI to be ready, set InfiniteTalk up, upload photos and voices, generate the clips one after another, download them and edit the final video.
What it costs
| Item | Cost |
|---|---|
| RTX PRO 6000 GPU (96 GB), Secure Cloud | $2.09 an hour, only while it's on |
| RTX 5090 Community GPU | $0.69 an hour, but 62 GB of RAM: with the full models it can run out of memory |
| Network volume (optional, not recommended) | $14 a month for 200 GB, always |
| One silent scene or one talking clip on the PRO 6000 | about 2 minutes, about $0.07 |
| One 8-scene video (pod just started) | about 25 minutes, less than $1 |
| 60 s short, 12 shots by 3 attempts | about 2 hours of GPU |
Delete the pod at the end of the session: a pod that is stopped but not deleted keeps costing money. Without a volume there is nothing left to pay for.
Account, SSH key, volume
- Create your account on runpod.io and top up your credit.
- Under Settings → SSH Public Keys register your public key (
~/.ssh/id_ed25519.pub; if you don't have one:ssh-keygen -t ed25519). The scripts use~/.ssh/id_ed25519; for a different key setRUNPOD_SSH_KEY=/path/to/keybefore running them. - The network volume is optional, and often you are better off without it. A 200 GB
Network Volume holds the models (about 176 GB) and saves you from downloading them again,
but it costs $14 a month and above all it chains you to its data center: the pod is
necessarily created there, and if the right GPU is missing in that data center you are stuck.
Without a volume the template downloads the models by itself at startup: with
download_wan22=true(silent scenes) anddownload_wan21=true(talking clips) it takes 1-3 minutes, a few cents. The InfiniteTalk files, however, the template does not download: if you need talking clips, add them as in step 3 (a few minutes). This way you take the GPU in whichever data center has it. Verified on 2026-09-21 on a pod without a volume: silent scenes, talking clips and images. The volume only pays off if you generate every day or have your own models: in that case put it where the RTX PRO 6000 is available most often, never in a data center that only has 32 GB GPUs.
The pod
💡 Let Claude manage it. If you connect your RunPod account to Claude Code, Claude creates the pod, stops it as soon as the clips are downloaded and deletes it (only with your confirmation) on its own: no pods left running by mistake. RunPod's official connection, from the terminal, with your RunPod API key (Settings → API Keys):
claude mcp add --transport http runpod -s user https://mcp.getrunpod.io/ --header "Authorization: Bearer <your API key>", then/mcpin Claude Code to reload. Full instructions and alternatives: github.com/runpod/runpod-mcp. Without the connection, you create the pod yourself as below.
Recommended template: "One Click - ComfyUI Wan2.1 - Wan 2.2" (by Hearmeman, id
758dsjwiqz). When you create it:
- GPU: RTX PRO 6000 Blackwell (96 GB) in Secure Cloud. With less RAM the full models (28 GB each) push the pod out of memory when the second one loads.
- The GPU must be a Blackwell, not an older card. If the PRO 6000 is not available, fall
back to another Blackwell in the same data center (the 32 GB RTX PRO 4500 costs $0.72 an hour
but handles silent scenes only: talking clips run out of memory even at 7 seconds). On earlier architectures — A100, 4090, 5090 — the silent Wan scenes come out
fine, but InfiniteTalk produces one frame and then black: the talking model goes to NaN
and raises no error at all, neither in the ComfyUI log nor in
orchestrate.sh, which writesDONEand downloads a black clip. You only notice by opening the file. - Disk: none (recommended). If you have a network volume, mount it on
/workspace. - Template variables: without a volume, on every pod,
download_wan22=true(silent scenes) anddownload_wan21=true(talking clips): 1-3 minutes. With a volume,trueonly the first time, thenfalse: the models are already there and downloading them again fills it up. - Port 8188: that's ComfyUI in the browser, at
https://<pod_id>-8188.proxy.runpod.net.
From the pod's page, under Connect, grab the two things the scripts need: the pod id
(it's in the URL) and the proxy SSH user (<pod_id>-<code>@ssh.runpod.io).
InfiniteTalk (only for the talking clips)
One face per clip. InfiniteTalk moves the mouth of every face it finds in the frame, with the same audio — including background faces and those reflected in a mirror. Two people in shot become two people saying the same line together. Split dialogue scenes into two clips, one per line, and keep whoever is not speaking with their back turned, blurred or outside the frame.
The template (v29) does not download these files: check with
ls /workspace/ComfyUI/models/diffusion_models | grep -i infinitetalk, and if they are missing
add them in /workspace/ComfyUI/models/ (from Hugging Face; without a volume, on every new pod):
| Folder | File | Repository |
|---|---|---|
diffusion_models | Wan2_1-InfiniTetalk-Single_fp16.safetensors | Kijai/WanVideo_comfy (InfiniteTalk folder) |
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 (Lightx2v folder) |
The base model wan2.1_i2v_480p_14B_bf16.safetensors is already downloaded by the template.
💡 Space. A "200 GB" volume really holds about 186. With everything installed you have about 20 GB left for the videos: if the downloads stop without an error, it's full. The file
wan2.1_t2v_14B_bf16.safetensors(27 GB, Wan from text) isn't needed: you can delete it.
The two other things InfiniteTalk requires (a folder link and a patch for the transformers 5
library) are handled by orchestrate.sh itself on every new pod, because they live on the
container's disk and are lost when the pod is deleted.
The scripts on your PC
Download them into one folder, all of them (they look for each other):
- lib_video.sh ↗ — the shared checks
- orchestrate.sh ↗ — generates the clips on the pod
- gen_video.py ↗ — one clip (used by orchestrate)
- fix_wav2vec_tf5.py ↗ — the patch for InfiniteTalk (applied by orchestrate)
- monta_video.sh ↗ — edits the talking video
- monta_short.sh ↗ — edits the shorts without voice
- examples: clip.tsv.esempio ↗, montaggio.tsv.esempio ↗, chiusura.txt.esempio ↗
From the terminal:
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
You also need ffmpeg (with libx264 and libass), ffprobe, python3, curl, ssh.
Don't edit the scripts: they read everything from data files in the video's folder.
A video's folder
my-video/
clip.tsv the jobs: name, type (it = talking, wan = silent scene), image, line or frames, prompt
immagini/ the starting frames (one per shot, generated with ChatGPT from the product photos)
audio/battute/ the mp3 lines, one per talking clip
montaggio.tsv the order of the clips in the video, with the mp3 to put under the silent scenes
montaggio/sottotitoli.ass the subtitles (on Meta people watch without sound)
chiusura.txt 3 lines: offer, line 2, line 3 (optional)
prodotto.png product photo for the end card (optional, goes with chiusura.txt)
The voices are made with ElevenLabs, one whole text per character with [long pause] between
the lines, then cut on the pauses into one mp3 per line (ffmpeg -af silencedetect).
If you use the launch playbook with Claude Code, it prepares the screenplay, clip.tsv,
montaggio.tsv, the subtitles and the voice cuts for you.
Generate and edit
# start the pod, take pod_id and the ssh user from "Connect", then:
nohup ./orchestrate.sh <pod_id> <ssh_user> ~/my-video > ~/my-video/orchestrate.log 2>&1 &
tail -f ~/my-video/orchestrate.log # READY, MODELS, UPLOADED, then one DONE per clip, ALL_DONE
The clips land in my-video/clip/. Hands holding objects go wrong often: count on 2-3 attempts
per scene (change the seed by running it again, or the prompt). Times measured on the RTX PRO
6000: first clip 5-7 minutes (it loads the models), then 1-4 minutes each.
./monta_video.sh ~/my-video # → my-video/video-finale.mp4 (1080x1920, 30 fps, -16 LUFS)
./monta_short.sh ~/my-video # → my-video/short-<name>.mp4, one per clip, with the graphics on top
monta_video.sh stops by itself if the voice has gaps longer than 1.5 seconds: better an error
now than a silent video online. The final file is written to the system disk and then copied: on a
Windows disk mounted in WSL the merge can stop with "No space left on device".
Then delete the pod.
Pitfalls already hit
- ComfyUI answers 403 (error 1010) to calls without a browser User-Agent: the scripts send
one; if you use curl by hand, add
-A "Mozilla/5.0". - Direct SSH refused: you go through the
ssh.runpod.ioproxy with-ttand the commands on stdin (lib_video.shdoes it). - ComfyUI won't start on some Community machines (steady 502, "could not bind on any address"
in the log): the machine has no IPv6.
orchestrate.shrestarts it on0.0.0.0by itself. - Out of memory with the RTX 5090: 62 GB of RAM aren't enough for two full 28 GB models.
Either a GPU with more RAM, or the
fp8_scaledversions of the models. - GPU not available when you create the pod: the fallback that worked is an RTX PRO 6000 Max-Q
in Community without a network volume, with
download_wan22=true(it downloads again in 8 minutes). Watch where the network volume lives: the pod is necessarily created in its data center, and the PRO 6000 may be missing there even if the catalog lists it as available elsewhere. - Black talking clips (one frame and then dark, the audio is there): the GPU is not a
Blackwell. It happened on an A100 80 GB, without a single error in the logs —
orchestrate.shwritesDONEand downloads a black clip. Before editing, check that the talking clips are not dark:ffmpeg -i clip/shot-01.mp4 -vf "signalstats,metadata=print:key=lavfi.signalstats.YAVG" -f null -— if YAVG stays around 16 after the first frame, they are black. Regenerate them on a Blackwell by rewritingclip.tsvwith theitrows only: the scenes already downloaded stay untouched. - The SSH key must be registered on the account (Settings → SSH Public Keys) before you
create the pod: keys added later do not reach pods that are already running, and the proxy
answers
Permission denied (publickey). Without SSHorchestrate.shdoes not fail straight away: it gets as far as an emptyPATCH output:and stops there. - ComfyUI dies and the template doesn't restart it:
orchestrate.shrestarts it; by hand:python3 /ComfyUI/main.py --listen 0.0.0.0 --use-sage-attention --extra-model-paths-config /ComfyUI/extra_model_paths.yaml.
Meta's rules for AI videos
- In Ads Manager you have to declare that the content is AI-generated.
- The character introduces themselves as a spokesperson, never as a "real customer": Meta considers that deceptive.
- Always add subtitles: most people watch without sound.
Ready to put this into practice?
Create your RoyLead account and start in minutes.