Este proyecto es un servicio de Text-to-Speech (TTS) basado en Piper que convierte texto en audio. Incluye caché local, de modo que si un texto ya fue convertido, devuelve el archivo existente en lugar de generar uno nuevo.
- Python 3.11
- FastAPI
- Piper TTS
- Docker y Docker Compose
- ONNX para los modelos de voz
.
├── app/
│ ├── requirements.txt
│ └── src/
│ └── main.py
├── docker-compose.yml
├── Dockerfile
├── README.md
└── voces/ # NO se incluye en GitHub
Nota: La carpeta
voces/
no se sube al repositorio porque los archivos son grandes (>100 MB).
- Construir y levantar el contenedor:
docker-compose up --build
-
El servicio TTS quedará expuesto en el puerto
8000
por defecto. -
(Opcional) Para guardar los audios generados en tu máquina, podés habilitar un volumen en
docker-compose.yml
:
volumes:
- ./outputs:/outputs
El proyecto usa el modelo es_AR-daniela-high.onnx
de Piper. Para no subir archivos grandes al repo, se deben descargar manualmente:
mkdir -p voces
wget -O voces/es_AR-daniela-high.onnx https://huggingface.co/larcanio/piper-voices/resolve/main/es_AR-daniela-high.onnx
wget -O voces/es_AR-daniela-high.onnx.json https://huggingface.co/larcanio/piper-voices/resolve/main/es_AR-daniela-high.json
Asegurate de que los nombres de archivo coincidan con los definidos en main.py
.
URL: POST /tts
Contenido: application/json
{
"texto": "Hola, este es un ejemplo de TTS con Piper"
}
- Archivo WAV generado o recuperado de la caché.
- Nombre del archivo:
audio.wav
Content-Type: audio/wav
curl -X POST "http://localhost:8000/tts" \
-H "Content-Type: application/json" \
-d '{"texto": "Hola, este es un test"}' \
--output audio.wav
Luego podés reproducirlo:
aplay audio.wav
# o en Windows/macOS usando tu reproductor favorito
- Puerto:
TTS_PORT
(por defecto8000
) - Carpeta de salida de audios:
/outputs
- Modelo de voz:
/voces/es_AR-daniela-high.onnx
- Velocidad de la voz:
LENGTH_SCALE
(por defecto1.45
)
Estas variables están definidas en main.py
y se pueden modificar según necesidad.
- Cada texto enviado se convierte en un hash MD5.
- Si el texto ya fue procesado, se devuelve el archivo existente, evitando regenerarlo.
- Asegurate de tener Docker y Docker Compose instalados.
- La primera generación de audio puede tardar más; las siguientes serán rápidas gracias a la caché.
- Compatible con Python ≥3.10.
- Los modelos de voz grandes se descargan con
wget
y no se suben al repo para evitar límites de GitHub.