Kling Lip Sync
Make your AI video talk — audio-synced lips, no manual animation
- auth
- audio
- video
- video_file
- audio
- url
- task_id
The "talking head" problem, solved by one API call: you've got a video of a person and an audio track, and you want their lips to move in sync with the audio. Or you've got a video and no audio at all, and you want Kling to speak your text in a voice of your choosing and sync the lips to that. This node does both, which is why it's one of the more fun toys in the pack - you can caption a character, voice a meme, or turn a silent render into a scene where someone actually talks.
Two modes, set with the mode input:
audio2video(default) - feed the video plus an audio source and Kling re-animates the mouth to match. You can provideaudioas a ComfyUI AUDIO input, oraudio_urlas an alternative. The node's video source is avideo_urlstring.text2video- no audio needed. Give ittext, avoice_id(defaultgirlfriend_4_speech02; use the pack's Voice Selector node to browse), and avoice_speed(0.5–2.0), and Kling synthesizes the speech and syncs the lips in one shot.
Both modes take the same video_url as the source video. Mechanically it's the pack's standard submit-and-poll: auth in, task created, polled to completion, then you get the full output set - video frames, video_file, the generated/attached audio, url, and task_id. The audio output is a real bonus if you ran text2video: you get the spoken track as a file you can reuse.
The quality ceiling is set by your source video. Clear, front-facing, well-lit faces with the mouth visible sync beautifully; profile shots and heavy angles degrade fast. It's the same physics as every lip-sync tool - the model needs to see the mouth.
Installing it
Bundled in ComfyUI-API-Toolkit. Manager: search "API Toolkit". Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/IxMxAMAR/ComfyUI-API-Toolkit
pip install -r requirements.txt
Restart ComfyUI. The audio handling uses soundfile (or a torchaudio fallback), so install the full -r requirements.txt rather than the bare Kling deps if you plan to feed ComfyUI AUDIO in.
Gotchas
The video must be at a URL for Kling to fetch it - that's what the video_url input is for, and it's where the Cloud Uploader node earns its place in a lip-sync workflow. If your video lives on disk, upload it first or grab its URL from a prior generation. Also: text2video costs a TTS call plus the lip-sync generation, so it bills more than audio2video - if you already have the voice line you want, use audio2video. And the content-policy note applies hard here: Kling will refuse to lip-sync into content it flags (error 1302), and there's no local bypass on a hosted model.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| auth | KLING_AUTH | — | |
| video_url | STRING | URL of the source video for lip-sync. | |
| mode | COMBO | audio2video | audio2video syncs to provided audio; text2video generates speech from text via Kling voice. |
| audioopt | AUDIO | audio2video mode: ComfyUI audio to sync with the video. | |
| audio_urlopt | STRING | audio2video mode: alternative URL of audio. | |
| textopt | STRING | text2video mode: text to speak. Required if mode=text2video. | |
| voice_idopt | STRING | girlfriend_4_speech02 | text2video mode: Kling voice ID. Use Voice Selector node. |
| voice_speedopt | FLOAT | 1.00.5–2 | text2video mode: speech speed. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| video | IMAGE | — |
| video_file | STRING | — |
| audio | AUDIO | — |
| url | STRING | — |
| task_id | STRING | — |