[ docs ] // Beyond chat
Speech
arcflare gen tts turns text into a .wav with an open text-to-speech model on your own machine. It supports preset voices, tone control and voice cloning, and nothing is uploaded.In two commands#
arcflare gen setup qwen3-tts --torch cudaarcflare gen tts "Hello from ArcFlare."✓ C:\work\hello-from-arcflare-qwen3-tts.wav 5.28s of audio · 24.0 kHz · 248 KB · made in 43.3s · cuda
The first run downloads the weights. After that, nothing touches the network. That run was on an integrated AMD GPU, where Qwen3-TTS generates at roughly 8–9 seconds per second of audio even with the model already loaded. A dedicated NVIDIA card is much faster.
The models#
| Model | Size | VRAM | Clones | Notes |
|---|---|---|---|---|
| qwen3-tts | 1.7B | ~6 GB | — | Default. Preset voices, 10 languages, --instruct for tone |
| qwen3-tts-0.6b | 0.6B | ~3 GB | — | The same voices with less memory |
| qwen3-tts-clone | 1.7B | ~6 GB | yes | Clones from ~3 s of audio; needs --ref and --ref-text |
| kokoro | 82M | ~1 GB | — | Tiny and fast, and runs on the CPU too |
| chatterbox | 0.5B | ~4 GB | yes | 23 languages via --lang; MIT |
| voxcpm2 | 2B | ~8 GB | — | Highest quality, 48 kHz; wants CUDA 12+ |
| outetts | 0.6B | ~2 GB | yes | 14 languages |
| kitten-tts-2 | 1.7B | ~4 GB | yes | Clones from 5-30 s, no transcript; 47 voices, emotion tags, CPU-friendly |
All of these are Apache-2.0 or MIT except Kitten TTS 2, whose Stellon Labs Community License is free below USD 1M in revenue or funding and asks for attribution. The VRAM figures are estimates where a model card gives none. Set a default with arcflare gen default kokoro.
Setup#
Each speech model gets its own Python environment under ~/.arcflare/gen/envs. That isn't over-caution: qwen-tts pins an exact transformers version, and installing it next to Hunyuan3D would downgrade the library Hunyuan needs. Separate environments mean installing one model can never break another.
Torch works the same way as for 3D generation: name the build, or borrow a working one.
arcflare gen setup qwen3-tts --torch cudaarcflare gen setup qwen3-tts --torch-from C:\path\to\python.exepy -3.12 first when it creates that environment. With --torch-from, the environment takes the donor's Python version instead.Voices, tone and cloning#
Preset voices
arcflare gen tts "Good morning." -m kokoro --voice bf_emmaKokoro's voice names start with their language: af_ is American English and bf_ is British. For Qwen3-TTS, a wrong --voice lists the voices that model actually has.
Tone and emotion
arcflare gen tts "We shipped it!" --instruct "excited, a little out of breath"arcflare gen tts "We won <laugh> I can (((hardly))) believe it!" -m kitten-tts-2 --instruct joyfulQwen3-TTS 1.7B takes a free-form instruction. Kitten TTS 2 takes one emotion (angry, contemplative, excited, joyful, mundane, nervous, sad, stern, surprised, tender), plus <laugh>, <sigh> and (((emphasis))) tags in the text.
Clone a voice
arcflare gen tts "Now it sounds like me." -m chatterbox --ref me.wavarcflare gen tts "Now it sounds like me." -m qwen3-tts-clone --ref me.wav --ref-text "the words in me.wav"arcflare gen tts "Now it sounds like me." -m kitten-tts-2 --ref me.wavSaved voices
Keep a clip under a name and clone it by name on any model that clones. --clone fills in --ref and --ref-text.
arcflare gen voices add narrator clip.wav --text "what the clip says"arcflare gen tts "Chapter one." -m kitten-tts-2 --clone narratorVoices are stored in ~/.arcflare/voices. The desktop app's voice lab saves to the same place: it records from your microphone with a passage to read, trims the silence, and can play one line through every cloning model side by side. arcflare gen voices lists them; rm deletes one.
Longer text
arcflare gen tts --file chapter1.txt -m kokoro -o chapter1.wavFlags#
| Flag | Does |
|---|---|
| -m, --model <id> | Which speech model (default qwen3-tts) |
| -o, --out <file.wav> | Where to write it (default: the current folder, named after the text) |
| --file <text.txt> | Read the text from a file |
| --voice <name> | A preset voice (model-specific) |
| --lang <code> | Language: en, zh, fr, … (Qwen3-TTS auto-detects) |
| --instruct "…" | Tone (qwen3-tts 1.7B) or one emotion (kitten-tts-2) |
| --ref <clip.wav> | Clone this voice (kitten-tts-2, chatterbox, outetts, qwen3-tts-clone) |
| --clone <name> | Clone a saved voice (arcflare gen voices) |
| --ref-text "…" | Transcript of the clip (qwen3-tts-clone) |
| --speed <n> | Speaking rate (kokoro) |
| --device cuda|mps|cpu | Override the device |
Wrong combinations are refused before any model loads. Asking Kokoro to clone a voice, or giving --instruct to a model that ignores it, fails in a second, not after a minute of loading.
From the agent#
The machine server has a generate_speech tool, so arcflare agent or any MCP client can narrate, make voice-overs or read results aloud. Like generate_3d, it hands back a job id rather than timing out.
generate_speech: text → .wav, withmodel,voice,ref,clone,langandinstructgenerate_job: wait for it, or cancel it