Nodes/TTS Audio Suite/๐ŸŽญ Character Voices
ComfyUI Node

๐ŸŽญ Character Voices

The right way to feed a reference voice

By diodiogodยทCreated 12 months agoยทUpdated 18 days agoยท 1,098
๐ŸŽญ Character Voices
  • opt_audio_input
  • opt_narrator
  • character_name
  • reference_audio_only
โ—„voice_namenoneโ–บ
โ—„reference_textโ–บ
โ—„trim_start0.00โ–บ
โ—„trim_end0.00โ–บ
โ—„customizedfalseโ–บ

Voice cloning is only as good as the reference you feed it, and this is the node that packages that reference properly. ๐ŸŽญ Character Voices takes a voice clip - a bundled example, a saved character, or your own audio - bundles it with its transcript and a name, and hands the whole thing to a TTS engine as a clean NARRATOR_VOICE. It's the difference between "here's some audio, good luck" and "here's the voice, here's exactly what it says, here's who it is." For engines that clone best with a transcript (F5-TTS, IndexTTS-2, Qwen Base, and friends), this node is basically mandatory if you want the good results.

How it works

A lot of TTS engines don't just want a voice sample - they want the text of that sample, because matching audio to transcript is how they figure out the speaker's timbre and cadence cleanly. The narrator_voice dropdown on TTS Text only gives you the audio. Character Voices gives you audio plus reference transcript plus a character name, in the three-file format the suite uses internally (name.wav, name.reference.txt, and metadata). Connect its output and the engine gets everything it needs to clone well and to slot into character-switching workflows.

The inputs and outputs that matter

  • voice_name - pick a voice. The dropdown lists the bundled examples (voices_examples/... - Attenborough, Clint Eastwood, generic male/female, the Higgs set) plus any character voices you've saved. Set none if you're supplying your own audio instead.
  • reference_text - the transcript of the reference clip. This is the field people skip and then wonder why cloning is mediocre. If you're using your own audio, type exactly what's said in it. For a bundled voice its transcript is already known.
  • opt_audio_input (optional AUDIO) - feed your own clip here instead of picking from the dropdown, then pair it with an accurate reference_text.
  • trim_start / trim_end - shave seconds off the front/back of the clip to cut silence, breaths, or a stray noise before it becomes part of the voice fingerprint.
  • customized - a flag for using a customized/edited reference rather than the stock one.

Three outputs: opt_narrator (the NARRATOR_VOICE bundle - this is the main one, wire it to a TTS engine's or TTS Text's narrator input, or into IndexTTS-2's emotion_audio), character_name (a string, handy for labeling), and reference_audio_only (just the trimmed AUDIO, if some other node wants the raw clip).

Installing it

Ships with TTS Audio Suite. Easiest: ComfyUI Manager โ†’ search TTS Audio Suite โ†’ install โ†’ restart. Manager runs the pack's install.py, which handles the dependency conflicts (NumPy, librosa, s3tokenizer) and Python 3.13. Manual: cd ComfyUI/custom_nodes && git clone https://github.com/diodiogod/TTS-Audio-Suite.git, then python install.py from inside the folder with your ComfyUI venv active - run the script, not just pip install -r requirements.txt. Linux needs portaudio19-dev libsamplerate0-dev. This node has no model of its own; the example voices come with the pack, and your saved characters live under models/voices/.

Common issues

  • Blank or wrong reference_text. The single biggest quality killer. Transcript-hungry engines (F5, IndexTTS-2, Qwen ICL) clone noticeably worse without an accurate transcript. Fill it in and make it match.
  • A noisy reference poisons the clone. If the source clip has music, room hiss, or breath at the edges, that leaks into every generation. Trim it with trim_start/trim_end, and consider cleaning the clip through ๐Ÿค Voice Fixer first.
  • Reference too short or too long. A few clean seconds of clear speech beats thirty noisy ones. Aim for a representative, clean sample.
  • Connected the wrong output. opt_narrator is the one engines want. reference_audio_only is just the raw audio and won't carry the transcript/name, so cloning falls back to worse behavior if you route that by mistake.
CategoryTTS Audio Suite/๐ŸŽญ Voice & Character

Inputs (6)

NameTypeDefaultDescription
voice_nameCOMBOnoneUse 'none' to rely on direct audio input + input text. Select character voice from models/voices/ or voices_examples/ folders. IMPORTANT: Character Voices node requires a .txt file with the same name as the audio file to recognize it as a character. FILE REQUIREMENTS: โ€ข filename.wav + filename.txt (basic setup) โ€ข filename.wav + filename.reference.txt โ€ข filename.wav + filename.txt + filename.reference.txt (both files) PRIORITY SYSTEM - When both .txt and .reference.txt exist: โ€ข .reference.txt = actual spoken text transcription (used for voice cloning) โ€ข .txt = audio information/metadata (license, etc.)
reference_textSTRINGCreate reference text on-the-fly for connected audio input. ENGINE REQUIREMENTS: โ€ข F5-TTS: REQUIRES reference text (must match spoken audio exactly) โ€ข Higgs Audio 2: Optional but uses reference text if provided โ€ข ChatterBox/VibeVoice/IndexTTS: Don't use reference text Selecting a library voice loads its transcription here automatically. Edits are temporary workflow overrides and never modify the source .txt file.
trim_startFLOAT0.000โ€“100000Start of the derived reference clip in seconds. The custom timeline controls this value.
trim_endFLOAT0.000โ€“100000End of the derived reference clip in seconds. 0 means the end of the source audio.
customizedBOOLEANfalseInternal UI state: the selected library voice has a temporary text or trim override.
opt_audio_inputoptAUDIODirect audio input for voice reference (used when voice_name is 'none' or to override selected voice)

Outputs (3)

NameTypeDescription
opt_narratorNARRATOR_VOICEโ€”
character_nameSTRINGโ€”
reference_audio_onlyAUDIOโ€”