sync.so lipsync – video input
Feed sync.so a video three ways and get something that talks
- video
- video
SyncVideoInputNode is the "give sync.so a face to animate" step in the sync-comfyui lipsync pack. It takes your talking-head video, packages it up, and hands it to the generate node, which uploads it to sync.so's servers - because everything in this pack is a remote job, not a local model. If you've used the LTX-2 or HunyuanVideo-Avatar crowd's lipsync experiments and bounced off the VRAM requirements, this is the "someone else's GPU does it" alternative: you still need the video, but you don't need to run any diffusion locally.
The three ways in
Everything is optional, which is both the flexibility and the trap. You provide a video exactly one of these ways:
- Direct video connection (
video, type*) - wire it from a LoadVideo or VideoHelperSuite node. This is the one the README nudges you toward, and it's the cleanest for ComfyUI-native workflows. - Local file path (
video_path) - a full path to an MP4. The README is explicit: the file should live inside the ComfyUI directory, because the node hands the path to sync.so and their servers need to reach it. - Video URL (
video_url) - a direct, publicly reachable URL to an MP4. Great if your source is already hosted.
Output is a single video of type SYNC_VIDEO, which you wire straight into SyncLipsyncMainNode.
How it actually packages the video
Read the source and the priority order becomes clear. If a video tensor is connected, the node converts your frames to a temp .mp4 with OpenCV (mp4v codec, hardcoded 30fps) in ComfyUI's temp/ dir and passes that path along. If no connection but a path that exists, it passes the path through. Otherwise a URL, if you gave one. If you gave none of them, it silently returns an empty path dict - and the whole thing falls over later at the API, not here.
Two gotchas hide in that conversion: the node assumes your tensor is frames × height × width × channels, and it rescales 0..1 float tensors to 0–255 before writing. And if the mp4v writer fails to open, it silently falls back to an .avi - which sync.so's 20MB upload path may or may not accept. Most "it uploaded but the result is broken" reports trace back to that fallback.
Installing the pack
Same story as the whole pack - one install, five nodes:
cd ComfyUI/custom_nodes
git clone https://github.com/synchronicity-labs/sync-comfyui
cd sync-comfyui
pip install -r requirements.txt
Restart ComfyUI, or skip the manual steps entirely and use ComfyUI Manager (search "sync-comfyui" / "sync"). The heavy dependencies here are real: opencv-python-headless (the video writer), plus librosa and soundfile for the sibling audio node. The README also mentions comfy node install comfyui-sync-lipsync-node as the one-liner.
Common issues
- "Manual video path not found" in the console - the path doesn't exist from ComfyUI's working directory. Remember the README's rule: files that aren't inside the ComfyUI repo won't be reachable by the API, so copy them in first.
- 20MB upload limit - the generate node only uses the file-upload path when the file is under 20MB (hardcoded as
MAX_BYTES). Bigger files fall back to the SDK path, which requires a URL. If you keep hitting this, host the MP4 and usevideo_urlinstead of a local path. - MP4 only - the node description is blunt: supported format is MP4, and the file-size limit is real. Convert anything else before you wire it up.
One honest caveat from the community about the whole approach: sync.so's output tends to land around 25fps with occasional stutter, which is fine for social clips and visibly off for anything that needs smooth 30fps motion. The input node won't warn you about that - it's just the service's ceiling. If that ceiling bothers you, local lipsync with a proper model is your other path, at the cost of VRAM and setup time.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| videoopt | * | — | |
| video_pathopt | STRING | — | |
| video_urlopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | SYNC_VIDEO | — |