KLingAI Lip Sync
Make a Kling video's mouth match audio
- task_id
- task_status
- update_time
- seed
This is the node that turns a character video into a character talking video. KLingAI Lip Sync takes a video you already generated (via text2video or image2video in this same pack), attaches speech, and returns a new clip where the mouth movements match the audio. It's Kling's lip-sync API (/v1/videos/lip-sync) wrapped as the usual async task node.
The workflow shape matters here: this node does not generate the base video. You need an existing video_id or video_url - the output of a prior generation - plus speech in one of two forms. That's the whole design: generate the scene first, then bring it to life.
Two modes, chosen by mode
text2video- give it atextscript and avoice_id, and Kling synthesizes the audio itself via TTS before syncing. The default voice isgirlfriend_1_speech02(yes, that's the literal ID - this pack's defaults come straight from Kling's voice catalog), withvoice_language(zhoren) andvoice_speed(0.8–2.0) to shape it.audio2video- you supply real audio instead. Setaudio_typetofileorurl, thenaudio_file(a local path) oraudio_url. This is the mode for a pre-recorded VO, an existing podcast clip, anything with real sound.
Inputs that matter
- api_token (required) - the JWT from the API Key node, as everywhere.
- video_id / video_url - the source video. Either works;
video_idis what a generation node's task gives you downstream of Query Status. - text - only used in
text2videomode. - voice_id / voice_language / voice_speed - only used in
text2videomode. - audio_file / audio_url / audio_type - only used in
audio2videomode. - callback_url / seed - optional plumbing; seed is local-only.
The output
task_id, task_status, update_time (all STRING) and seed (INT) - note update_time here instead of the created_at/updated_at pair the video nodes use. Same flow regardless: task_id into Query Status (set task_type to lip-sync), and the result URL into the Video Downloader.
Where people get burned
- No video, no sync. The most common mistake is treating this as text-to-talking-video and skipping the generation step. It needs a video in, full stop.
- Wrong mode's inputs ignored. Set
modetotext2videobut feedaudio_url- it won't pick up the audio. Mode decides which inputs matter; the ignored ones just sit there. - Voice IDs from the catalog.
girlfriend_1_speech02is a Kling default, not a suggestion. If you want a specific voice, check Kling's current voice list for a valid ID - a bad one fails the task server-side. - Chinese-first defaults.
voice_languagedefaults tozhand the README's framing is Chinese-community flavored; flip it toenif that's what you're syncing. - Async, obviously. Task ID out, not a video. Query Status → Downloader, same as every generation node in this pack.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| api_token | STRING | — | |
| video_idopt | STRING | — | |
| video_urlopt | STRING | — | |
| modeopt | COMBO | text2video | 2 options: text2video, audio2video |
| textopt | STRING | — | |
| voice_idopt | STRING | girlfriend_1_speech02 | — |
| voice_languageopt | COMBO | zh | 2 options: zh, en |
| voice_speedopt | FLOAT | 1.00.8–2 | — |
| audio_typeopt | COMBO | url | 2 options: file, url |
| audio_urlopt | STRING | — | |
| audio_fileopt | STRING | — | |
| callback_urlopt | STRING | — | |
| seedopt | INT | -1-1–18446744073709550000 | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| task_id | STRING | — |
| task_status | STRING | — |
| update_time | STRING | — |
| seed | INT | — |