UtteraUttera

How to run your own voice server, step by step

September 15, 2026

You need a machine with Linux installed, preferably some version of Ubuntu, and root access. You also need an NVIDIA graphics card with its driver working: this does not run on CPU at any useful speed.

And you don't need an account with us. The engines that move Uttera are published under the Apache 2.0 license and can be stood up without asking anyone's permission. This post is the complete path.

Before starting: what you'll end up with

Two HTTP services running on your machine:

Both speak the OpenAI API, so the official openai SDK works against them by changing the base URL. Your audio never leaves your network.

Step 0: choosing the engine, which is the decision that matters

There are two families, and choosing wrong is the fastest way to lose an afternoon. The difference isn't quality: it's how they use GPU memory.

Your GPU What to install
8 – 24 GB of VRAM hot/colduttera-stt-hotcold and uttera-tts-hotcold
32 GB or more vLLMuttera-stt-vllm and uttera-tts-vllm

Hot/cold loads and unloads the model as needed, so you can share the GPU with other things. It's what you want on a personal machine or a home lab.

vLLM reserves the memory at startup — some 22 to 29 GB — and in exchange does continuous batching: many concurrent requests at once, with far better utilization. It's what you want if you're going to transcribe hours of audio a day.

Between 16 and 24 GB, vLLM works, but it takes the whole card and you lose exactly the flexibility that makes hot/cold useful in that range. If in doubt, start with hot/cold: you can change later.

If you'd rather have numbers than advice, they're published and reproducible in uttera-benchmarks, with four load profiles and two corpora.

Step 1: the system

sudo apt update
sudo apt install -y git python3 python3-venv ffmpeg curl file espeak-ng

ffmpeg isn't optional: it's what converts to mp3, opus and flac. espeak-ng is used by synthesis to turn text into phonemes.

For the GPU, the NVIDIA driver the normal Ubuntu way (ubuntu-drivers usually does it). Check it before going on:

nvidia-smi

If that doesn't show you the card, stop here and fix it. Everything else depends on it.

And add your user to the groups that grant device access:

sudo usermod -aG video $USER
sudo usermod -aG render $USER

Log out and back in, or the groups don't apply. It's failure number one.

Step 2: transcription

The repository is uttera-stt-hotcold — Whisper with the hot/cold worker architecture. The full README, the model table and the environment variables are there.

git clone https://github.com/uttera/uttera-stt-hotcold.git
cd uttera-stt-hotcold
chmod +x setup.sh
./setup.sh

setup.sh creates the virtual environment, installs the dependencies and downloads the model. It's safe to run again if something fails halfway.

The model choice is yours and it's a trade-off between memory and quality:

Model VRAM Notes
small ~2 GB Balanced, for small machines
medium ~5 GB Default
turbo ~6 GB The recommended one. Distilled from large-v3: almost its quality at much higher speed
large-v3 ~10 GB Maximum accuracy

It's chosen with WHISPER_MODEL in the .env file. All 99 languages are in every model except the .en variants.

Starting it by hand, to see that it lives:

source venv/bin/activate
uvicorn main_stt:app --host 127.0.0.1 --port 9005

Step 3: synthesis

The repository is uttera-tts-hotcold — a synthesis server with interchangeable backends (Coqui XTTS-v2, VoxCPM2 and more) behind a single environment variable, TTS_BACKEND.

git clone https://github.com/uttera/uttera-tts-hotcold.git
cd uttera-tts-hotcold
chmod +x setup.sh
./setup.sh

There's one more decision here: the voice engine is changed with a variable, TTS_BACKEND.

A warning that's in the repository itself and is worth reading before wasting time: the voxcpm backend in hot/cold is not for production. Its torch.compile path doesn't get along with the subprocess pool and causes a CUDA allocator race under concurrent load — confirmed by the VoxCPM maintainers. For that engine in earnest, the right repository is uttera-tts-vllm. In hot/cold it stays for development and testing, and it warns you on load.

About the voices: setup_assets.sh leaves you the six standard voices. The reference voices for cloning are not included, for rights reasons: you put your own .wav files in assets/voices/elite/ and register them in voices.json. No code to touch.

Step 4: checking it works

Transcribe:

curl -X POST http://localhost:9005/v1/audio/transcriptions \
  -F "file=@sample.wav" \
  -F "language=en"

Synthesize:

curl -X POST http://localhost:9004/v1/audio/speech \
  -H 'Content-Type: application/json' \
  -d '{"input":"Hello world","voice":"alloy"}' \
  -o hello.mp3

If both answer, you have the server. The rest is making it start on its own.

Step 5: making it start on its own

A systemd user service is enough, and it doesn't need root:

# ~/.config/systemd/user/uttera-stt.service
[Unit]
Description=Uttera STT Hot/Cold Server
After=network.target

[Service]
Type=simple
WorkingDirectory=%h/uttera-stt-hotcold
ExecStart=%h/uttera-stt-hotcold/venv/bin/uvicorn main_stt:app --host 127.0.0.1 --port 9005
Restart=always
RestartSec=5

[Install]
WantedBy=default.target
systemctl --user daemon-reload
systemctl --user enable --now uttera-stt.service

The synthesis one is the same with a different directory, main_tts:app and the port.

If you have a big GPU: the vLLM path

Two different repositories, uttera-tts-vllm and uttera-stt-vllm, built on vLLM to get the most out of a dedicated card. Change the repository and little else:

git clone https://github.com/uttera/uttera-tts-vllm.git
cd uttera-tts-vllm
cp .env.example .env
./setup.sh
source venv/bin/activate
uvicorn main_tts:app --host 0.0.0.0 --port 9004

With uttera-stt-vllm the same, with main_stt:app and port 9005. Here setup.sh also pre-downloads the model and the voices.

What you won't find on GitHub, and it's worth saying

What's published are the engines: what turns audio into text and text into audio. That is the real work and it's what runs on your machine.

What is not published is the service layer on top at uttera.ai: API keys, credit control, distribution across several machines, billing. That's our product, and building it yourself makes sense if what you want is to sell voice to third parties — but if what you want is for your audio not to leave your network, you need none of it.

Put another way: if this guide solves your problem, we're perfectly happy for you not to pay us. And if one day you'd rather not maintain GPUs, we're here.

Where to go next

And if you get stuck, write anyway: support@uttera.ai. You not being a customer doesn't mean we don't want to know where the guide falls down.

Anything to add or correct? Write to support@uttera.ai. If you correct us, we edit the post and credit you.

← All posts