Integración de Kyutai TTS
Ejecuta localmente los modelos TTS de Kyutai para obtener texto a voz de alta calidad. Esta guía cubre Pocket TTS (CPU) y TTS 1.6B (GPU), con servidores compatibles con OpenAI incluidos en Libre WebUI.
Resumen
Kyutai ofrece dos modelos TTS:
| Modelo | Parámetros | Dispositivo | Uso recomendado |
|---|---|---|---|
| Pocket TTS | 100M | Solo CPU | Portátiles y entornos con pocos recursos |
| TTS 1.6B | 1.6B | GPU/MPS/CPU | Servidores y síntesis de alta calidad |
Ambos utilizan el marco CALM (Continuous Audio Language Models) y admiten clonación de voz a partir de muestras.
Pocket TTS (CPU)
TTS ligero que funciona en tiempo real en CPU. No requiere GPU.
Requisitos
| Componente | Mínimo |
|---|---|
| Python | 3.10 - 3.14 |
| PyTorch | 2.5+ |
| RAM | 4GB |
| Disco | 500MB |
Inicio rápido
cd examples/kyutai-tts-server
# Create virtual environment
python3 -m venv venv
source venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Start server
python server.py
El servidor se ejecuta en http://localhost:8200.
Probarlo
curl http://localhost:8200/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"model": "kyutai-tts", "input": "Hello, welcome to Libre WebUI!", "voice": "alba"}' \
--output speech.wav
Voces
| Voz | Descripción |
|---|---|
| Alba | Femenina, clara y natural |
| Marius | Masculina, tono cálido |
| Javert | Masculina, autoritaria |
| Jean | Masculina, suave |
| Fantine | Femenina, suave |
| Cosette | Femenina, joven |
| Eponine | Femenina, expresiva |
| Azelma | Femenina, luminosa |
Rendimiento
- ~6x tiempo real en un MacBook Air M4
- ~200ms de latencia hasta el primer fragmento de audio
- Solo utiliza 2 núcleos de CPU
TTS 1.6B (GPU)
TTS de alta calidad acelerado por GPU. Selección automática: CUDA > MPS > CPU.
Requisitos
| Componente | Mínimo | Recomendado |
|---|---|---|
| Python | 3.10+ | 3.12 |
| GPU VRAM | 6GB | 8GB+ |
| RAM | 8GB | 16GB+ |
| Disco | 4GB | 8GB |
Plataformas compatibles
| Plataforma | Backend | Notas |
|---|---|---|
| NVIDIA GPU | CUDA | Mejor rendimiento, admite bfloat16 |
| Apple Silicon | MPS | Utiliza float16 |
| CPU | PyTorch | Más lento, utiliza float32 |
Inicio rápido
cd examples/kyutai-tts-1.6b-server
# Create virtual environment
python3 -m venv venv
source venv/bin/activate
# Install PyTorch with CUDA (for NVIDIA GPUs)
pip install torch --index-url https://download.pytorch.org/whl/cu121
# Install dependencies
pip install -r requirements.txt
# Start server (auto-detects GPU)
python server.py
El servidor se ejecuta en http://localhost:8201.
Selección del dispositivo
# Auto-detect (CUDA > MPS > CPU)
python server.py
# Force specific device
python server.py --device cuda
python server.py --device mps
python server.py --device cpu
Probarlo
curl http://localhost:8201/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"model": "kyutai-tts-1.6b", "input": "Hello from the GPU!", "voice": "alba"}' \
--output speech.wav
Voces
Alba MacKenna (CC BY 4.0):
| Voz | Estilo |
|---|---|
alba / alba-casual | Conversación informal |
alba-merchant | Personaje comerciante |
alba-announcer | Estilo de locutor |
Expresso (CC BY-NC 4.0 - no comercial):
| Voz | Emoción |
|---|---|
expresso-happy | Alegre |
expresso-sad | Triste |
expresso-angry | Enfadada |
VCTK (CC BY 4.0):
vctk-p225,vctk-p226,vctk-p227,vctk-p228
Clonación de voz
Ambos servidores admiten la clonación desde archivos de audio.
Pocket TTS
# From local file
curl http://localhost:8200/v1/audio/voice-clone \
-F "input=Hello from a cloned voice" \
-F "reference_audio=@my_voice.wav" \
--output cloned.wav
# From HuggingFace URL
curl http://localhost:8200/v1/audio/voice-clone-url \
-H "Content-Type: application/json" \
-d '{
"input": "Hello world!",
"voice_url": "hf://kyutai/tts-voices/alba-mackenna/casual.wav"
}' \
--output speech.wav
TTS 1.6B
Pasa cualquier ruta de voz de HuggingFace como parámetro voice:
curl http://localhost:8201/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"model": "kyutai-tts-1.6b",
"input": "Custom voice synthesis",
"voice": "hf://kyutai/tts-voices/vctk/p230.wav"
}' \
--output speech.wav
Referencia de la API
Generación de voz
Endpoint: POST /v1/audio/speech
{
"model": "kyutai-tts",
"input": "Text to convert to speech",
"voice": "alba",
"response_format": "wav",
"stream": false
}
| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
model | string | variable | kyutai-tts o kyutai-tts-1.6b |
input | string | obligatorio | Texto que sintetizar (máximo 10,000 caracteres) |
voice | string | alba | Nombre de voz o ruta HuggingFace |
response_format | string | wav | Formato de audio (solo se admite wav) |
stream | boolean | false | Activar streaming (solo Pocket TTS) |
cfg_coef | float | 2.0 | Guía sin clasificador (solo 1.6B) |
Respuesta: archivo de audio (audio/wav)
Alias de voces OpenAI
Para mantener la compatibilidad con clientes TTS de OpenAI:
| Voz OpenAI | Pocket TTS | TTS 1.6B |
|---|---|---|
alloy | alba | alba |
echo | marius | vctk-p225 |
fable | cosette | expresso-happy |
onyx | javert | vctk-p226 |
nova | fantine | alba-announcer |
shimmer | eponine | alba-merchant |
Enumerar voces
Endpoint: GET /v1/voices
Comprobación de estado
Endpoint: GET /health
Configuración de plugins
Pocket TTS
Actívalo en Ajustes > Plugins > Kyutai TTS
Archivo del plugin: plugins/kyutai-tts.json
{
"id": "kyutai-tts",
"name": "Kyutai TTS",
"type": "tts",
"endpoint": "http://localhost:8200/v1/audio/speech",
"capabilities": {
"tts": {
"config": {
"voices": [
"Alba",
"Marius",
"Javert",
"Jean",
"Fantine",
"Cosette",
"Eponine",
"Azelma"
],
"default_voice": "Alba",
"supports_streaming": true,
"no_auth_required": true
}
}
}
}
TTS 1.6B
Actívalo en Ajustes > Plugins > Kyutai TTS 1.6B
Archivo del plugin: plugins/kyutai-tts-1.6b.json
{
"id": "kyutai-tts-1.6b",
"name": "Kyutai TTS 1.6B",
"type": "tts",
"endpoint": "http://localhost:8201/v1/audio/speech",
"capabilities": {
"tts": {
"config": {
"voices": [
"Alba",
"Alba-Casual",
"Alba-Merchant",
"Alba-Announcer",
"Expresso-Happy",
"Expresso-Sad",
"Expresso-Angry",
"VCTK-P225",
"VCTK-P226"
],
"default_voice": "Alba",
"supports_streaming": true,
"no_auth_required": true
}
}
}
}
Acceso de red
Para acceder desde otros equipos:
# Start server on all interfaces
python server.py --host 0.0.0.0
# Access from another machine
curl http://192.168.1.100:8200/v1/audio/speech ...
Actualiza el endpoint del plugin:
{
"endpoint": "http://192.168.1.100:8200/v1/audio/speech"
}
Solución de problemas
Falla la descarga del modelo
Los modelos se descargan de HuggingFace la primera vez:
# Set token for gated models
export HF_TOKEN=hf_...
Memoria CUDA agotada
Para TTS 1.6B con poca VRAM:
- Cierra otras aplicaciones de GPU.
- Prueba
cfg_coef=1.5para consumir menos memoria. - Utiliza Pocket TTS (basado en CPU).
Problemas de calidad
- Sonido robótico: prueba otra voz.
- Audio cortado: el texto puede ser demasiado largo; el servidor lo divide automáticamente.
- Pronunciación incorrecta: el modelo está optimizado para inglés y francés.
Problemas con MPS (Apple Silicon)
RuntimeError: MPS backend error
El modelo 1.6B utiliza float16 en MPS. Si persiste, fuerza CPU:
python server.py --device cpu
Comparación con Qwen3-TTS
| Función | Kyutai Pocket | Kyutai 1.6B | Qwen3-TTS |
|---|---|---|---|
| Parámetros | 100M | 1.6B | 0.6B-1.7B |
| GPU necesaria | No | Opcional | Sí |
| Idiomas | Inglés | EN/FR | 10 languages |
| Clonación | Sí | Sí | Sí |
| Diseño de voz | No | No | Sí |
| Puerto | 8200 | 8201 | 8100 |
Elige Kyutai para casos centrados en inglés con configuración sencilla. Elige Qwen3-TTS para soporte multilingüe y diseño de voz.
Recursos
- Kyutai TTS - Página oficial
- Pocket TTS en GitHub - Modelo para CPU
- Delayed Streams Modeling - Modelo 1.6B
- Colección de voces - Voces disponibles
- Ficha del modelo - Detalles técnicos