Nodes/arkennemasis - ChatGPT / Codex / fal AI nodes/arkennemasis fal · Sync Lipsync 3 · $8/min
ComfyUI Node

arkennemasis fal · Sync Lipsync 3 · $8/min

Great mouth, $8-a-minute mouth

By Hishamahmer·Created 3 months ago·Updated 9 days ago· 11
arkennemasis fal · Sync Lipsync 3 · $8/min
  • video
  • audio
  • video
  • video_path
  • info
◄sync_modecut_off►
◄options_prompt(not set)►
◄options_occlusion_detection_enabled(not set)►
◄options_temperature-1.00►
◄options_active_speaker_detection►
◄options_model_mode(not set)►
◄max_cost_usd20.0►
◄reuse_identical_runtrue►
◄extra_json►
◄max_concurrent1►

What you're actually reaching for

You have a face on video and a voice track that it isn't speaking. Maybe it's a TTS render from your own graph, maybe it's a recorded VO, maybe it's someone else's language. You want the mouth to match. That's the entire job of this node, and it does it by handing your clip to Sync.so's sync-3 endpoint on fal.ai and downloading the result.

Why not do it locally? You can - InfiniteTalk and MultiTalk are the community defaults for audio-driven avatars, and LTX-2 generates its own synced audio. But local talking-head work is the fiddly end of the ecosystem: another node pack, another dependency stack, and it falls over on hard footage like a strong head angle or a hand in front of the mouth. Hosted lip sync is the path that mostly just works. You pay for that reliability, and here you pay by the minute - $8 per minute, fal's billing unit, which makes this the single most expensive per-minute node in the pack.

How it works

The node doesn't run a model. It uploads the video and audio you connect to fal's CDN (free), makes one billed request to fal-ai/sync-lipsync/v3, waits - showing queue, running time and the estimate on the node while it goes - and downloads the finished clip into output/fal/fal-ai_sync-lipsync_v3/. ComfyUI's Cancel button cancels the request on fal too, so you don't pay for a run you abandoned.

The inputs that matter

Two sockets carry the whole job: video and audio. Everything else is trimming.

  • sync_mode - the one you'll actually touch. It decides what happens when the two lengths disagree: cut_off (default), loop, bounce, silence, remap. Short audio over a long clip and a default cut_off will simply stop syncing after the audio ends.
  • options_prompt - shows up on the node as emotion (happy, sad, angry, disgusted, surprised, neutral). The author's own tooltip says it's a Sync.so option mainly used by react-1. Leave it at (not set).
  • options_model_mode, options_temperature, options_occlusion_detection_enabled - model_mode (lips, face, head, …), an expressiveness float, and a yes/no occlusion switch. All three say the same thing in their tooltips: sync-3 handles this natively and ignores these options. Don't fiddle.
  • options_active_speaker_detection - a JSON box for multi-person footage. Empty leaves it out, which is what you want for a single talking head.

Then the money guards, on every fal node in this pack: max_cost_usd (default $20) stops the run before anything uploads if the estimate is higher, and 0 removes the cap. reuse_identical_run (on by default) returns the already-paid result instead of paying again for identical inputs - even after a ComfyUI restart. max_concurrent (default 1) keeps paid fal calls from stacking up across the graph.

Outputs

  • video - a VIDEO, ready for SaveVideo, PreviewVideo, or the pack's own Video Assemble node.
  • video_path - the file on disk, as a string.
  • info - JSON with the request id, cost estimate, saved files and fal's full answer. When something looks wrong, read this before you re-run.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install -r comfyui-arkennemasis/requirements.txt   # portable: python_embeded\python.exe -m pip install -r ...

Then restart ComfyUI. You can also install it through ComfyUI-Manager by pasting the repo URL. The pack's requirements.txt only asks for httpx (the fal nodes themselves use the standard library), so there's no heavyweight dependency here.

The key goes in the .env file of your ComfyUI install - in the portable build, the folder holding run_nvidia_gpu.bat:

FAL_KEY=your-key-from-fal.ai/dashboard/keys

The nodes read it from there and nowhere else. There is deliberately no key box on the node, so a key can't get baked into a workflow file you share.

Where people get burned

The estimate follows the longest clip, not the badge. The node measures the video and audio you connect and multiplies $8 by the longer one in minutes. A five-minute interview is a ~$40 run, and it will trip the default max_cost_usd of $20 and stop before upload - which is the node working correctly, not a bug. Raise the cap knowingly.

Length mismatch reads as a broken model. Nine times out of ten, "the sync stops halfway" is sync_mode set to cut_off with audio shorter than the video.

A ComfyUI restart mid-run doesn't lose your money. The request keeps running on fal and every submit is logged in output/fal/_requests.jsonl. Grab the id, put it into the pack's fal Recover Result node, and it downloads for free. Or use fal · History (free) to load a finished run back into the graph.

The filter is Google-and-Sync's, not yours. Everything you send goes to fal and then to Sync.so, and their moderation applies. There's no local bypass, because there's nothing local - the node is a thin client. If the footage is something a hosted filter would refuse, this is the wrong tool, full stop.

Check the economics against local before you commit. For a one-off job, $8/min is fine. For a weekly talking-head series, the local avatar route (InfiniteTalk plus your own TTS) is where the money goes back in your pocket - with a weekend of dependency pain as the entry fee.

Categoryarkennemasis/fal/Lip Sync/Sync

Inputs (12)

NameTypeDefaultDescription
videoVIDEOURL of the input video
audioAUDIOURL of the input audio
sync_modeCOMBOcut_offLipsync mode when audio and video durations are out of sync.
options_promptCOMBO(not set)Emotion prompt for generation. This is a Sync.so option primarily used by react-1. '(not set)' leaves it to the model.
options_occlusion_detection_enabledCOMBO(not set)Whether to detect occlusion during generation. Sync.so handles this automatically for sync-3, so this option is ignored by sync-3.
options_temperatureFLOAT-1.00-1–1Controls how expressive lipsync can be; 0 is least expressive, 1 is most expressive. Sync.so handles this natively for sync-3, so this option is ignored by sync-3. -1 leaves it to the model.
options_active_speaker_detectionSTRINGActive speaker detection configuration for videos with multiple people. JSON. Empty leaves it out.
options_model_modeCOMBO(not set)Edit region for the model. This is a Sync.so option primarily used by react-1. '(not set)' leaves it to the model.
max_cost_usdoptFLOAT20.00–100000Safety cap. If the estimated cost of this run is above this many US dollars the node stops BEFORE sending anything to fal. 0 = no cap.
reuse_identical_runoptBOOLEANtrueIf these exact inputs (the settings AND the same pictures/clips/audio) were already paid for and the files are still in output/fal, return them instead of paying again - also after a ComfyUI restart. Turn off for a fresh take with the same settings.
extra_jsonoptSTRINGAdvanced: a JSON object merged into the request last, for any fal field this node has no box for. Example: {"seed": 7}. Leave empty normally.
max_concurrentoptINT11–32How many paid fal calls may run at the same time in one run, across every fal node. 1 (default) = one after another. This node starts its paid part only while fewer than this many fal calls are running. Once any fal node fails, the ones still waiting are not started, so nothing more is billed.

Outputs (3)

NameTypeDescription
videoVIDEO—
video_pathSTRING—
infoSTRINGJSON: request id, cost estimate, saved files and fal's full answer.