← Back to guides

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, ssh and ffmpeg for 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

ItemCost
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 6000about 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 attemptsabout 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.

1

Account, SSH key, volume

  1. Create your account on runpod.io and top up your credit.
  2. 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 set RUNPOD_SSH_KEY=/path/to/key before running them.
  3. 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) and download_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.
2

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 /mcp in 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 writes DONE and 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) and download_wan21=true (talking clips): 1-3 minutes. With a volume, true only the first time, then false: 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).

3

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):

FolderFileRepository
diffusion_modelsWan2_1-InfiniTetalk-Single_fp16.safetensorsKijai/WanVideo_comfy (InfiniteTalk folder)
wav2vec2wav2vec2-chinese-base_fp16.safetensorsKijai/wav2vec2_safetensors
text_encodersumt5-xxl-enc-bf16.safetensorsKijai/WanVideo_comfy
vaeWan2_1_VAE_bf16.safetensorsKijai/WanVideo_comfy
loraslightx2v_I2V_14B_480p_cfg_step_distill_rank64_bf16.safetensorsKijai/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.

4

The scripts on your PC

Download them into one folder, all of them (they look for each other):

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.

5

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.

6

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.io proxy with -tt and the commands on stdin (lib_video.sh does 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.sh restarts it on 0.0.0.0 by 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_scaled versions 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.sh writes DONE and 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 rewriting clip.tsv with the it rows 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 SSH orchestrate.sh does not fail straight away: it gets as far as an empty PATCH output: and stops there.
  • ComfyUI dies and the template doesn't restart it: orchestrate.sh restarts 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.

Get started free ↗