RunningHub SoulX-FlashHead Sampler
From a still face and some audio to a talking-head clip
- pipeline
- ref_audio
- avatar_image
- video
The Loader is the boring half of this pack; the Sampler is the half that does the magic. Give it a reference photo of a face, an audio file of someone talking, and the FlashHead pipeline from the Loader, and it returns a VIDEO where the face's lips actually move - in sync, with the original audio glued on. This is the "just lipsync it" workhorse people on r/comfyui keep recommending when someone asks how to animate a face locally, and it runs on surprisingly modest hardware.
How it works
Under the hood, the Sampler translates ComfyUI's IMAGE and AUDIO types into what the model expects, then runs FlashHead's streaming inference:
- It writes your audio to a temp
.wavand your image to a temp PNG. - It slices the audio into fixed-size chunks with a few seconds of cached context, and encodes each chunk with wav2vec2.
- Each chunk gets diffusion-sampled at just 4 steps (FlashHead is guidance-distilled) with the reference image as the conditioning frame.
- All chunk frames are stitched together and FFmpeg muxes the original audio onto the result - a
flashtalk_video_*.mp4in your output folder, also returned as a VIDEO object.
The chunking is the point. This is streaming generation, not one giant denoising pass, so long audio doesn't blow up: it just means more chunks, and ComfyUI's progress bar walks along with them.
The inputs that matter
Four required, two optional:
pipeline- the FlashHead Pipeline object from the Loader. Non-negotiable.ref_audio(AUDIO) - the driving speech. Feed it anyLoadAudiooutput. There's no prompt here; motion is driven entirely by the audio's content and rhythm, so it needs to be actual speech.avatar_image(IMAGE) - the face. A clear, front-facing, well-lit portrait works best. The model animates one still, so weird angles and heavy occlusion give you weird results.seed(INT, default 42) - changes the motion and lip movement. Bump it when the sync feels subtly off.width/height(INT, default 512 each, 64–2048, step 8) - resolution. Must be multiples of 8; going big eats VRAM fast, so only push past 512 if the card can take it.
The single output, video, is the finished talking-head clip with audio baked in. Wire it straight into ComfyUI's core SaveVideo node and you're done.
Install and the real traps
Same pack, same setup: ComfyUI Manager → search ComfyUI_RH_FlashHead, or git clone + pip install -r requirements.txt from the repo. FFmpeg must exist on the system (apt-get install ffmpeg) or the audio/video merge fails. And none of it works without the two model downloads - the FlashHead 1.3B checkpoint plus the wav2vec2 encoder - covered in the Loader article.
Two things genuinely bite people:
- You need a recent ComfyUI. The node outputs the native VIDEO type, importing
VideoFromFilefromcomfy_api.input_impl.video_typeswith a fallback: on older ComfyUI builds that fallback returns a bare file-path string, whichSaveVideocan't consume. If you get a filename where a video preview should be, update ComfyUI - not this node. - Lite vs. pro is a VRAM decision made upstream. The Sampler just runs whatever pipeline the Loader built. On 8–12GB cards people run
liteand get near-real-time output (the README claims ~96 FPS on a 4090; you'll see fewer in the real world, but it's fast).proruns ~10.8 FPS on a 4090 and wants ~24GB. Real users run this exact stack on 12GB 4070-SUPER-class machines withliteand are happy with it.
One expectation to set before you go: this is lipsync, not performance capture. The reference face animates, but it won't generate new expressions or change identity. For the specific job of syncing speech to a face quickly and locally, that's hard to beat - which is why FlashHead keeps getting recommended as the default talking-head answer.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| pipeline | RH_FlashHead_Pipeline | — | |
| ref_audio | AUDIO | — | |
| avatar_image | IMAGE | — | |
| seed | INT | 420–18446744073709550000 | — |
| widthopt | INT | 51264–2048 | — |
| heightopt | INT | 51264–2048 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |