FL Fal Pixverse LipSync
Sync a mouth to audio or generated speech
- frames
- audio
- frames
- audio
- video_url
- status_msg
Takes a video you already have and syncs a mouth to speech - either audio you supply, or speech Pixverse generates from text you type in. This is the node for slapping dialogue onto an existing talking-head clip without re-generating the whole video.
The mechanism
Same Pixverse backend as this pack's other Pixverse nodes, a different endpoint: LipSync takes your existing frames and drives mouth movement to match audio, choosing between two input modes via mode - audio_input (you supply an AUDIO clip and it syncs to that) or text_to_speech (you type text, Pixverse generates the voice itself and syncs to it in one step).
Inputs and outputs that matter
frames (required) is the source video as a frame batch - presumably a talking subject, since that's what lip-sync needs to track. mode decides which optional inputs actually get used. audio (optional AUDIO) only matters in audio_input mode. text (optional, default "Hello, this is a test message.") and voice_id (optional, 28 choices - Auto plus a long list of named voices like Emily, James, Isabella) only matter in text_to_speech mode, since audio_input brings its own voice. seed and nth_frame (1-4, the frame-extraction stride) round out the required fields, same as this pack's other Pixverse nodes.
Outputs: frames (the lip-synced result), audio (your own clip in audio_input mode, or the generated voice in text_to_speech mode), video_url, and status_msg.
This pairs naturally with FL_Fal_Pixverse upstream in a graph: generate a talking-head clip there, then run its output frames through this node to add dialogue rather than relying on Pixverse's own generation prompt to imply speech that never actually gets voiced. nth_frame here works the same way it does across this pack's other Pixverse nodes - set it to match whatever stride you used earlier in the chain, or you'll end up thinning frames twice and losing more motion smoothness than intended.
Installing it
ComfyUI Manager: search Fill-Nodes, install, restart. Manually: cd ComfyUI/custom_nodes && git clone https://github.com/filliptm/ComfyUI_Fill-Nodes, then restart.
Where people get burned
mode picks a whole different code path, and the optional fields that matter flip depending on it. Set mode to text_to_speech and forget to write real text, and the placeholder "Hello, this is a test message." gets lip-synced onto your video - an easy mistake to ship without noticing on a quick test run. In audio_input mode, voice_id is simply irrelevant; don't waste time picking a voice there, it isn't consulted.
As with Pixverse's other endpoints, this bills per call through your Fal.ai account, so a batch of lip-sync test iterations adds up faster than a single-image edit would.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | — | |
| frames | IMAGE | — | |
| mode | COMBO | audio_input | 2 options: audio_input, text_to_speech |
| seed | INT | 00–999999 | — |
| nth_frame | INT | 11–4 | — |
| audioopt | AUDIO | — | |
| textopt | STRING | Hello, this is a test message. | — |
| voice_idopt | COMBO | Auto | 28 options: Auto, Emily, James, Isabella, Liam, Sophia, +22 |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| frames | IMAGE | — |
| audio | AUDIO | — |
| video_url | STRING | — |
| status_msg | STRING | — |