Nodes/comfyui-sync-lipsync-node/sync.so lipsync – generate πŸ’°
ComfyUI Node

sync.so lipsync – generate πŸ’°

The generate node that spends your sync.so credits and waits

By synchronicity-labsΒ·Created about a year agoΒ·Updated 12 months agoΒ· 7
sync.so lipsync – generate πŸ’°
  • api_key
  • video
  • audio
  • output_path
  • status_message
β—„modelβ–Ύβ–Ί
β—„segment_secsβ–Ί
β—„segment_framesβ–Ί
β—„sync_modecut_offβ–Ί
β—„temperature0.50β–Ί
β—„active_speakerfalseβ–Ί
β—„occlusion_detectionfalseβ–Ί

This is the heart of the sync-comfyui pack: the node that takes your API key, video, and audio, uploads them to sync.so's servers, and blocks your workflow until the lip-synced result comes back. It's the "πŸ’°" node in the pack's own naming, and it earns the emoji - everything here happens on someone else's GPU and against your credit balance. No local model, no VRAM, no offline mode. If you've been fighting LatentSync or local avatar models and just want a clean talking-head result, this is the "pay a cloud to do it" path in its purest form.

What you must wire in

The node validates this itself - VALIDATE_INPUTS refuses to run unless both video and audio are connected:

  • api_key (SYNC_API_KEY) - from the SyncApiKeyNode.
  • video (SYNC_VIDEO) - from SyncVideoInputNode.
  • audio (SYNC_AUDIO) - from SyncAudioInputNode (file, URL, or TTS).

Then the settings that actually shape the result:

  • model - lipsync-2-pro (best quality, needs a subscription), lipsync-2 (balanced), or lipsync-1.9.0-beta (fastest). When in doubt, lipsync-2 is the sane default; pro is the "the result matters more than the bill" pick.
  • sync_mode - how to handle audio/video length mismatch: cut_off (trim the longer one), loop, bounce, silence (pad), or remap (stretch). Default cut_off, which is right for most clips.
  • temperature - 0.0–1.0, default 0.5. Higher = more expressive/random, lower = more stable.
  • segment_secs / segment_frames - JSON arrays for time-based or frame-based segmentation, e.g. [0, 5, 10]. Leave empty unless you specifically need per-segment syncing.
  • active_speaker and occlusion_detection - booleans for speaker detection and for detecting when the face is blocked (hand over mouth, mic, etc.). The latter is a genuinely useful feature - occlusion is the classic failure mode that breaks most lipsync tools - but both are off by default.

Outputs are two STRINGs: output_path (where the finished video landed) and status_message (job ID + progress/error text, which shows up in the console and as the node's return).

How it works

The mechanism is a classic async API dance. The node posts to https://api.sync.so/v2/generate with your key in the x-api-key header, gets back a job ID, then polls the status endpoint every 5 seconds until the job is COMPLETED or FAILED. On success it downloads the full video to output/sync_output_<timestamp>.mp4 in your ComfyUI directory (and a _segment.mp4 if a segment output exists), writes a sync_job_<timestamp>.json with the job ID, and returns the path.

Whether it uploads files or sends URLs depends on size: local files under 20MB go as multipart upload, anything else falls back to the sync SDK and needs reachable URLs. In TTS mode (audio marked as TTS) it builds an ElevenLabs text block instead of an audio file.

Installing the pack

cd ComfyUI/custom_nodes
git clone https://github.com/synchronicity-labs/sync-comfyui
cd sync-comfyui
pip install -r requirements.txt

Restart, or use ComfyUI Manager (search "sync-comfyui" / "sync"). The main node's real dependencies are requests and syncsdk from requirements - the rest of the list is mostly for the input/output siblings.

Common issues

  • It blocks your whole graph for minutes - polling is synchronous and sleeps 5s between checks. A long job freezes the UI queue. That's the design, not a bug.
  • "Error: Both video and audio inputs are required" - one of the two upstream nodes produced an empty result (see the input nodes' silent-empty-path behavior). Check the console for "No valid video/audio input provided".
  • API errors mid-job - stale key, no credits, or a file over the upload limit forcing an SDK path with no URL. The node prints response bodies, so read the console, not just the status text.
  • 20MB wall - files bigger than that won't take the upload path. Host the media and use URLs instead.

Community verdict to calibrate expectations: sync.so output is generally rated good for avatar/talking-head work - it's Wav2Lip lineage - but it lands around 25fps with some stutter, and the pricing is the recurring complaint. It's the "fast, good, paid" corner of the lipsync triangle. Fine if that's your trade, and this node is the whole machine.

CategorySync.so/Lipsync

Inputs (10)

NameTypeDefaultDescription
api_keySYNC_API_KEYβ€”
videoSYNC_VIDEOβ€”
audioSYNC_AUDIOβ€”
modelCOMBO3 options: lipsync-2-pro, lipsync-2, lipsync-1.9.0-beta
segment_secsSTRINGβ€”
segment_framesSTRINGβ€”
sync_modeCOMBOcut_off5 options: loop, bounce, cut_off, silence, remap
temperatureFLOAT0.500–1β€”
active_speakerBOOLEANfalseβ€”
occlusion_detectionBOOLEANfalseβ€”

Outputs (2)

NameTypeDescription
output_pathSTRINGβ€”
status_messageSTRINGβ€”