SadTalker Still Mode — ComfyUI evidence
Tested: 4 October 2026
GPU: NVIDIA GeForce RTX 4090 · 24 GB VRAM · driver 580.95.05
Worker: Python 3.10.21 · PyTorch 2.1.2+cu121 · CUDA runtime 12.1
SadTalker: cd4c0465ae0b54a6f85af57f5c65fec9fe23e7f8
Custom node: 4c231660fea4e1f2748d03dcf38ea438fd9f884f
ComfyUI: 73c9bad4d21e7addbe1d13bc92eee0f1431b017d

Main comparison: size 512, crop, GFPGAN, batch 2, expression scale 1.0, pose style 0.
One warm-up per mode, then three measured OFF/ON pairs. Only still changes.
OFF median: 117.397 seconds
ON median: 117.677 seconds
Timing uses ComfyUI execution_start to execution_success timestamps, including
input loading/serialization, worker startup, inference and export. Queue waiting,
installation, model downloads and warm-ups are excluded.

CPU threads: OMP_NUM_THREADS, MKL_NUM_THREADS, OPENBLAS_NUM_THREADS,
NUMEXPR_NUM_THREADS = 4, set only in a temporary SadTalker worker launcher.
The same limits were used for both modes. worker-thread-limits.sh is the exact
launcher content. On Linux with the guide's worker at /opt/sadtalker-venv, save it
as /opt/sadtalker-venv/bin/python-still-test and chmod +x that path. Back up the
custom node's config.json, temporarily point its python field at the launcher,
then restore the original python path after timing tests. If the worker lives
elsewhere, adjust the launcher's last line. The workflow JSON does not set
CPU thread limits.

Fresh runs: unique filenames containing identical source bytes changed the
ComfyUI input signature. Each output folder is unique, and histories were checked
for a cached SadTalker node. The node does not expose a seed. Expressions and
blinks may differ independently of the pose-mode switch.

Supplemental comparison: one OFF and one ON render with preprocess full and all
other settings matched. These are not timing medians or part of the main sample.

The crop and full comparison videos align frame timelines and use OFF's audio
track once, avoiding doubled sound. Labeled poster frames come from 4 seconds.
The crop example uses the first measured pair, not selected best-case outputs.

Two additional UI renders were used for the real ComfyUI screenshots and are
excluded from the six measured runs. Screenshots show working inline players;
the site comparison uses the measured API-rendered clips.

Use still-mode-comparison.json in the ComfyUI GUI. The stable API workflows
still-off-api.json and still-on-api.json reference the inputs/ filenames.
Raw per-run API graphs reference uniquely named copies. To replay a raw graph,
copy the supplied portrait/audio into ComfyUI/input under those graph filenames,
or update its LoadImage/LoadAudio filenames to the supplied stable names.

Scope: one portrait, one narration, one rented machine. Visual observations are
not a scored lip-sync, identity or artifact-quality test. No general speed claim
is supported by this small sample.
