FireRedTTS3 Voice Design
Type 'gentle young female voice' and get a voice that doesn't exist yet
- firered_model
- audio
- voice_plan
Voice cloning gives you someone's voice. This node gives you a voice that belongs to nobody - describe it in plain English and FireRedTTS3-Instruct builds it from scratch. No reference clip, no consent issues, no "is that a real person" baggage. It's the node you reach for when you want a narrator or a character voice and you'd rather design one than borrow one.
Here's how it works, and the trick is worth understanding before you type anything. The instruct model treats your instruction as a prompt and first writes a short voice plan - a chain-of-thought describing the voice attributes (gender, age, timbre, pace, emotion) - and then synthesizes audio that matches that plan. That plan is not hidden from you: the node returns it as the voice_plan output alongside the audio. Read it once, and you'll get a feel for how the model interprets your words, which makes iterating on the instruction dramatically less random. Describing the default, "A gentle young female voice, speaking a little slowly, with a playful touch", is the right shape: gender, age, timbre, pace, mood. The model card's Chinese examples work just as well as templates.
The inputs you actually care about:
instruction- the voice description, in natural language. This is the whole point of the node.text- what the designed voice should say.language- the language of that text, used for text normalization and sentence splitting. Not for conditioning the voice itself - and that distinction is the trap.
The trap, stated plainly: voice design only works reliably in Chinese and English. That's an upstream limitation, not a bug in the pack - with no reference audio and no language tag, the model has nothing to condition language on, and the upstream benchmark only evaluates zh/en. Pick another language and you get accented or garbled speech. The README's workaround is a clean two-step: design the voice in English or Chinese, clone that output with the base model, and tag the language there. It costs one extra generation and gets you the designed voice speaking anything.
The next four inputs are the sampling controls for that voice-plan text: text_temperature (0.7 default), text_top_p (0.8), text_top_k (20), and text_repetition_penalty (1.0). These govern how varied the plan is, not the audio itself. Crank temperature if every voice comes out same-y; leave them alone otherwise - the official defaults are there for a reason.
Then the standard generation controls, identical to the clone node: n_timesteps 10, inference_cfg 1.2 here (not the clone's 2.0 - design and edits run softer CFG), stop_threshold, seed, max_audio_seconds, and the do_tn/do_split/cross_fade_ms frontend trio for normalization and long-text handling.
Outputs are audio (AUDIO) and voice_plan (STRING). Wire the audio to a save node or downstream video, and if you want, hook voice_plan into a text preview to see what the model decided to make.
Two things will bite you if you skip them. First, this node requires the instruct variant - load fireredtts3_instruct in the loader, not base, or you'll get the pack's "requires the Instruct model" error. Second, language on this node defaults to auto, but given the zh/en-only ceiling you may as well set it explicitly and skip the guesswork. Everything else is the pack's standard story: install via ComfyUI Manager or git clone + python install.py, Transformers 5.3+, multi-gigabyte first download, and 8–14 GB VRAM. The design-versus-clone distinction is the one genuinely novel trick in the whole pack, and for audiobook narration or character dialogue it's the reason to load instruct instead of base.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| firered_model | FIREREDTTS3_MODEL | — | |
| instruction | STRING | A gentle young female voice, speaking a little slowly, with a playful touch. | Natural-language voice description (gender, age, timbre, emotion, pace, accent). Any language works; the model card's Chinese examples are also good templates. No reference audio needed. |
| text | STRING | Hello! This is FireRedTTS3 running natively inside ComfyUI. | Text to synthesize with the designed voice. |
| language | COMBO | auto | Language of the text; used for text normalization and sentence splitting only. Voice design synthesis itself only works reliably in Chinese/English (upstream limitation: no language conditioning without a reference clip); other languages produce accented/garbled speech. For other languages, design the voice in English/Chinese, then clone the result with the base model and a language tag. |
| text_temperature | FLOAT | 0.700–2 | Sampling temperature for the model's voice-plan text (Chain-of-Thought). |
| text_top_p | FLOAT | 0.800–1 | Top-p for the voice-plan text. |
| text_top_k | INT | 200–500 | Top-k for the voice-plan text. 0 disables. |
| text_repetition_penalty | FLOAT | 1.001–2 | Repetition penalty for the voice-plan text. 1.0 is the official default. |
| n_timesteps | INT | 101–50 | Flow-matching steps per generated audio patch. 10 is the official default; more is slower with diminishing returns. |
| inference_cfg | FLOAT | 1.200–4 | Classifier-free guidance strength for the flow head. 0 disables CFG. Official defaults: 2.0 for cloning, 1.2 for design/edits. |
| seed | INT | 420–2147483647 | 0 uses the current random state. A positive value is repeatable. |
| max_audio_seconds | FLOAT | 644–160 | Hard cap on generated audio length per sentence (64s is the official maximum). |
| do_tn | BOOLEAN | true | Run text normalization (numbers, dates, units to spoken form). Chinese/English use local wetext; other languages get basic cleaning. |
| do_split | BOOLEAN | true | Split long text into sentences and generate them one by one (cross-faded together). |
| cross_fade_ms | FLOAT | 500–500 | Cross-fade between sentence segments in milliseconds. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| voice_plan | STRING | — |