arkennemasis fal · Sync React-1 · $10/min
Lip sync that also acts — 15 seconds at a time
- video
- audio
- video
- video_path
- info
Most lip-sync nodes answer one question: do the lips match the audio? React-1 asks a second one: does the performance match the line? Its selling point is emotion - you hand it a video, an audio track and a single word like angry, and it refines the facial expression, not just the mouth. Then it charges $10 a minute, which makes it the most expensive per-minute node in this pack, and caps you at fifteen seconds per request.
Both of those facts are in the node, not in marketing copy. Fifteen seconds, enforced:
video - must be 15 seconds or shorter
audio - must be 15 seconds or shorter
The 15-second cap is the whole workflow
If you're dubbing anything longer than a quarter of a minute, you're going to chunk it. Plan for that before you spend: split the clip and the audio into matching 15-second segments, run each through this node, and join the results. Get the split points on natural pauses or cuts - the pack's assembly chain will glue clips back together, but it can't hide a lip-sync seam in the middle of a word.
Cost, concretely: 15 seconds at $10 per minute is about $2.50 per segment. A one-minute talking head is four calls, about $10. That's the honest number, and it's also why you don't prototype on React-1 - settle the script and the voice first with the cheap speech nodes, then spend here.
The inputs that shape the performance
videoandaudio- the clip and the track. Both capped at 15 seconds.emotion- a single word:happy,sad,angry,disgusted,surprised,neutral. Single-word only, per the field's own description. This is the reason to choose React-1 over Sync 2.model_mode- how much the model is allowed to touch.lips= lip sync only, minimal facial change.face= lip sync plus facial expressions, no head movement (the default).head= the full thing, expressions and natural talking-head motion. If your source clip is a calm locked-off shot and the output starts bobbing around, you left it onhead.lipsync_mode- what happens when the two lengths disagree:cut_off(default),loop,bounce,silence,remap. Match the durations yourself and this stops mattering.temperature- 0 to 1, default 0.5, described as the expressiveness of the lip sync. Turn it down when the mouth is over-performing, up when it looks dead behind the eyes.
Outputs and the fal plumbing
video is the results as a ComfyUI VIDEO value - save it, dub it, join it. video_path is the file under output/fal/fal-ai_sync-lipsync_react-1/. info is the JSON receipt with the request id, cost estimate, saved files and fal's answer.
The shared fal behaviour applies: the key comes from FAL_KEY in the .env next to your launcher (no key widget exists on any node in this pack), the cost is estimated and checked against max_cost_usd before anything is uploaded, and max_concurrent (default 1) throttles paid calls across the run so a canvas of lip-sync segments doesn't fire four submissions at once. reuse_identical_run (default on) saves you from paying twice for an identical segment - worth checking before you re-run a batch you already paid for.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart ComfyUI, or search arkennemasis in ComfyUI-Manager. Only httpx is declared, for the pack's Codex nodes; the fal provider uses Python's standard library, so nothing heavy gets installed.
Where people get burned
- You fed it a 40-second clip. Pre-flight rejects it; nothing bills. Chunk it - counting in 15s segments from the start, not from where it feels natural.
- Mismatched durations. You'll get
cut_offbehaviour and a lip-synced clip that stops early. Set the audio length first, then the video. - The face won't stop moving.
model_modeonheadwhen you wantedface. - Looks worse than Sync 2 on a plain talking head. It can - React-1 is buying you expression, not fidelity. If the mouth is the only thing you care about, Sync Lipsync 2 costs $3 a minute instead of $10.
- The clip and the performance both look flat.
emotionleft atneutralandtemperatureat 0.5 is the safe setting, not the expressive one.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| video | VIDEO | URL to the input video. Must be **15 seconds or shorter**. | |
| audio | AUDIO | URL to the input audio. Must be **15 seconds or shorter**. | |
| emotion | COMBO | neutral | Emotion prompt for the generation. Currently supports single-word emotions only. |
| model_mode | COMBO | face | Controls the edit region and movement scope for the model. Available options: - `lips`: Only lipsync using react-1 (minimal facial changes). - `face`: Lipsync + facial expressions without head movements. - `head`: Lipsync + facial expressions + natural talking head movements. |
| lipsync_mode | COMBO | bounce | Lipsync mode when audio and video durations are out of sync. |
| temperature | FLOAT | 0.500–1 | Controls the expresiveness of the lipsync. |
| 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. |