Nodes/muapi-comfyui/🎬 MuAPI Lipsync
ComfyUI Node

🎬 MuAPI Lipsync

Make a Clip Talk, With an MP3 You Can Just Point At

By SamurAIGPTΒ·Created about a year agoΒ·Updated a day agoΒ· 72
🎬 MuAPI Lipsync
    • video_url
    • first_frame
    • request_id
    β—„modelsync-lipsyncβ–Ί
    β—„video_urlβ–Ί
    β—„audio_urlβ–Ί
    β—„api_keyβ–Ί
    β—„audio_file_pathβ–Ί
    β—„custom_endpointβ–Ί
    β—„extra_params_json{}β–Ί

    Lipsync is the one job where the open models genuinely caught up - LTX-2's audio+video generation made talking heads a solved problem for people with the hardware, and the KB's audio-generation.md describes the ecosystem around it: InfiniteTalk as the fast local default, MultiTalk for multi-speaker scenes, Wan S2V as the one everyone says disappoints.

    🎬 MuAPI Lipsync is the other route. Twelve endpoints, from the dedicated hosted services (sync-lipsync, veed-lipsync, creatify-lipsync) through latentsync-video to the model-based ones (ltx-2-19b-lipsync, ltx-2.3-lipsync, wan2.2-speech-to-video, and four Kling avatar tiers). Same appeal as the rest of the pack: no 20GB download, no CUDA build, no VRAM conversation. Sync is the one worth trying first - it descends from the Wav2Lip lineage and it's the name people reach for when they want the hosted version of this.

    The inputs, and the useful exception

    Required: model, video_url, audio_url. Both are plain STRINGs.

    Optional: audio_file_path - and this is the node's best feature. Every other video-shaped node in this pack demands a URL for your footage, but audio gets a local file path. Point it at an audio file inside ComfyUI's input or output directory, by relative name:

    voiceover.mp3
    

    If audio_file_path is set, the pack uploads that file to muapi's /upload_file endpoint and uses the uploaded URL instead of whatever's in audio_url. So you can leave audio_url blank when you have a path - the requirement is satisfied either way. The MIME type is picked from the extension: .mp3, .wav, .aac. And since the pack confines paths to ComfyUI's input/output folders, an absolute path or a .. comes back as "Upload path must be relative to ComfyUI input or output."

    video_url, on the other hand, is a URL and nothing else. No upload socket. The clean workflow is to generate the clip with 🎬 MuAPI Image-to-Video or Text-to-Video and wire video_url straight across, so the file already lives on muapi's CDN. A clip sitting in your own output/ folder has to get a publicly reachable URL before this node can touch it.

    custom_endpoint and extra_params_json are the usual escape hatches.

    Outputs

    video_url (STRING) - send it to 🎬 MuAPI Save Video to get an mp4 plus IMAGE frames. first_frame is an IMAGE from the result. request_id is the continuation handle for Extend.

    There's no duration or quality widget: the output runs as long as the input clip, and the mouth is driven by the audio. If the audio is longer than the video, you get the shorter of the two - extend the clip first.

    Install

    Manager β†’ Install via Git URL β†’ https://github.com/SamurAIGPT/muapi-comfyui β†’ restart. Or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/SamurAIGPT/muapi-comfyui
    pip install -r muapi-comfyui/requirements.txt
    

    requests, Pillow, numpy, torch, opencv-python - no weights, nothing to place in models/.

    What goes wrong, and what's just the model

    Empty audio_url and empty audio_file_path gets you "audio_url or audio_file_path required" - the one error message in this pack that tells you exactly what to fix.

    Beyond that, expect model behaviour rather than node bugs. The KB documents LTX-2 lipsync as "crazy good" when it behaves and lists the specific ways it doesn't: purple-face artifacts at higher resolutions, identity drift between shots, and background characters randomly starting to lip-sync. Those are the model, not the wrapper, and swapping the dropdown to sync-lipsync is the fix when it keeps happening. On the Kling avatar endpoints you're in a different mode entirely - an avatar generator rather than a mouths-only sync - so a wide shot with three people in it will not behave the way a face-centred close-up will.

    And the usual per-call cost note: this is a paid render every time. Iterate on a cheap endpoint and a short clip, then re-run the keeper at the quality tier you want.

    Category🎬 MuAPI

    Inputs (7)

    NameTypeDefaultDescription
    modelCOMBOsync-lipsync12 options: sync-lipsync, veed-lipsync, creatify-lipsync, latentsync-video, ltx-2-19b-lipsync, ltx-2.3-lipsync, +6
    video_urlSTRINGβ€”
    audio_urlSTRINGβ€”
    api_keyoptSTRINGβ€”
    audio_file_pathoptSTRINGβ€”
    custom_endpointoptSTRINGβ€”
    extra_params_jsonoptSTRING{}β€”

    Outputs (3)

    NameTypeDescription
    video_urlSTRINGβ€”
    first_frameIMAGEβ€”
    request_idSTRINGβ€”