AuK Chained Clone X
The node that makes voice cloning scriptable
- model
- encoder
- vae
- reference_audio
- reference_audio_2
- audio
- segment_report
Why you'd reach for it
Local voice cloning got good. Chatterbox made it competitive with the paid services, F5-TTS made it fast, and for a single line of speech that's a solved problem. What none of them give you is a script. You get one clip at a time, so a two-minute scene becomes twenty generations, twenty slightly different performances, and twenty files to join by hand.
AuK Chained Clone X is built for exactly that gap: one reference recording, one text box, one line per row. Each line is cloned independently from the same voice, then joined in order - with per-line delivery styles, audio conversions, explicit lengths and silence between lines.
That's a genuinely different shape from one-shot cloning, and it's the reason to put up with the rest.
How it works
You need the standard three: model (AuK Model Loader X), encoder (AuK Encoder Loader X) and vae (AuK VAE Loader X), plus reference_audio - the recording that supplies the voice. With multi_speaker off, that recording is used for every line, and you need reference_audio_2 only if a line asks for Voice 2.
script is the interesting input. One spoken line per row, and the syntax is positional:
[Happy] Hello there, how are you? (3s)
[Shy][c-whisper] This is our little secret. (3s)
[c-speed:0.8][c-pitch:+3.5] Let me explain.
The leading bracket is one voice style - delivery, not an edit. Everything after it is a conversion, applied in the order you wrote them, each working on the result of the previous one. Length comes from a trailing (2.5s), or from the spoken word count divided by words_per_second (default 2 - higher means less time for the same words). Tags and timings don't count as words.
The distinction between styles and conversions is the part that trips everyone. [laughs] is a style: speak while laughing. [c-laugh] is a conversion: add a laugh before the words. Same for [whispers] versus [c-whisper]. And if you have an older script with several styles stacked, the node tells you which line is wrong rather than guessing which one you meant - you pick one style and convert the rest.
multi_speaker turns on the dialogue syntax: @voice1 or @voice2 before the line's tags. An unmarked line continues the previous speaker, and before any speaker is set, Voice 1 wins. Prefixes never become spoken words. inline_edits goes further and lets you mark spans inside a line - <sad>i am still here!</sad> - where only the marked words get the treatment and the pieces are joined. Phrase-sized selections sound better than two-word ones.
The assembly settings are gap_seconds (silence between finished lines only), sound_extra_seconds (default 0.5 - extra time for each added laugh, cough or breath) and speed_timing_multiplier (extra room for c-speed; 1 uses the calculated duration, and lines without speed tags are unaffected).
Sampling is the usual AuK trio: steps (32), guidance (2), sway (-1) - Base only, since Flash runs its fixed four steps and ignores them. seed seeds the run; each line starts at base seed plus its index, and conversions add their position, so keep the seed and choose fixed if you want a repeatable script.
Outputs are audio (wire it to Preview or Save Audio) and segment_report - which is not decoration. It lists each line's instruction, parameter, seed, requested versus actual length and the finished timings. When a line comes out wrong, that's where you find out which one.
Install
ComfyUI Manager → search WorkflowX Configurator, or:
cd ComfyUI/custom_nodes
git clone https://github.com/haroonaslam/WorkflowX-Configurator
cd WorkflowX-Configurator
pip install "transformers>=5.3,<6" safetensors PyYAML tqdm
Then the weights from drbaph/AuK-comfyui: a checkpoint in models/diffusion_models/, the converted Qwen encoder in models/text_encoders/, auk_vae.safetensors in models/vae/. Weights only - the configs and tokenizer come with the pack. Restart ComfyUI and hard-refresh; the script editor is a frontend feature.
Where it goes wrong
Expect the model's limits. AuK's own documentation says prompt adherence isn't strong, and it's not being modest - voice continuity, word preservation and exact dB or pitch changes all vary. It reads the request; it doesn't guarantee it.
You are early here. AuK has essentially no community footprint - an exact-phrase search of the r/StableDiffusion and r/comfyui corpus turns up nothing - so there's no pile of other people's settings to copy. The bundled examples (04_chained_clone.json, 05_two_speaker_clone.json, 06_inline_review_clone.json) are your reference.
Audio is mono 24 kHz, joined without normalization, crossfades or trimming. If a line is louder than its neighbours, that's yours to fix downstream, not something the join will smooth out. And several added sounds are each requested at the start of the current clip, so their audible order can differ from the tag order.
One tooltip worth pinning to the wall: the styles and conversions request delivery and edits; listen to the result before you build the next twenty lines on it.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| model | WORKFLOWX_AUK_MODEL | — | |
| encoder | WORKFLOWX_AUK_ENCODER | — | |
| vae | VAE | — | |
| reference_audio | AUDIO | The first speaker's recording. Used for every line when Multi-speaker is off. | |
| script | STRING | [Happy] Hello there, how are you? (3s) [Shy][c-whisper] This is our little secret. | Write one spoken line per row. Start with one optional voice style and any conversions. End with (3s) to choose the original length. |
| words_per_second | FLOAT | 2.00.01–100 | Estimates the length of lines without a duration. Higher values allow less time for the same words. |
| gap_seconds | FLOAT | 0.000–3600 | Adds silence between finished lines. |
| seed | INT | 00–18446744073709550000 | Keep this number and choose fixed to repeat the same random choices. Change it to try a different performance. |
| steps | INT | 321–1000 | Controls how much refinement is used. Start with 32. More can take longer; Flash chooses its own setting. |
| guidance | FLOAT | 2.00–100 | Controls how strongly the voice follows your request. Start with 2. Flash chooses its own setting. |
| sway | FLOAT | -1.00-1–0 | Fine-tunes how the sound is refined. Leave at -1 unless you want to experiment. Flash chooses its own setting. |
| sound_extra_secondsopt | FLOAT | 0.500–3600 | Allows additional time for each laugh, cough, or other sound you add. |
| reference_audio_2opt | AUDIO | The second speaker's recording. Needed when a line uses @voice2 with Multi-speaker on. | |
| multi_speakeropt | BOOLEAN | false | Use @voice1 or @voice2 before a line's tags. Unmarked lines continue the previous speaker, starting with Voice 1. Turn off to use Voice 1 for all lines. |
| inline_editsopt | BOOLEAN | false | Select words to change their delivery or add a sound before them. Turn off to speak the words without these changes. |
| review_each_lineopt | BOOLEAN | false | Generate all lines and send the recording onward. Browse, regenerate, or add lines here, then Finalize to send your revised recording. |
| speed_timing_multiplieropt | FLOAT | 1.000.01–100 | Extra room for speech controlled by speed tags. 1 uses the calculated duration; higher values allow more time. Lines without speed changes are unaffected. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| segment_report | STRING | — |