Este proyecto implementa una arquitectura de microservicios para el procesamiento de voz utilizando los modelos de IA de NVIDIA NeMo. La solución está contenerizada con Docker y orquestada a través de Docker Compose para facilitar su despliegue y escalabilidad.
El sistema se compone de dos microservicios principales:
- Servicio de Texto a Voz (TTS): Convierte texto plano en audio de alta calidad.
- Servicio de Voz a Texto (STT): Transcribe archivos de audio a texto.
Ambos servicios utilizan modelos pre-entrenados de la colección NeMo de NVIDIA y están diseñados para ejecutarse en hardware con aceleración por GPU.
Este script implementa un servidor web con Flask que expone un endpoint para la síntesis de voz.
- Framework: Flask
- Modelos NeMo:
nvidia/tts_en_fastpitch: Para la generación de espectrogramas a partir de texto.nvidia/tts_hifigan: Vocoder para convertir los espectrogramas en audio audible.
- Endpoint:
POST /synthesize- Entrada: Un objeto JSON con la clave
text.{ "text": "Hello world! This is a test." } - Salida: Un stream de audio en formato
audio/wav.
- Entrada: Un objeto JSON con la clave
Este script implementa un servidor web con Flask para la transcripción de audio.
- Framework: Flask
- Modelo NeMo:
nvidia/parakeet-tdt-1.1b: Modelo de Reconocimiento Automático del Habla (ASR) para la transcripción.
- Endpoint:
POST /transcribe- Entrada: Una petición
multipart/form-datacon un campoaudio_fileque contiene el archivo de audio a transcribir. - Salida: Un objeto JSON con la clave
texty el texto transcrito como valor.{ "text": "hello world this is a test" }
- Entrada: Una petición
Este archivo define y configura los dos microservicios para que se ejecuten en contenedores Docker aislados.
- Servicios Definidos:
tts-server: Expone el puerto5000.stt-server: Expone el puerto5001.
- Imagen Base:
nvcr.io/nvidia/nemo:25.04para ambos servicios. - Gestión de GPU: Configurado para reservar un dispositivo NVIDIA GPU para cada servicio, lo cual es crucial para el rendimiento de los modelos NeMo.
- Volúmenes:
- Monta los scripts Python (
.py) dentro de sus respectivos contenedores. - Utiliza un volumen nombrado (
nemo_model_cache) para compartir la caché de modelos descargados entre los contenedores. Esto evita descargas duplicadas y acelera el tiempo de inicio.
- Monta los scripts Python (
Un script de utilidad para probar la funcionalidad del modelo TTS de forma local y directa, sin necesidad de levantar el servidor. Genera un archivo voz_generada.wav.
- Docker
- Docker Compose
- NVIDIA Container Toolkit (para soporte de GPU en Docker)
- Un host con al menos una GPU NVIDIA compatible.
-
Asegúrate de tener los drivers de NVIDIA y el NVIDIA Container Toolkit instalados en la máquina host.
-
Levanta los servicios utilizando Docker Compose:
docker-compose up --build
La primera vez que se ejecute, Docker descargará la imagen de NeMo y los modelos, lo que puede tardar varios minutos.
-
Verifica que los contenedores estén en ejecución:
docker-compose ps
Envía una petición POST al servicio TTS en el puerto 5000:
curl -X POST \
http://localhost:5000/synthesize \
-H 'Content-Type: application/json' \
-d '{"text": "This is a test of the text to speech service."}' \
--output audio_sintetizado.wavEsto guardará la respuesta de audio en un archivo llamado audio_sintetizado.wav.
Envía una petición POST con un archivo de audio al servicio STT en el puerto 5001:
curl -X POST \
http://localhost:5001/transcribe \
-F 'audio_file=@/ruta/a/tu/archivo.wav'La respuesta será un JSON con el texto transcrito.