Sync.so Lipsync – Input
The boring node that feeds the whole cloud lipsync job
- sync_input
The name is honest: this is the input node, and it does zero lip-syncing. It's the first of three nodes that wrap the Sync.so cloud API (Input → Generate → Output), and its entire job is to collect your video, audio, and API key into one tidy package and hand it to the Generate node. If you've ever used a data-holder node, you know the drill - it's plumbing, not magic. But it's the plumbing the other two depend on, and there's one gotcha hiding in it that bites people who feed it big files.
The wider context matters here. Most "lipsync in ComfyUI" options you'll read about are local and free - LTX-2 does genuinely good talking-head lipsync on your own GPU. This pack is the opposite: a thin wrapper around Sync.so, a paid cloud service. Nothing renders on your machine, no model downloads, no VRAM spent. You pay per job with API credits and get Sync.so's lipsync-2 quality back. Reach for it when you want that specific model's output without leaving ComfyUI, and you're fine with the money and the upload-to-cloud privacy trade-off. If you want free and local, this isn't your pack.
What the inputs actually do
Five plain text fields, and you only really care about a couple:
- video_path / audio_path - local files. The README is blunt that files should live inside your ComfyUI repo, which is the real-world version of "paths resolve relative to ComfyUI's working directory."
- video_url / audio_url - remote files, used when there's no usable local path.
- api_key - your Sync.so key. The whole thing is dead on arrival without it.
Here's the gotcha, straight from the source: local files only take the upload path if they're under 20 MB (MAX_BYTES = 20 * 1024 * 1024 in the code). Anything bigger silently falls back to the SDK path, which expects URLs - so a 200 MB local clip won't upload, it'll just fail or send an empty URL. Keep clips short, or host them somewhere with a URL first.
What comes out
One output, sync_input of type SYNC_INPUT. It's a dict bundling your paths, key, and a hidden poll_interval (5 seconds) that the Generate node reads to poll the job. Wire it into SyncLipsyncMainNode's sync_input input - that's the node doing the actual API call, polling until COMPLETED or FAILED, and downloading the result into ComfyUI's output/ folder. The third node just displays it in the UI.
Install
ComfyUI Manager: search "Sync" and install "ComfyUI Sync Lipsync Node", then restart. Or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/wasilone11/comfyui-sync-lipsync-node.git
pip install -r comfyui-sync-lipsync-node/requirements.txt
Dependencies are light - requests, syncsdk, and protobuf. No models to fetch. The usual caveat applies: custom nodes share one Python environment, and syncsdk/protobuf pinning can collide with other packs, so if things break after install, that's where to look.
The traps
The biggest is pricing - nobody reads it until the first run. Create an account at sync.so, buy credits, paste the key. Second: the node swallows errors. If the API rejects your key or the job fails, the Generate node returns an empty string and the Output node just says "No video output was generated." Check your terminal - the pack prints a job ID and every poll status to stdout, which is where the actual diagnosis lives.
It's a single-purpose, single-author pack with zero traction on the search side, so treat it as a hobby wrapper: it works, but it's a cloud API call with a ComfyUI face, not a maintained ecosystem. For a beginner, the honest take is that the Node itself is the easy part - the Sync.so account and its credits are the real learning curve.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| video_path | STRING | — | |
| audio_path | STRING | — | |
| video_url | STRING | — | |
| audio_url | STRING | — | |
| api_key | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| sync_input | SYNC_INPUT | — |