[ 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 cuda
arcflare 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#

ModelSizeVRAMClonesNotes
qwen3-tts1.7B~6 GB—Default. Preset voices, 10 languages, --instruct for tone
qwen3-tts-0.6b0.6B~3 GB—The same voices with less memory
qwen3-tts-clone1.7B~6 GByesClones from ~3 s of audio; needs --ref and --ref-text
kokoro82M~1 GB—Tiny and fast, and runs on the CPU too
chatterbox0.5B~4 GByes23 languages via --lang; MIT
voxcpm22B~8 GB—Highest quality, 48 kHz; wants CUDA 12+
outetts0.6B~2 GByes14 languages
kitten-tts-21.7B~4 GByesClones 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 cuda
arcflare gen setup qwen3-tts --torch-from C:\path\to\python.exe
Qwen3-TTS's model card recommends Python 3.12, so setup tries py -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_emma

Kokoro'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 joyful

Qwen3-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.wav
arcflare 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.wav
Only clone voices you have permission to use.

Saved 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 narrator

Voices 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.wav

Flags#

FlagDoes
-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|cpuOverride 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, with model, voice, ref, clone, lang and instruct
  • generate_job: wait for it, or cancel it