Back to guides

Video ads with RunPod (for experts)

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 16, 2026


⚠️ For experts. You need to be comfortable with a terminal (Linux, macOS or WSL on Windows), with ssh and ffmpeg, and you need a RunPod account with a card on file. If that doesn't sound like you, use fal.ai: same models, pay per clip, nothing to install. That's the route the launch playbook suggests by default.

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
200 GB network volume with the models$14 a month, always
One run of 6 clips (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. The volume stays, with the models on it.

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. Create a 200 GB Network Volume in an EU data center (e.g. EU-RO-1). The volume holds the models (about 176 GB): you download them once. The volume's data center decides where you will be able to create pods.
2

The pod

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.
  • Disk: your network volume, mounted on /workspace.
  • Template variables: the first time download_wan22=true and download_wan21=true (downloads the models onto the volume, 8-10 minutes). On later pods set them to false: the models are already on the volume 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)

The template doesn't include InfiniteTalk. Once and for all, on the volume, in /workspace/ComfyUI/models/, add these files (from Hugging Face):

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).
  • 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