Kling Voices (Ace Data Cloud)
Clone a voice before you try to make anything talk
- status
- task_id
- media_urls_json
- first_media_url
- result_json
- trace_id
The node you set up before the interesting one
Every "make this face talk" job starts with a voice, and this is where the voice comes from. Kling Voices is the management surface for the service's voice library: browse the presets, list what you've cloned, create a new one from a reference audio URL, delete one you're done with, or fetch the details of a single entry.
If you're doing lip-sync work, the realistic order of operations is: come here first, find or create a voice, then go drive Kling Lip Sync or Kling Talking Photo with the resulting voice_id. Skipping this step is why people end up typing a script into a lip-sync node and getting a default voice they didn't choose.
Presets alone make this worth a visit. The service keeps a library of ready-made voices; presets and list are read-only calls, so browsing costs you nothing but a request, and read-only requests are the only ones the client retries when the network drops (three attempts, with backoff). Paid submissions get one attempt. Use the free ones to explore.
How the actions work
action takes list, presets, retrieve, delete or create, with (from JSON/default) letting the API decide if you don't. list and presets paginate with page_num (1–1000) and page_size (1–500). retrieve and delete target a single voice via id.
create needs two fields: voice_name, capped at 20 characters, and voice_url - a URI pointing at the reference audio the service will clone from. Both are validated locally against the published contract before any request goes out, so a 30-character name fails fast and free instead of costing you a round trip.
delete requires confirm: true; the pack surfaces that as a confirm BOOLEAN widget and refuses with "Set confirm to true to perform this deletion or archive operation" otherwise. Good. Voice cloning is the kind of thing where you want the destructive action behind a deliberate checkbox.
Note what you don't get: no sample-rate knob, no pitch control, no emotion selector. You clone, you name it, you point at it. The tuning lives downstream - voice_speed on Kling Lip Sync runs 0.8 to 2.0, speech_rate on Kling Video Commerce offers 0.8, 1 or 1.2, and voice_language is zh or en.
Inputs and outputs
Widgets: action, id, page_num, page_size, callback_url, voice_name, voice_url, confirm, plus parameters_json. As with every node in this pack they're all STRING widgets except confirm, which is a real boolean. page_size is typed as text: 20, not a number field.
Outputs are the six STRINGs the pack uses everywhere - status, task_id, media_urls_json, first_media_url, result_json, trace_id. For a voice library call, result_json is the part you care about: it holds the voice entries, and for a create it's where the new voice_id appears. Throw a PreviewAny on it if you want to read the JSON on the canvas instead of scrolling the console.
That voice_id is the whole reason this node exists. It's what you paste into Kling Lip Sync (for text-driven sync), into element_voice_id on Kling Elements, into voice_list on Kling Generate Video, and into settings.voice_id on Kling Video Commerce.
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, confirm publisher acedatacloud and package Kling by Ace Data Cloud (Registry ID kling). Requirements are just requests and jsonschema; there's no local TTS model here and nothing to download.
export ACEDATACLOUD_API_KEY=your_key_here # then restart ComfyUI
Common issues
Your reference audio needs a public URL. voice_url is a URI the service fetches. A file sitting in ComfyUI/input/ isn't reachable from Ace's servers, and there's no upload widget on this node - unlike the local TTS route, where the audio is already on your disk. If you're cloning your own recording, you need somewhere to host it first.
Twenty characters. voice_name is tight, and the error message is the generic "does not meet the API's maxLength constraint" rather than anything friendlier, so it's worth remembering before you spend time wondering what's wrong.
Cloning someone's voice has a consent dimension. Same rule as every likeness tool: your own voice, a voice you have permission to use, or a licensed library. The pack ships a short privacy note rather than a policy, and the responsibility is yours.
Don't confuse this with the pack's audio loader. Kling Load Audio takes a finished audio file into a ComfyUI AUDIO tensor. This node manages voices in the service's library. Different jobs, confusingly similar names.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| parameters_json | STRING | {} | — |
| action | COMBO | (from JSON/default) | 6 options: (from JSON/default), list, presets, retrieve, delete, create |
| id | STRING | — | |
| page_num | STRING | — | |
| page_size | STRING | — | |
| callback_url | STRING | — | |
| voice_name | STRING | — | |
| voice_url | STRING | — | |
| confirm | BOOLEAN | false | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| status | STRING | — |
| task_id | STRING | — |
| media_urls_json | STRING | — |
| first_media_url | STRING | — |
| result_json | STRING | — |
| trace_id | STRING | — |