Comfyui-Kling-Wrapper Custom Voice Create
Clone a voice on Kling from inside ComfyUI
- audio
- voice_id
- voice_name
- trial_url
- task_id
- voice_json
Kling's custom voice feature is a voice clone you can actually use: give it a clean sample of a person speaking, and it registers a voice_id you can then drive video generation with. Custom Voice Create is the node that does the registration. You feed it one source of audio, it returns a reusable voice ID plus a trial preview - and it's all metered API work, no local models.
The README is blunt about the one constraint that matters: Kling wants clean, single-speaker source media between 5 and 30 seconds. That's not a suggestion. A 40-second clip with background music and two people talking will either fail or clone mush. Use one voice, quiet background, decent mic quality.
One source, four ways to supply it
The node takes exactly one audio source at a time - you pick whichever fits:
audio- a ComfyUIAUDIOconnection, e.g. from a Load Audio nodevoice_file- a local file pathvoice_url- a public http(s) URLvideo_id- a Kling video ID, if you want to clone a voice out of a video Kling already rendered for you
Local files and audio get uploaded through the pack's temporary media relay, same mechanism the motion-control and lip-sync nodes use.
The only required field is voice_name, which is just a label for your own organization (it defaults to "Custom Voice" if you leave it). There are also external_task_id and callback_url inputs for people doing serious async plumbing; ignore them unless you know you need them.
What comes back
The outputs are where the interesting stuff lives:
voice_id- the reusable ID. This is the key output; it's what Image2Video'scustom_voice_idaccepts.voice_name- echoes your label.trial_url- a preview URL of the cloned voice. This is a nice touch: wire it into Preview Audio to audition the clone before you build a whole workflow around it.task_id- the creation task's ID, for querying later.voice_json- the full response as a string.
The honest gotchas
Cloning works, but the README lists two real walls you'll hit:
- Kling returns "Voice id not found" when a custom voice ID is sent to the TTS endpoint. So you can't reuse a cloned voice in
TTS- that node only takes official/preset voice IDs. To preview a clone, usetrial_url; to speak with it, use Image2Video'scustom_voice_idonkling-v2-6, withmode=pro,sound=on, and<<<voice_1>>>in the prompt. - Custom voice mode rejects simultaneous
voice_presetorelement_listinput. Pick the custom-voice path or the preset path, not both.
Install
Standard pack install: ComfyUI Manager (search "Comfyui-Kling-Wrapper") or git clone https://github.com/magicwang1111/Comfyui-Kling-Wrapper.git into custom_nodes, pip install -r requirements.txt, restart, Kling API key in config.local.json. Custom voice is supported on both the official and Vapeur providers, though the Vapeur catalog maps only kling-v2-6 and kling-v3.
This is a genuinely fun node once the source audio rules click. Clone a voice, preview the trial, and your next Kling video can be narrated by anyone you can record for 15 seconds.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| voice_name | STRING | Custom Voice | — |
| audioopt | AUDIO | — | |
| voice_fileopt | STRING | — | |
| voice_urlopt | STRING | — | |
| video_idopt | STRING | — | |
| external_task_idopt | STRING | — | |
| callback_urlopt | STRING | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| voice_id | STRING | — |
| voice_name | STRING | — |
| trial_url | STRING | — |
| task_id | STRING | — |
| voice_json | STRING | — |