Concurrent Submit | Zhenzhen_lip_sync
Lip-sync your Kling videos in bulk instead of one agonizing render at a time
- task
Lip sync is the step that makes a talking-head video feel finished: you've got a Kling clip of a character, and you want their mouth to match a line of dialogue. Doing that one clip at a time in ComfyUI is soul-crushing because each run is a slow remote job. This node - the Concurrent Submit twin of Zhenzhen_lip_sync - is the answer to that specific pain: it hands every lip-sync job to the shared 10-worker video pool and lets you queue a whole batch of clips instead of blocking the graph on each one.
How it works
The underlying Comfly_lip_sync node does two things in one call: pick a voice, generate (or accept) the audio, then sync it onto a source video's face. There are two modes:
- text2video (default) - you type the line in
text, pick a voice, and the API synthesizes speech and drives the mouth. - audio2video - you bring your own audio and it just does the mouth sync.
The inputs that matter
- video_id / video_url / task_id - how you point at the source video: a previously generated video's ID, a URL, or a task ID from an earlier run. One of these is your "where's the face" answer.
- mode -
text2video/audio2video. - text - the line to speak (text2video only).
- voice_language -
zhoren. - zh_voice - 35 Chinese voices, and they're great: 阳光少年 (sunny boy), 温柔姐姐, 东北老铁, 川妹子... pick by character vibe.
- en_voice - 27 English voices with friendlier names (Sunny, Sage, Ace, Peppy...).
- voice_speed - 0.8 to 2.0. Bump past 1.3 and characters sound like they're on espresso; fine for comedy.
- audio_file / audio_url / audio_type - for audio2video mode.
- seed - note this one is a required INT here (0–2^31). It's the standard cache-control seed, same semantics as the rest of the pack.
- api_key / skip_error - key for the main API route; skip_error disables fail-hard behavior.
The concurrent flow
Like every Submit node, output is a single task (COMFLY_VIDEO_FUTURE), not a video. Wire it (and your other lip-sync tasks) into ComflyConcurrent_Video_Await, which collects up to 10 video tasks, preserves slot order, and returns the finished clips plus a status JSON. If one clip in a batch fails and you don't want to lose the whole queue, either set the collector's failure_mode to placeholder or tick skip_error.
Install and gotchas
It ships with T8mars/Comfyui-zhenzhen - ComfyUI Manager → search "Comfyui-zhenzhen", or git clone https://github.com/T8mars/Comfyui-zhenzhen into custom_nodes and restart. Nothing heavy to download; it's all server-side. The usual Zhenzhen caveats: paid token, overseas servers (proxy needed from China), and voice output is a billed API call per clip, so a 10-clip batch is 10 billings.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| video_id | STRING | — | |
| task_id | STRING | — | |
| mode | COMBO | text2video | 2 options: text2video, audio2video |
| text | STRING | — | |
| voice_language | COMBO | zh | 2 options: zh, en |
| zh_voice | COMBO | 阳光少年 | 35 options: 阳光少年, 懂事小弟, 运动少年, 青春少女, 温柔小妹, 元气少女, +29 |
| en_voice | COMBO | Sunny | 27 options: Sunny, Sage, Ace, Blossom, Peppy, Dove, +21 |
| voice_speed | FLOAT | 1.00.8–2 | — |
| seed | INT | 00–2147483647 | — |
| api_keyopt | STRING | — | |
| video_urlopt | STRING | — | |
| audio_typeopt | COMBO | file | 2 options: file, url |
| audio_fileopt | STRING | — | |
| audio_urlopt | STRING | — | |
| skip_erroropt | BOOLEAN | false | 开启后,节点失败时不报错、按旧行为返回默认空结果;关闭时(默认)失败直接抛出错误。 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| task | COMFLY_VIDEO_FUTURE | — |