arkennemasis fal · Sync Lipsync 2 Pro · $5/min
When the mouth is the shot and it has to be right
- video
- audio
- video
- video_path
- info
Same job as the Sync Lipsync 2 node, same four-ish widgets, $5 a minute instead of $3. What the extra two dollars buy, in Sync's own framing, is preservation of the details that give a mouth away: teeth, and the specific facial features that make a person look like themselves while talking.
That's a narrow pitch and it's an honest one. On a wide shot of a presenter, Sync 2 is fine and you should keep the money. On a tight close-up - the kind of shot a talking-head video opens on - a bad mouth is the only thing anybody will look at, and this is the node you'd pay for.
How it decides to charge you
$5 per minute of video. There's no length cap enforced by the node, so a 30-second clip is about $2.50 and a five-minute interview is $25, which is the point at which you should be asking whether a local audio-driven avatar model would do instead. The cost is estimated from what you connect and checked against max_cost_usd (default $20) before anything is uploaded - so a long clip you didn't think about will be stopped at the gate rather than discovered on a statement.
And notice there's no model combo here. Unlike the Sync 2 node, this one is the pro model and nothing else, which is a small mercy: one less way to accidentally bill at the wrong rate.
The widgets
video and audio are required, both ComfyUI values - a clip and a track, not file paths. sync_mode decides what happens when their durations disagree: cut_off (default), loop, bounce, silence, remap. The default trims to the shorter of the two, which is exactly wrong if your narration runs long - you'll get a mouth that quits early. Size the shot to the voice before you spend here; the pack's Narration Length node returns a shot length snapped to the video model's frame grid, and that's the cheap place to solve this.
The rest is shared fal behaviour across the whole pack: reuse_identical_run (default on) returns a result you already paid for when the inputs are identical and the files are still on disk - including after a ComfyUI restart, which is genuinely good news at five dollars a minute. max_concurrent (default 1, up to 32) keeps paid calls serialised across the run unless you say otherwise, and if one fal node fails the ones still waiting are never started, so nothing extra is billed. extra_json exists for any fal field the node has no box for; leave it empty.
Outputs
video - the ComfyUI VIDEO result, into a save node or the pack's assembly chain. video_path - the file under output/fal/fal-ai_sync-lipsync_v2_pro/. info - JSON with the request id, cost estimate, saved files and fal's answer. That info output is worth wiring or at least reading when you're running several takes; it's your only record of what each attempt actually cost.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart ComfyUI, or search arkennemasis in ComfyUI-Manager. requirements.txt is httpx and nothing else - that's for the pack's Codex nodes; the fal provider uses the standard library. Then:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
in the .env next to run_nvidia_gpu.bat. No key field exists on any node in this pack, deliberately: widget values are written into workflow JSON verbatim, and a key in a widget is a key in every screenshot.
Where people get burned
- You paid 1.67× for a wide shot. Sync 2 at $3 a minute is the right call unless the face fills the frame.
- The clip is longer than the audio and the mouth stops.
sync_mode. Fix durations, or change the mode. - Five minutes of footage = $25. The pre-flight cap will stop it, which is the design working. Prototype short.
- A face at an angle, or cropped at the mouth. Nothing in this model's feature set fixes input that bad. Re-frame the source, then spend.
- You assumed a failed-looking job wasn't billed. If the request reached fal, it was. The ledger at
output/fal/_requests.jsonltells you, and the free fal Recover Result node gets you the output if ComfyUI is what died, not the request.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| video | VIDEO | URL of the input video | |
| audio | AUDIO | URL of the input audio | |
| sync_mode | COMBO | cut_off | Lipsync mode when audio and video durations are out of sync. |
| max_cost_usdopt | FLOAT | 20.00–100000 | Safety 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_runopt | BOOLEAN | true | If 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_jsonopt | STRING | Advanced: 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_concurrentopt | INT | 11–32 | How 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)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_path | STRING | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |