Nodes/KlingComfyUI/Kling Lip Sync (Ace Data Cloud)
ComfyUI Node

Kling Lip Sync (Ace Data Cloud)

Make a clip you already have say something new

By AceDataCloud·Created 3 days ago·Updated 2 days ago· 0
Kling Lip Sync (Ace Data Cloud)
    • status
    • task_id
    • media_urls_json
    • first_media_url
    • result_json
    • trace_id
    ◄parameters_json{}►
    ◄video_id►
    ◄video_url►
    ◄mode►
    ◄audio_url►
    ◄audio_type►
    ◄audio_file►
    ◄text►
    ◄voice_id►
    ◄voice_language►
    ◄voice_speed►
    ◄callback_url►

    Post-processing, not generation

    Talking Photo makes a face move from a still. This one takes footage you already have - a Kling clip, a render from your local pipeline, anything with a visible mouth - and re-times the lips to new audio. It's a fixer, and a very practical one: your local model gave you a great shot with mush for a mouth, or you changed the script after the fact and can't afford to re-render, or you've got a real recording of a real voice and a synthetic face that needs to match it.

    The open-weights equivalent in the current ecosystem is an audio-driven avatar model - InfiniteTalk over Wan, typically, or the LTX-2.3 audio pass. Those work, they run on your card, they cost nothing per clip, and they come with the usual quota of setup. Lip Sync is the two-dropdown version.

    Two modes, two completely different node setups

    mode is required, and it decides which half of the widgets matter.

    audio2video - you supply footage and an audio track. video_id targets a clip that already exists on the service; video_url points at one. audio_url is the track, and audio_type distinguishes whether that audio arrives as a URL (url) or as a file reference (file, with audio_file as the corresponding name). In practice, since this node has no upload widget, the URL path is the one you'll use.

    text2video - no audio file at all. You type the line into text, capped at 120 characters, and pick a voice: voice_id, voice_language (zh or en) and voice_speed (a number from 0.8 to 2.0). The service speaks it and syncs it. If you haven't created a voice yet, Kling Voices is where you do that, and presets there is a free read-only call, so you can browse the library before committing to a clone.

    Note the two-character cap on text. 120 characters is a sentence or two, not a monologue - the API contract enforces it locally, so an overlong script fails before anything is sent.

    Inputs and outputs

    Every widget is a STRING, as is the pack's habit: video_id, video_url, audio_url, audio_type, audio_file, text, voice_id, voice_language, voice_speed, callback_url, plus parameters_json. The speed value goes in as 1.2, not as a slider. A nonempty widget overrides the same key in parameters_json - handy if you'd rather build the whole payload as JSON and leave the widgets blank.

    Outputs are the standard six: status, task_id, media_urls_json, first_media_url, result_json, trace_id. The clip you want is first_media_url → Kling Load Video. If the synced result also needs its audio as a ComfyUI tensor, Kling Load Audio on the audio URL gets you there.

    Install

    cd ComfyUI/custom_nodes
    git clone https://github.com/AceDataCloud/KlingComfyUI
    cd KlingComfyUI && python -m pip install -r requirements.txt
    # restart ComfyUI
    

    Manager: search Kling, publisher acedatacloud, package Kling by Ace Data Cloud (Registry ID kling). Dependencies are requests and jsonschema - no models, no CUDA, nothing to download. Native video/audio loading needs ComfyUI 0.39.0 or newer.

    export ACEDATACLOUD_API_KEY=your_key_here   # then launch ComfyUI
    

    Common issues

    Submit once, then poll. The client forces async: true and gives paid submissions exactly one attempt - read-only queries are the only ones that retry. If a submit fails at the network layer it may still have created a task, so check the ID before queuing again. Re-running a lip-sync node is a fresh charge, which is easy to forget when the source clip already exists.

    Footage quality sets the ceiling. The model re-times a mouth; it doesn't invent one. A clip where the face is small, turned away, or already smeared by a bad render is going to look like a clip where those things are true. Feed it a clean, front-facing, well-lit shot.

    URLs, not files. Both the video and the audio have to be fetchable by the service. Local paths don't upload from this node.

    Results are sanitized on the way back. The pack strips request bodies and internal fields from result_json, and a service-side failure reads "Operation failed; use the task or trace ID to inspect the request." That's not you doing something wrong; it's the pack refusing to leak provider detail. Keep the trace_id.

    CategoryAce Data Cloud/Kling

    Inputs (12)

    NameTypeDefaultDescription
    parameters_jsonSTRING{}—
    video_idSTRING—
    video_urlSTRING—
    modeSTRING—
    audio_urlSTRING—
    audio_typeSTRING—
    audio_fileSTRING—
    textSTRING—
    voice_idSTRING—
    voice_languageSTRING—
    voice_speedSTRING—
    callback_urlSTRING—

    Outputs (6)

    NameTypeDescription
    statusSTRING—
    task_idSTRING—
    media_urls_jsonSTRING—
    first_media_urlSTRING—
    result_jsonSTRING—
    trace_idSTRING—