PersonaLive Photo Sampler
Make a Still Portrait Move — PersonaLive Photo Sampler, the Honest Version
- pipe
- ref_image
- driving_image
- generated_image
One photo, someone else's motion
Feed this node a still portrait and a picture of anyone else talking, nodding, or shifting their gaze, and it re-renders your portrait so it performs that same motion while keeping your subject's identity. That's the whole trick: the ref_image keeps the face, the driving_image donates the performance. This is the "photo sampler" from okdalto/ComfyUI-PersonaLive, the ComfyUI wrapper around GVCLab's PersonaLive paper (arXiv 2512.11253), and it's the node that actually does the animating.
One reality check before you get excited: "Live Streaming" is in the model's name, but the real-time part is aspirational on consumer hardware. The demos were run on an H100, and people who got it working on 4090s and 3090s report it runs but lags noticeably. Use it as an offline face-reenactment tool and you'll be happy; expect a live VTuber out of it and you'll be disappointed.
Why reach for it
PersonaLive sits in the AnimateAnyone family - a pose-driven, diffusion-based reenactment pipeline - but with a twist. Instead of the old warp-and-blend approach you get from a fast tool like LivePortrait, this one re-renders every frame: it feeds your reference through a frozen SD 1.5 image-variations UNet that's been inflated into a 3D UNet with AnimateDiff-style temporal and motion modules, plus a LivePortrait-style motion extractor and a pose guider. Identity is held by a reference UNet with mutual self-attention. The payoff is much stronger identity and expression fidelity than a warp-based tool; the cost is that you're running a diffusion model per frame, so "fast" is not a word anyone uses.
How it works
The sampler is mostly orchestration. It uses MediaPipe FaceMesh to crop the face out of the reference and each driving frame (falls back to the full image if no face is found - you get a warning, not a crash), resizes everything to your width/height, then pads or trims the frame count to a multiple of 4 because the temporal modules work in 4-frame windows. It runs the pipeline with DDIM at 4 denoise steps in a 4-frame temporal window, then upscales the result back to your reference image's original resolution so the output matches what you put in.
The inputs and output that matter
- pipe - the
PERSONALIVE_PIPEfrom PersonaLiveCheckpointLoader. No pipe, no output. - ref_image - the source portrait, the face you want to keep.
- driving_image - the motion source. A single image works, but so does a whole frame batch: wire in a video loader and you get the full animated sequence out. Square (1:1) inputs are strongly recommended in the README for best face alignment.
- width / height (default 512, 64–2048, step 8) - the internal working resolution. The node resizes inputs here for processing, then restores the original size on output. 512 is the SD 1.5 sweet spot; there's usually no reason to touch it.
- guidance_scale (default 1.0, 0.1–20) - the one quality knob. The default is low; nudge it up if the animation drifts from the reference.
- seed (default 42) - for reproducible runs.
Output: generated_image (IMAGE) - one frame if you fed one image, or a batch of frames in driving order if you fed a video. Feed that into a video-saver node to encode the result. Note the README's "keep steps a multiple of 4" tip doesn't apply here - this node doesn't expose an inference-steps input at all; it's fixed at 4 and the batching is handled for you.
Install
Via ComfyUI Manager (search "ComfyUI-PersonaLive") or:
cd ComfyUI/custom_nodes
git clone https://github.com/okdalto/ComfyUI-PersonaLive
cd ComfyUI-PersonaLive
pip install -r requirements.txt
Two gotchas in that requirements file. First, it wants torch>=2.6, so pip may try to upgrade the torch in your ComfyUI venv - that's the most likely thing to break other nodes, so back up your environment first. Second, it lists a pile of TensorRT-era dependencies (tensorrt, pycuda, polygraphy, onnx) that this sampler doesn't use - they're for the pack's optional TensorRT optimization path. If pycuda or tensorrt refuse to install, install the rest and the node still runs fine.
Common issues
- "It's stuck loading." It isn't. The first run of the loader downloads ~15–20 GB of models from Hugging Face. Give it time or pre-download manually.
- Bad results with no crash. Face detection failed and the node silently used the full image. Use clear, front-facing, roughly square crops.
- Wrong face. The sampler only looks for one face (
max_num_faces=1) - multi-person frames get whichever one MediaPipe finds first. - Slow. A diffusion model re-rendering frames isn't real-time on consumer GPUs. Budget for minutes, not milliseconds, per clip.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| pipe | PERSONALIVE_PIPE | — | |
| ref_image | IMAGE | — | |
| driving_image | IMAGE | — | |
| width | INT | 51264–2048 | — |
| height | INT | 51264–2048 | — |
| guidance_scale | FLOAT | 1.000.1–20 | — |
| seed | INT | 420–18446744073709550000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| generated_image | IMAGE | — |