Nodes/ComfyUI Sync PVM Node/Sync.so Personalized Video Messenger
ComfyUI Node

Sync.so Personalized Video Messenger

The node that runs your whole Sync.so pipeline

By wasilone11·Created about a year ago·Updated about a year ago· 1
Sync.so Personalized Video Messenger
    • output_csv_path
    sync_api_key
    eleven_api_key
    input_csv_pathinput.csv
    output_csv_pathoutput.csv

    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:

    1. Clones a voice from the first row's video audio via ElevenLabs (it caches the clone as my_voice_clone and reuses it on later runs, so you only pay for that once).
    2. Generates speech for the row's text with ElevenLabs - the default eleven_multilingual_v2 model is why "multilingual" is in the title; the same voice can speak lots of languages.
    3. Uploads the audio and the video to uguu.se, then submits a lipsync job to Sync.so (lipsync-2 model, bounce sync mode by default).
    4. 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. A job_ids.json lands 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 gets FAILED written to lipsync_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_url as 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.

    CategorySync.so

    Inputs (4)

    NameTypeDefaultDescription
    sync_api_keySTRING
    eleven_api_keySTRING
    input_csv_pathSTRINGinput.csv
    output_csv_pathSTRINGoutput.csv

    Outputs (1)

    NameTypeDescription
    output_csv_pathSTRING