Sync.so Personalized Video Messenger
The node that runs your whole Sync.so pipeline
- output_csv_path
Let's get the thing that's confusing you out of the way first: this node does not generate anything on your machine. No diffusion, no GPU, no model download. SyncPVMessengerNode is a batch API client that happens to live in your node graph. You give it two API keys and a spreadsheet, and it quietly runs a whole personalized-video pipeline against the Sync.so and ElevenLabs clouds. If your ComfyUI is normally a roaring GPU box, this is the node that takes a coffee break while it works.
So what is "personalized video messaging"? You have one video of a person (yourself, an avatar, a spokesperson), and you want hundreds of variations where that same face speaks different text - often in different languages. Think HeyGen-style outreach at scale, or a birthday-video generator. The audio is text-to-speech, the video is lipsync. Sync.so is the lipsync side, built by the people behind Wav2Lip, and it's genuinely good at it.
How it works
The node reads a CSV of jobs. For each row it:
- Clones a voice from the first row's video audio via ElevenLabs (it caches the clone as
my_voice_cloneand reuses it on later runs, so you only pay for that once). - Generates speech for the row's
textwith ElevenLabs - the defaulteleven_multilingual_v2model is why "multilingual" is in the title; the same voice can speak lots of languages. - Uploads the audio and the video to uguu.se, then submits a lipsync job to Sync.so (
lipsync-2model,bouncesync mode by default). - Writes the job ID back into the CSV, polls until each job completes (every 10 seconds, up to an hour), and fills in
output_url. Ajob_ids.jsonlands next to your output CSV too.
Every real control lives in the CSV, not the node widget: text, tts_model, lipsync_model, sync_mode, segment_start/segment_end for syncing only a slice of the clip, and voice_id if you want to force a specific voice. The README points at synchronicity-labs' example input.csv - grab that to see the columns it expects.
The inputs that matter
Only four, and they're all plain strings:
- sync_api_key - your Sync.so API key.
- eleven_api_key - your ElevenLabs key.
- input_csv_path - your job spreadsheet (default
input.csv). - output_csv_path - where results land (default
output.csv).
It's an output node, and its single output is just output_csv_path - the path to the CSV that now contains your output_urls. There's no image or video wire to hook up; the CSV is the result. Wire that string to a text display or a save node if you want to see it, but honestly you'll just go open the file.
Installing it
Via ComfyUI Manager, search "Sync PVM". Or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/wasilone11/comfyui-pvm-node
cd comfyui-pvm-node
pip install -r requirements.txt
Then restart ComfyUI and search for Sync in the node menu.
Heads-up, and this one is real: the repo's requirements.txt only lists syncsdk==0.1.9, but the actual code also imports pandas, moviepy, requests, and elevenlabs - and I checked the SDK's own metadata, so those are not pulled in transitively. If the node throws ModuleNotFoundError: pandas (or moviepy, or elevenlabs) on its first run, that's why:
pip install pandas moviepy requests elevenlabs
Troubleshooting and the honest cautions
- You need two paid API keys. ElevenLabs for voice cloning + TTS, Sync.so per generation. This is not free, and it is not local. Every video you run through it goes to third-party servers - including uguu.se, a public anonymous file host. Don't feed it footage you can't afford to share. Before you give any custom node your files, read what it does; the ecosystem essay in our KB exists because some nodes weren't honest about that.
- First run clones a voice from the first row's video - that clip needs audible speech in it, or you'll get a clone/400 error (the code does auto-recover from the "voice name already exists" 400 by deleting and re-cloning, at least).
- Rows that fail TTS get an empty
audio; a failed video upload getsFAILEDwritten tolipsync_jobID. The console prints which row it's on, so watch the terminal, not the pretty UI. - uguu.se is a temp host - treat
output_urlas a working link, not permanent storage. Download what you care about.
It's a niche tool and it's honest about that: a thin, single-purpose wrapper that turns a spreadsheet into talking videos. If that's your job, it saves you writing the same orchestration yourself. If you just want lipsync locally, this isn't it - it's the cloud version.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| sync_api_key | STRING | — | |
| eleven_api_key | STRING | — | |
| input_csv_path | STRING | input.csv | — |
| output_csv_path | STRING | output.csv | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| output_csv_path | STRING | — |