Necesitas una máquina con Linux instalado, preferentemente alguna versión de Ubuntu, y acceso con privilegio de root. Necesitas también una tarjeta gráfica NVIDIA con su controlador funcionando: esto no va en CPU a una velocidad que sirva para nada.
Y no necesitas una cuenta con nosotros. Los motores que mueven Uttera están publicados con licencia Apache 2.0 y se pueden levantar sin pedirle permiso a nadie. Esta entrada es el camino completo.
Dos servicios HTTP corriendo en tu máquina:
9005.9004.Los dos hablan la API de OpenAI, así que el SDK oficial de openai funciona contra ellos
cambiando la URL base. Tus audios no salen de tu red.
Hay dos familias, y elegir mal es la forma más rápida de perder una tarde. La diferencia no es de calidad: es de cómo usan la memoria de la GPU.
| Tu GPU | Qué instalar |
|---|---|
| 8 – 24 GB de VRAM | hot/cold — uttera-stt-hotcold y uttera-tts-hotcold |
| 32 GB o más | vLLM — uttera-stt-vllm y uttera-tts-vllm |
Hot/cold carga y descarga el modelo según hace falta, así que puedes compartir la GPU con otras cosas. Es lo que quieres en un equipo personal o en un laboratorio doméstico.
vLLM reserva la memoria al arrancar —unos 22 a 29 GB— y a cambio hace continuous batching: muchas peticiones simultáneas a la vez, con mucho mejor aprovechamiento. Es lo que quieres si vas a transcribir horas de audio al día.
Entre 16 y 24 GB, vLLM funciona, pero se queda la tarjeta entera y pierdes justo la flexibilidad que hace útil a hot/cold en ese rango. Si dudas, empieza por hot/cold: se cambia después.
Si prefieres números antes que consejos, están publicados y son reproducibles en uttera-benchmarks, con cuatro perfiles de carga y dos corpus.
sudo apt update
sudo apt install -y git python3 python3-venv ffmpeg curl file espeak-ng
ffmpeg no es opcional: es lo que convierte a mp3, opus y flac. espeak-ng lo usa la
síntesis para convertir el texto en fonemas.
Para la GPU, el controlador de NVIDIA por la vía normal de Ubuntu (ubuntu-drivers
suele bastar). Compruébalo antes de seguir:
nvidia-smi
Si eso no te muestra la tarjeta, para aquí y arréglalo. Todo lo demás depende de ello.
Y añade tu usuario a los grupos que dan acceso al dispositivo:
sudo usermod -aG video $USER
sudo usermod -aG render $USER
Cierra la sesión y vuelve a entrar, o los grupos no se aplican. Es el fallo número uno.
El repositorio es uttera-stt-hotcold — Whisper con la arquitectura de trabajador hot/cold. Ahí está el README completo, la tabla de modelos y las variables de entorno.
git clone https://github.com/uttera/uttera-stt-hotcold.git
cd uttera-stt-hotcold
chmod +x setup.sh
./setup.sh
setup.sh crea el entorno virtual, instala las dependencias y se descarga el modelo.
Es seguro volver a ejecutarlo si algo falla a mitad.
La elección de modelo es tuya y es un compromiso entre memoria y calidad:
| Modelo | VRAM | Notas |
|---|---|---|
small |
~2 GB | Equilibrado, para máquinas pequeñas |
medium |
~5 GB | Por defecto |
turbo |
~6 GB | El recomendado. Destilado de large-v3: casi su calidad a mucha más velocidad |
large-v3 |
~10 GB | Máxima precisión |
Se elige con WHISPER_MODEL en el fichero .env. Los 99 idiomas están en todos menos en
las variantes .en.
Arrancarlo a mano, para ver que vive:
source venv/bin/activate
uvicorn main_stt:app --host 127.0.0.1 --port 9005
El repositorio es uttera-tts-hotcold — servidor de síntesis con
backends intercambiables (Coqui XTTS-v2, VoxCPM2 y más) mediante una sola variable de
entorno, TTS_BACKEND.
git clone https://github.com/uttera/uttera-tts-hotcold.git
cd uttera-tts-hotcold
chmod +x setup.sh
./setup.sh
Aquí hay una decisión más: el motor de voz se cambia con una variable, TTS_BACKEND.
Una advertencia que está en el propio repositorio y conviene leer antes de perder el
rato: el backend voxcpm en hot/cold no es para producción. Su ruta de
torch.compile no se lleva con el pool de subprocesos y provoca una carrera del asignador
de CUDA bajo carga concurrente — está confirmado por los mantenedores de VoxCPM. Para ese
motor en serio, el repositorio bueno es uttera-tts-vllm. En hot/cold se queda para
desarrollo y pruebas, y avisa al cargar.
Sobre las voces: setup_assets.sh te deja las seis voces estándar. Las voces de referencia
para clonado no vienen incluidas, por derechos: pones tus propios .wav en
assets/voices/elite/ y los registras en voices.json. No hay que tocar código.
Transcribir:
curl -X POST http://localhost:9005/v1/audio/transcriptions \
-F "file=@muestra.wav" \
-F "language=es"
Sintetizar:
curl -X POST http://localhost:9004/v1/audio/speech \
-H 'Content-Type: application/json' \
-d '{"input":"Hola mundo","voice":"alloy"}' \
-o hola.mp3
Si las dos responden, ya tienes el servidor. El resto es que arranque solo.
Un servicio de usuario de systemd basta, y no necesita 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
El de síntesis es el mismo cambiando el directorio, main_tts:app y el puerto.
Son otros dos repositorios, uttera-tts-vllm y uttera-stt-vllm, construidos sobre vLLM para sacarle partido a una tarjeta dedicada. Cambia el repositorio y poco más:
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
Con uttera-stt-vllm igual, con main_stt:app y el 9005. Aquí setup.sh además
predescarga el modelo y las voces.
Lo publicado son los motores: lo que convierte audio en texto y texto en audio. Eso es el trabajo de verdad y es lo que corre en tu máquina.
Lo que no está publicado es la capa de servicio que hay encima en uttera.ai: claves de API, control de créditos, reparto entre varios equipos, facturación. Eso es nuestro producto, y montarlo por tu cuenta tiene sentido si lo que quieres es vender voz a terceros — pero si lo que quieres es que tus audios no salgan de tu red, no te hace falta nada de eso.
Dicho de otra forma: si esta guía te resuelve el problema, nos parece perfecto que no nos pagues. Y si un día prefieres no mantener GPUs, ahí estamos.
localhost.Y si te atascas, escríbenos igual: support@uttera.ai. Que no seas cliente no significa
que no queramos saber dónde falla la guía.
¿Algo que añadir o que corregir? Escríbenos a support@uttera.ai. Si nos corriges, editamos la entrada y te damos crédito.