Arquitectura de voz en producción para igbo, yoruba y hausa

Descubre cómo implementamos una pipeline de voz en producción para igbo, yoruba y hausa con Whisper, NLLB y TTS personalizado. Optimización real y resultados.

lunes, 27 de julio de 2026 • 7 min de lectura • Equipo Q2BSTUDIO

Chatbot de voz multilingüe para lenguas africanas

La construcción de un chatbot de voz en tiempo real para lenguas africanas como igbo, yoruba y hausa va mucho más allá de cambiar códigos de idioma en una API en la nube. Estos idiomas, hablados por millones de personas, están severamente infrarrepresentados en los modelos comerciales: Whisper alucina sobre silencios, NLLB traduce mal expresiones comunes en yoruba y los sistemas de texto a voz comerciales nunca han escuchado igbo. En este artículo exploramos cómo diseñar e implementar una arquitectura de producción real que sirva estas cuatro lenguas (inglés, hausa, yoruba, igbo) con componentes ajustados y desplegados tras una API compatible con OpenAI.

La arquitectura se compone de cinco microservicios independientes, cada uno responsable de una tarea específica, que exponen endpoints HTTP compatibles con OpenAI. El chatbot los invoca con el mismo cliente Python de OpenAI que usaría para GPT-4, simplemente cambiando la base_url. Esto permite escalar o sustituir cualquier componente sin tocar el código de la aplicación. Desde aplicaciones a medida hasta sistemas complejos de IA, la modularidad es clave para la flexibilidad en entornos de producción.

El primer eslabón es el reconocimiento de voz (STT). Partimos de Whisper, un modelo multilingüe que, sin ajuste fino, lograba una tasa de error de palabra (WER) del 30-40 % en hausa. Tras entrenar con aproximadamente 50 horas de audio nativo por idioma, el WER desciende por debajo del 12 %. El modelo se carga como un pipeline de HuggingFace con troceado de 30 segundos, manejando audios de cualquier duración. Sin embargo, el problema más crítico es el silencio. En producción, entre el 15 y el 25 % del audio entrante contiene ruido de fondo, activaciones accidentales o silencio puro. Sin filtrado, Whisper alucina texto plausible sobre todo ello. La solución es incorporar Silero VAD (detección de actividad de voz) antes de que el modelo procese nada: si no se detecta voz, la solicitud devuelve una transcripción vacía al instante, eliminando la inferencia y las alucinaciones. Esta decisión elimina la clase más común de errores visibles para el usuario.

Para la identificación del idioma, forzamos el token de idioma correcto en el decodificador de Whisper para inglés, hausa y yoruba mediante forced_decoder_ids. Sin esto, Whisper puede cambiar silenciosamente a un idioma que reconozca mejor a mitad de la salida. Igbo queda excluido porque no está en el vocabulario de Whisper; forzarlo lanzaría un error, así que el modelo ajustado lo maneja libremente. La transcripción se transmite como eventos enviados por el servidor (SSE), emitiendo cada fragmento de 30 segundos conforme se completa. El cliente comienza a recibir texto mientras el modelo aún procesa la cola de un clip largo.

El segundo componente es la traducción. Usamos NLLB-200 de Meta en lugar de un LLM para esta tarea. Los LLMs traducen bien para lenguas de altos recursos, pero son poco fiables y costosos para pares como hausa ↔ inglés o igbo ↔ inglés a rendimiento de producción. NLLB fue diseñado específicamente para estos pares. El desafío es la latencia: el modelo PyTorch sin cuantizar corre a unas 6 tokens/segundo en CPU, inaceptable. Aquí recurrimos a CTranslate2, un motor de inferencia en C++ optimizado para modelos encoder-decoder. Convertir NLLB a formato INT8 de CTranslate2 es un paso único: el modelo convertido funciona a ~150 ms por frase en dos núcleos de CPU, viable sin GPU. Además, desplegamos instancias separadas por idioma (hausa, igbo, yoruba) en contenedores Docker independientes. Un requisito no obvio es que la dirección de traducción debe ser explícita: la API exige un campo obligatorio como 'hausa_to_english' sin valor por defecto. El emisor siempre sabe en qué dirección quiere traducir.

El agente LLM constituye el núcleo de la lógica conversacional. Servimos un modelo ajustado mediante vLLM, que ofrece dos características esenciales: PagedAttention gestiona la caché de claves y valores como páginas de memoria virtual, evitando agotamientos de memoria bajo carga concurrente; y el batching continuo permite que las solicitudes que llegan durante una generación se unan al lote actual, duplicando el rendimiento efectivo respecto al batching estático. Frente a vLLM, colocamos una caché semántica con Redis. Antes de cualquier inferencia, la consulta entrante se compara con embeddings de consultas cacheadas usando un umbral de similitud coseno de 0,95. En producción, una gran fracción de las consultas son reformulaciones semánticamente idénticas de la misma pregunta, y resuelven con la misma respuesta cacheada, reduciendo las llamadas al LLM en un 30-40 %. El agente expone dos endpoints: /api/agent/chat para respuestas completas JSON y /api/agent/stream para streaming token a token mediante SSE. Tras completar el streaming, se encolan tareas en segundo plano para registro de conversaciones y evaluación de calidad RAGAS, sin bloquear la respuesta. Un detalle práctico: es necesario añadir la cabecera X-Accel-Buffering: no cuando el servicio corre tras Nginx, para evitar que el proxy almacene en búfer el flujo SSE.

El último componente es la síntesis de texto a voz (TTS). Ningún servicio comercial maneja el yoruba o hausa tonales con naturalidad aceptable. Construimos un pipeline personalizado sobre ChatterboxTTS, una arquitectura de clonación de voz con un transformador acústico T3 y un vocoder neuronal S3Gen, ajustado con grabaciones de hablantes nativos para los cuatro idiomas. Disponemos de catorce voces nominales, cada una clonada de un hablante real. Un hallazgo técnico importante: el transformador T3 corre en bfloat16 sobre CUDA, duplicando el rendimiento y reduciendo la memoria con pérdida de calidad insignificante, porque la atención es numéricamente estable. Sin embargo, el vocoder S3Gen debe permanecer en float32; los vocoders usan capas convolucionales profundas con residuos acumulados, y en bfloat16 el error numérico produce artefactos audibles como zumbidos o corrupción total. Es crucial probar cada submódulo de forma independiente antes de asumir que bfloat16 es seguro en una arquitectura compuesta.

La identidad de voz en Chatterbox se determina mediante un embedding de hablante extraído de un clip de audio de referencia. Esta extracción es costosa (200-400 ms por solicitud). Para evitarlo, todos los condicionales de voz se calculan al arrancar y se cachean en memoria; cambiar de altavoz es una simple búsqueda en un diccionario. Para latencia percibida baja, las respuestas largas se dividen por límites de oración y se sintetizan fragmento a fragmento. El audio comienza a transmitirse al cliente en cuanto el primer fragmento está listo. La respuesta HTTP comienza con una cabecera WAV que anuncia tamaños RIFF y de datos abiertos (0xFFFFFFFF), un truco estándar para transmitir audio PCM sin conocer la longitud total. La diferencia es notable: una respuesta de 500 palabras sintetizada en un solo bloque tarda ~8 segundos antes de oírse; fragmentada, el usuario escucha la primera frase en ~1,2 segundos.

Desde una perspectiva de negocio, esta arquitectura demuestra que es posible servir lenguas infrarrepresentadas con calidad de producción sin depender de gigantes tecnológicos. En Q2BSTUDIO, como empresa de desarrollo de software y tecnología, aplicamos estos principios en múltiples ámbitos: desde soluciones de IA a medida hasta sistemas de ciberseguridad que protegen los datos de voz, pasando por infraestructuras cloud en AWS o Azure que escalan automáticamente según la demanda. La optimización de costes es esencial: los servicios de NLLB en CPU con cuantización INT8 reducen drásticamente el gasto en GPU, que se reserva para STT y TTS donde la latencia es crítica. Además, la modularidad de microservicios permite integrar agentes de IA conversacionales con sistemas de BI como Power BI para analizar patrones de uso y mejorar la experiencia.

Uno de los aprendizajes más valiosos es que ninguno de estos cinco servicios es exótico por sí solo: Whisper ajustado, CTranslate2, vLLM y un modelo de clonación de voz están bien documentados. Lo que hace que esta pila sea de grado de producción es la acumulación de pequeñas decisiones ganadas con esfuerzo: filtrar el STT con VAD, forzar explícitamente la dirección de traducción, separar la precisión en los submódulos del TTS, y separar la evaluación del almacenamiento. Cada una de estas fue un incidente real antes de convertirse en regla de diseño. Para los equipos que construyen interfaces de voz para idiomas subrepresentados, la lección va más allá de esta pila tecnológica: hay que presupuestar tiempo para los problemas de infraestructura aburridos, no solo para los problemas de calidad del modelo, porque suelen ser los que realmente rompen en producción.

En resumen, la arquitectura presentada ofrece una hoja de ruta práctica para llevar el procesamiento de voz a lenguas que el mercado ha ignorado. Con una combinación inteligente de modelos ajustados, infraestructura cloud y buenas prácticas de ingeniería, es posible construir sistemas robustos que funcionen en el mundo real. Desde el reconocimiento de voz con VAD hasta la síntesis fragmentada, cada componente aporta valor tangible, y todos juntos demuestran que la tecnología inclusiva no solo es posible, sino también escalable y rentable.

¿UNA PAUSA?

Juega un momento antes de irte

NUESTROS SERVICIOS

Cómo podemos ayudarte

¿Tienes un proyecto en mente?

Cuéntanos tu visión y la convertimos en una solución de software. Sea cual sea el alcance, hacemos realidad tu idea.