Voice

The Voice tab turns text into speech on your own GPU, optionally in a voice you recorded. LlamaForge does not do the speaking: llama.cpp ships a text-to-speech tool, llama-tts, and LlamaForge runs it with one of the models it supports, then gives you a UI and an OpenAI-style endpoint for it.

Models

ModelSizeLanguagesLicenceGood for
Qwen3-TTS 1.7B2.1 GiB (Q8_0)10Apache-2.0Quality, any language, voice cloning. Best on a GPU.
Pocket TTS (English)209 MiBEnglishCC-BY-4.0Speed: faster than real time even on a CPU. Always needs a voice clip.

Install either or both from the tab. Getting Pocket TTS also saves a starter voice, a clip from Kyutai's donated voices (CC0), so it can speak right away.

Most TTS GGUFs on Hugging Face are made for other runtimes and do not load in llama-tts: for example the Qwen3-TTS and Pocket TTS repos packaged for qwentts.cpp, pockettts.cpp or CrispASR, and models such as Kokoro, Chatterbox, Dia, Orpheus or F5-TTS. llama-tts needs a backbone plus an mmproj audio projector of the qwen3tts or pockettts architecture.

Set up

Two things are needed, and the tab tells you which one is missing:

  1. llama-tts, next to your llama-server. Official llama.cpp builds include it. A source build from Build / Update builds it as well; an older source build may only have the server, so rebuild once.
  2. A model. Each Get button downloads a backbone and its audio projector into <root>/tts/models/ (or tts_dir in config.json); extra models go in a subfolder each. Speech models are kept apart from your chat models and never appear in the Models list. To add a compatible model by hand, put the .gguf and its mmproj-*.gguf in a new subfolder; the tab reads the architecture from the file.

Speak

Type up to 2000 characters, pick a model (when you have more than one), a voice and, for Qwen3-TTS, a language (en, zh, de, it, pt, es, ja, ko, fr, ru), and press Speak. You get a waveform, a player and a WAV download.

Each request starts llama-tts, loads the model, speaks and exits, so no VRAM is held between requests. One request runs at a time. On an RTX 5080, a sentence takes about 3 to 4 seconds with Qwen3-TTS including the model load, a little faster than the audio plays back. Pocket TTS takes about a second for the same sentence, and about 1.5 seconds on the CPU alone.

Voices

A voice is a short reference clip of someone speaking. The model speaks in the voice of the clip. Record a clip uses your microphone (up to 30 seconds), Upload a clip takes any audio file your browser can play. Either way, the browser converts it to 24 kHz mono WAV, trims the silence at both ends and asks for a name. Clips are stored as <root>/tts/voices/<name>.wav; 5 to 20 seconds of clear speech in a quiet room works best.

[!IMPORTANT] Only clone voices you have permission to use: your own, or someone who agreed to it.

Without a voice, Qwen3-TTS picks its own; Pocket TTS uses your first saved voice, and refuses to speak if you have none. Set tts_default_voice in config.json to use one of your voices whenever a request doesn't name one.

Use it from code

The panel serves POST /v1/audio/speech, shaped like OpenAI's speech API:

curl http://127.0.0.1:8090/v1/audio/speech \
  -H "Content-Type: application/json" \
  -d '{"model":"tts-1","input":"Hello from my own GPU.","voice":"alloy"}' \
  -o speech.wav

Errors use the OpenAI shape ({"error": {"message", "type"}}): 400 for a bad request, 503 when speech isn't set up, 500 with the tail of the llama-tts log when it fails. When the router is reachable from your network (router_host is not 127.0.0.1), the endpoint asks for the router's API key, as Authorization: Bearer <key> or x-api-key, like the other endpoints on the panel.