Nodes/ComfyUI-ChatTTS/ChatTTS Voice Extractor
ComfyUI Node

ChatTTS Voice Extractor

Cloning a voice without a second model

By neverbiasu·Created about a year ago·Updated about a year ago· 4
ChatTTS Voice Extractor
  • model
  • audio
  • DICT

Give it a clip of someone talking and it hands you the keys to a voice that sounds like them. The Voice Extractor is the pack's answer to "I don't want a random seed voice, I want that voice." You feed it the loaded model plus any AUDIO, and it returns a DICT speaker embedding that you plug into the Sampler - no fine-tuning, no training, no second model. It's the closest thing this pack has to a one-shot voice clone.

A little honesty up front: this is embedding extraction, not a deep clone. The reference recording becomes a point in ChatTTS's speaker space, so you get the timbre and general character, not a word-perfect impersonation. For anything like "make my narrator sound like this person" it's genuinely useful; for "reproduce this exact recording" it isn't, and no setting will get you there.

How it works

The node takes the AUDIO dict, flattens the waveform to a 1D float array, and does three defensive bits before extraction:

  1. Pads the clip up to the vocoder's FFT window if it's too short - a whisper of audio shouldn't crash the run.
  2. Normalizes the amplitude so an over-loud recording doesn't distort the embedding.
  3. Passes it to ChatTTS's sample_audio_speaker(), which encodes the clip into a speaker embedding via the DVAE.

If the reference audio is garbage, the node fails loudly rather than quietly poisoning your voice - it raises and you'll see the error instead of an embedding that makes everyone sound underwater.

What matters in practice

The two inputs are model and audio, and neither needs touching beyond wiring. The quality comes from the source audio, which is the real lesson here:

  • Clean is king. A few seconds of isolated speech, no background music, no room echo, no overlapping voices. The embedder can only encode what it can hear.
  • A minute of talk beats five seconds. More signal, more stable embedding.
  • Keep levels sane - the node normalizes for you, but a heavily clipped recording has already lost its information.

Wire the DICT into the Sampler's speaker_params, and the extracted voice drives the generation.

Where it fits

The canonical workflow is: load a reference clip (from a file or a recording node), extract the speaker, then sample new text in that voice. The README even sketches a voice-cloning workflow for this - though the example is commented out in the repo, which is a fair tell that the author considers it experimental rather than polished. Treat it that way: great for consistent narration and character voices, don't build a production product on it.

One more thing to know: because the extracted embedding lives in a DICT, you can save it with the pack's Save Speaker Profile node and reload it later without keeping the reference audio around. That's the move for a character you want to reuse across projects.

Categorychattts

Inputs (2)

NameTypeDefaultDescription
modelMODEL
audioAUDIO

Outputs (1)

NameTypeDescription
DICTDICT