0006 — Avatar render economics: one GPU clip per deck¶
- Status: Accepted (backfilled 2026-09)
- Drivers: wan-s2v/sadtalker take minutes per slide on consumer GPUs (an RTX 3090 renders a short clip in ~10 min, cold model load dominating); decks have 10–30 slides
Decision¶
settings.avatar treats GPU renders as scarce:
reuse_clip(default false): render ONE head clip from slide 1's voice and loop it under every later slide — one GPU render per deck, approximate lip-sync. Intended for cartoon mascots, where "talking loop" beats "correct phonemes"; do not combine withfull_length: true(clip then matches only slide 1's narration length).slides("all" | N | [1, 5]): put heads only on chosen slides.reuse_clipinterplay: heads wanted but no narration audio → counted as a headless slide, never a silent stall.- ComfyUI hiccups between slides are survived and retried (commit 51b10a9);
transient GPU OOM retries with backoff (
oom_retries,oom_backoff), with a bounded polltimeoutper clip. - No-GPU alternatives ship for the common cases:
static(still image),puppet(loudness mouth-flap),precomputed(ready-made clips), and hosted D-ID as the BYO-key escape hatch.
Consequences¶
- A 20-slide mascot video costs the same GPU time as a 2-slide one when
reuse_clipis on — the setting that makes mascots practical. - Sync is visibly approximate on reused clips; humans/photo-real avatars should pay for per-slide renders instead.