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.
Two HTTP services running on your machine:
9005.9004.Both speak the OpenAI API, so the official openai SDK works against them by changing the
base URL. Your audio never leaves your network.
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/cold — uttera-stt-hotcold and uttera-tts-hotcold |
| 32 GB or more | vLLM — uttera-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.
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.
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
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.
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.
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.
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'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.
localhost.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.