Nodes/ComfyUI-Raon-OpenTTS/Raon OpenTTS Generate (Voice Clone)
ComfyUI Node

Raon OpenTTS Generate (Voice Clone)

Clone a voice in ComfyUI with zero training and zero API keys

By Saganaki22·Created 26 days ago·Updated 26 days ago· 12
Raon OpenTTS Generate (Voice Clone)
  • raon_model
  • ref_audio
  • audio
textHello! This is Raon OpenTTS running natively inside ComfyUI.
ref_text
steps32
cfg_strength2.00
sway_sampling_coef-1.00
speed1.00
seed42
fix_duration_seconds0.0
target_rms0.10
use_vad_durationtrue
cross_fade_ms150
do_splittrue
max_chars0

Give this node a few seconds of somebody talking, plus a line of text, and it reads that text back in their voice. That's the whole trick. Raon OpenTTS Generate (Voice Clone) is the payoff node of the Raon-OpenTTS pack: KRAFTON's open-weight, zero-shot voice cloning, running natively inside ComfyUI with no API call, no key, no training run. If you've seen the F5-TTS-style flow-matching crowd, this is the same family - and the same disclaimer that comes with all of it: the weights are CC-BY-NC, so it's for personal and research use, not something you ship in a paid product.

How it works

Under the hood it's a conditional flow-matching (CFM) Diffusion Transformer - the same non-autoregressive lineage as F5-TTS - that generates mel spectrogram frames conditioned on your reference clip, then pushes them through a HiFi-GAN vocoder to turn them into actual 16 kHz audio. No autoregressive next-token loop, so it's fast, and no per-voice training: the reference clip is the conditioning.

A few official defaults are wired in and they're genuinely good, so you can leave them alone at first: 32 steps (NFE for the euler + EPSS ODE), CFG 2.0, sway sampling at -1.0, target RMS 0.1, and a 150 ms cross-fade between chunks. Long text gets split into chunks and generated one at a time, then cross-faded, with the chunk budget auto-estimated from your reference speaker's speech rate. Seed defaults to 42 (0 = random, and it increments per chunk so multi-chunk runs stay reproducible).

The inputs that actually matter

The two you can't skip are ref_audio and ref_text: the voice clip and its exact transcript. Clean speech with little background noise clones best, and the transcript matters more than people expect - this is where most "it sounds off" complaints come from. Feed ref_text from the Raon Whisper Transcribe node rather than typing it by hand; the generate node will outright refuse to run if it's empty.

  • text - what you want said. Long text is split automatically.
  • ref_audio - the reference clip (AUDIO type, comes straight from a Load Audio node).
  • ref_text - exact transcript of that clip.
  • steps and cfg_strength - 32 and 2.0 are the official defaults; drop steps if you want speed, raise CFG if the voice sounds flat.
  • do_split / max_chars - leave split on; max_chars at 0 auto-sizes chunks from the speaker's speech rate. Set a positive value only if you want deterministic, speaker-independent chunking.

The output is a single audio (AUDIO) at 16 kHz, so it plugs straight into a save node or anything downstream that eats ComfyUI audio.

Installing it

ComfyUI Manager will find it if you search "ComfyUI-Raon-OpenTTS", or:

cd ComfyUI/custom_nodes
git clone https://github.com/Saganaki22/ComfyUI-Raon-OpenTTS
# then restart ComfyUI

It pulls in the usual TTS stack - torchdiffeq, transformers, accelerate, pydub, soundfile, plus jieba/pypinyin for the text pipeline and comfy-kitchen if you use the quantized build. On first run the loader downloads the model checkpoint (and the HiFi-GAN vocoder) from the drbaph/Raon-OpenTTS-comfyui Hugging Face repo into ComfyUI/models/raon_opentts - only the selected build, not the whole repo. The 1B INT8 build peaks around 1.7 GB VRAM during inference, which is the pleasant surprise of this pack: full voice cloning that doesn't fight your image workflow for the card.

Where people get burned

  • Empty ref_text. The node raises a clear error telling you to run Raon Whisper Transcribe first. It's not being fussy - the transcript is part of the conditioning.
  • 16 kHz English. The checkpoints are 16 kHz and English-first. Non-English text won't behave, and whatever you clone, the output won't be studio CD quality - it's a voice-over voice, not a song vocal.
  • The non-commercial license. CC-BY-NC-4.0 on the weights, matching upstream KRAFTON. Fine for personal and research work; not for a commercial product.
  • First-run downloads. The whole thing only happens once, but the first generate can stall while weights land. Watch the console, not just the progress bar.
CategoryRaonOpenTTS

Inputs (15)

NameTypeDefaultDescription
raon_modelRAON_OPENTTS_MODEL
textSTRINGHello! This is Raon OpenTTS running natively inside ComfyUI.Text to synthesize. Long text is split into chunks automatically and cross-faded together.
ref_audioAUDIOReference voice clip for zero-shot cloning. Clean speech with little noise works best.
ref_textSTRINGExact transcript of the reference clip. Strongly improves cloning quality. Use the Whisper Transcribe node to generate it.
stepsINT321–64NFE steps for the flow-matching ODE (euler + EPSS schedule). 32 is the official default.
cfg_strengthFLOAT2.000–10Classifier-free guidance strength. 2.0 is the official default; 0 disables CFG.
sway_sampling_coefFLOAT-1.00-2–2Sway sampling coefficient for the time schedule. -1.0 is the official default.
speedFLOAT1.000.5–2Speech-rate multiplier for duration estimation (>1 = faster).
seedINT420–21474836470 uses the current random state. A positive value is repeatable (incremented per text chunk).
fix_duration_secondsFLOAT0.00–60Force the generated segment length in seconds. 0 estimates it from the reference speech rate (official behaviour).
target_rmsFLOAT0.100–0.5Loudness normalization target for the reference clip (official: 0.1).
use_vad_durationBOOLEANtrueEstimate the generation length from the VAD-trimmed reference length (official default, robust for quiet speakers) while conditioning on the untrimmed audio.
cross_fade_msFLOAT1500–500Cross-fade between generated text chunks in milliseconds (official: 150).
do_splitBOOLEANtrueSplit long text into chunks and generate them one by one (cross-faded together). Off = always one chunk, whatever the length.
max_charsINT00–2000Chunk size budget in UTF-8 bytes. 0 = auto, estimated from the reference speech rate (official behaviour: ref_bytes/ref_seconds x (22 - ref_seconds)). Any positive value forces that budget, so the split becomes deterministic across speakers.

Outputs (1)

NameTypeDescription
audioAUDIO