Guía de Inferencia TTS¶
Has entrenado o hecho fine-tuning de un modelo TTS y ya tienes un checkpoint prometedor. Ahora puedes usar ese modelo para convertir texto nuevo en audio de voz, un proceso llamado inferencia o síntesis.
Si algún término de inferencia o despliegue no está claro, consulta el glosario. Esta página solo explica los términos que afectan directamente a la generación, evaluación o uso compartido del modelo.
Inferencia: sintetizar voz¶
Esta sección explica cómo ejecutar la inferencia usando tu modelo entrenado.
Localiza el script de inferencia y el checkpoint correcto¶
- Script de inferencia: Busca un script como
inference.py,synthesize.py,infer.pyotts.py. El nombre y los argumentos cambian según el framework. - Checkpoint correcto: Identifica el checkpoint (
.pth,.pt,.ckpt) que quieres usar. Normalmente serábest_model.pthu otro que hayas elegido tras escuchar muestras de validación. - Archivo de configuración: Casi siempre necesitarás el mismo archivo
.yamlo.jsonusado durante el entrenamiento de ese checkpoint. Si el config y el checkpoint no coinciden, es normal obtener errores de carga o una salida basura.
Inferencia básica de una sola frase¶
-
Objetivo: Generar audio para una frase corta proporcionada desde la línea de comandos.
python inference.py \ --config ../checkpoints/my_yoruba_voice_run1/config.yaml \ --checkpoint_path ../checkpoints/my_yoruba_voice_run1/best_model.pth \ --text "Hello, this is a test of my custom trained voice." \ --output_wav_path ./output_sample.wav # Opcional: # --speaker_id "main_speaker" # --device "cuda" -
Argumentos principales:
--configo-c: Ruta al archivo de configuración.--checkpoint_patho--model_path: Ruta al checkpoint del modelo.--texto-t: Texto que quieres sintetizar.--output_wav_patho--out_path: Ruta del archivo WAV de salida.--speaker_id: Necesario en modelos multi-locutor.--device: Suele sercudasi está disponible, si nocpu.
Primera prueba rápida de inferencia¶
Para la primera prueba no uses un párrafo largo ni un gran archivo por lotes. Usa una frase corta como:
Si eso falla, arregla primero el pipeline básico. La inferencia por lotes no va a corregir un config roto, un checkpoint incorrecto o un speaker ID equivocado.
Inferencia por lotes desde un archivo¶
- Objetivo: Sintetizar varias frases desde un archivo de texto y guardarlas como WAV separados.
-
Prepara el archivo de entrada: Crea
sentences.txtcon una frase por línea. -
Comando de ejemplo:
-
Argumentos clave:
--input_fileo--text_file: Ruta al archivo de entrada.--output_diro--out_dir: Carpeta donde guardar los WAV generados.- El resto de argumentos suele ser igual que en la inferencia de una sola frase.
Inferencia en modelos multi-locutor¶
- Si el modelo fue entrenado con varios locutores, debes indicar qué voz quieres usar.
- Utiliza
--speaker_idcon el mismo identificador que aparece en tus manifest de entrenamiento. - Si omites el
speaker_id, el script puede fallar, usar un locutor por defecto o generar un resultado mezclado.
Controles avanzados de inferencia¶
- Algunos frameworks permiten parámetros extra como:
- Velocidad de habla:
--speedo--length_scale - Control de pitch
- Estilo o emoción:
--style_text,--style_wav - Ajustes de vocoder
- Número de pasos en modelos de difusión
- Velocidad de habla:
- Consulta siempre
python inference.py --helpy la documentación de tu framework.
Problemas comunes de inferencia¶
- CUDA Out-of-Memory: Las frases muy largas pueden usar más memoria de la esperada.
- Desajuste entre modelo y config: Es una causa muy común de errores o audio defectuoso.
- Speaker ID incorrecto: Especialmente en modelos multi-locutor.
- Calidad pobre: Si el resultado es ruidoso o inestable, vuelve a la Guía 1 y la Guía 3.
Opcional: evaluación y despliegue¶
Esta sección es intencionalmente opcional. Si estás empezando, no te bloquees con estudios MOS, métricas basadas en ASR o arquitectura de despliegue antes de poder generar unas cuantas muestras locales buenas.
Para la mayoría de proyectos personales o iniciales, las pruebas de escucha local bastan para decidir si merece la pena conservar un checkpoint. Trata las métricas siguientes como herramientas de comparación y depuración, no como un requisito previo para usar el modelo.
Evaluar la calidad del modelo TTS¶
Las pruebas de escucha siguen siendo la referencia principal, pero algunas métricas objetivas pueden ayudarte a comparar resultados.
Métricas objetivas de evaluación¶
| Métrica | Qué mide | Herramienta o implementación | Interpretación |
|---|---|---|---|
| MOS (Mean Opinion Score) | Calidad percibida global | Evaluadores humanos puntúan de 1 a 5 | Más alto es mejor; requiere evaluadores |
| PESQ | Calidad frente a una referencia | Disponible en Python mediante pypesq |
Rango -0.5 a 4.5; más alto es mejor |
| STOI | Inteligibilidad del habla | Disponible en Python mediante pystoi |
Rango 0 a 1; más alto es mejor |
| CER / WER | Inteligibilidad mediante ASR | Ejecuta ASR sobre el audio y compáralo con el texto | Más bajo es mejor |
| MCD | Distancia espectral frente a una referencia | Implementación propia con librosa |
Más bajo es mejor; suele estar entre 2 y 8 en TTS |
| F0 RMSE | Precisión del pitch | Implementación propia con librosa |
Más bajo es mejor; mide el contorno de pitch |
| Voicing Decision Error | Precisión de decisiones voiced/unvoiced | Implementación propia | Más bajo es mejor |
Enfoque práctico de evaluación¶
- Prepara un pequeño conjunto de frases que no se usó en el entrenamiento.
- Genera muestras con el checkpoint seleccionado.
- Escúchalas para evaluar naturalidad, estabilidad, pronunciación y locutor correcto.
- Si hace falta, añade métricas objetivas como apoyo, no como único criterio.
Nota práctica: este enfoque sirve para experimentar, no es un pipeline de evaluación listo para producción. Empieza escuchando un conjunto pequeño y constante, y añade métricas objetivas solo si necesitas comparar mejor checkpoints o versiones.
Despliegue de modelos TTS¶
Nota de alcance: el despliegue es un problema de ingeniería distinto. Si todavía estás corrigiendo pronunciación, inestabilidad o mezcla de locutores, sigue trabajando localmente primero.
Regla práctica: no empieces con Kubernetes, auto-scaling o infraestructura serverless hasta tener un comando de inferencia local estable y una forma repetible de cargar el modelo. La fiabilidad local es lo primero.
Consideraciones principales para despliegue en producción¶
- Optimización del modelo: quantization reduce la precisión de FP32 a FP16 o INT8; pruning elimina pesos innecesarios; distillation entrena un modelo pequeño a partir de uno mayor; ONNX mejora la portabilidad.
- Optimización de latencia: usa batch processing para solicitudes no interactivas, streaming para tiempo real, caching para frases frecuentes y aceleración GPU/TPU.
- Escalabilidad: Docker empaqueta el modelo y sus dependencias; Kubernetes orquesta contenedores; auto-scaling ajusta recursos; las colas absorben picos de solicitudes.
- Monitorización y mantenimiento: mide latencia, throughput, tasas de error, uso de recursos, calidad de salida y diferencias entre versiones mediante pruebas A/B.
Arquitectura de ejemplo para despliegue en producción¶
flowchart TD
clients["Client Applications"] --> lb["Load Balancer"]
lb --> gateway["API Gateway"]
gateway --> validation["Request Validation"]
validation --> rateLimit["Rate Limiting"]
rateLimit --> auth["Authentication"]
auth --> queue["Request Queue"]
queue --> workers["TTS Worker Pods<br/>(Kubernetes)"]
workers --> model["TTS Model Container"]
model --> post["Audio Post-Processing"]
post --> storage["Audio Storage"]
workers --> cache["Audio Cache"]
storage --> cache
Opciones locales de despliegue¶
Para muchos proyectos, un pequeño script wrapper o una demo ligera de Gradio son suficientes durante mucho tiempo. No necesitas un stack de producción para usar el modelo en tu máquina o compartir una demo con algunos testers.
- Interfaz de línea de comandos: un script que envuelva el código de inferencia y acepte argumentos como
--text,--model,--config,--outputy--speaker. - Interfaz web sencilla: una interfaz básica con Flask o Gradio que cargue el modelo al iniciar y devuelva el audio generado.
- Demo de Gradio: adecuada para probar localmente o compartir rápidamente el modelo con testers.
Opciones de despliegue en la nube¶
Para uso en producción, considera:
- Hugging Face Spaces: sube el modelo y crea una aplicación con Gradio o Streamlit.
- REST API: envuelve el modelo en una aplicación FastAPI o Flask y despliega en un servicio cloud.
- Funciones serverless: adecuadas para modelos ligeros.
- Contenedores Docker: empaqueta el modelo y las dependencias para un despliegue reproducible.
Optimización del rendimiento¶
Para mejorar la velocidad y eficiencia de la inferencia:
- Quantization: convierte los pesos a FP16 o INT8.
- Exportación a ONNX: convierte el modelo para acelerar la inferencia.
- Batch processing: procesa varias entradas de texto a la vez para aumentar el throughput.
- Caché: guarda las salidas solicitadas con frecuencia para evitar regenerarlas.
- Entradas más cortas: usa entradas de inferencia previsibles para reducir la latencia.
Ahora que ya puedes generar voz con tu modelo entrenado, el siguiente paso lógico es organizar bien los archivos del modelo para su uso futuro, su compartición o su despliegue.
Antes de continuar¶
- El checkpoint y el archivo de configuración provienen de la misma ejecución de entrenamiento.
- Has probado una frase corta antes de lanzar un trabajo grande por lotes.
- La ruta o carpeta de salida existe y tiene permisos de escritura.
- Has indicado el speaker ID correcto en modelos multi-locutor, si hace falta.
- Si el audio suena mal, has verificado sampling rate, coincidencia de config y selección del checkpoint antes de cambiar el texto de inferencia.