Cualquiera puede programar un bot para encadenar canciones MP3 en bucle y llamarlo «radio». En internet sobran las listas de reproducción impersonales disfrazadas de emisoras. Pero cuando la noche se cierra de verdad y el ruido del mundo calla, una estación no se sostiene solo con guitarras; necesita una presencia, una voz en la consola que entienda la trinchera y que hable como alguien de carne y hueso encerrado entre cables, café frío y vúmetros analógicos. Hoy dimos el siguiente paso evolutivo en Radio Psychotic: diseñamos, calibramos y pusimos al aire a nuestro Locutor Virtual Inteligente («El Búnker»), un motor generativo en tiempo real gobernado por Gemini Flash y Gemini Flash TTS en Google Cloud Vertex AI, capaz de improvisar monólogos de cabina sin pausas, sin clichés corporativos y con cero desincronización de reloj.
1. El Problema del Vacío en Streaming: Más Allá de la Playlist Autómata
Nuestra infraestructura base ya transmitía 24/7 sin ocupar un solo byte de disco en el servidor de Oracle Cloud gracias al streaming en memoria RAM desde Google Cloud Storage (Zero Disk Usage) y la transcodificación estricta con FFmpeg. Sin embargo, una tanda musical continua, por más impecable que sea su selección de metal y clásicos, termina perdiendo el pulso orgánico de la radio nocturna tradicional.
El reto no era simplemente reproducir cuñas pregrabadas (de las cuales ya tenemos 40 en rotación), sino otorgarle a la estación una personalidad radial viva. Un locutor con autoridad moral, cinismo lúcido, cultura musical callejera y capacidad de reaccionar dinámicamente al contexto exacto de lo que está sonando.
2. La Topología: Inteligencia Contextual, Voz y Cama Musical
El módulo virtual_dj.py se integra como un copiloto de transmisión que opera bajo tres capas acopladas en tiempo real:
- El Cerebro Contextual (Gemini Flash en Vertex AI): Antes de intervenir, el modelo recibe un contrato estricto de contexto: la canción que acaba de concluir, la pista que entra a continuación y una de 8 directivas temáticas rotativas extraídas de nuestra Biblia de Lore del Búnker. Prohibimos terminantemente las fórmulas de locutor de FM comercial («¡no te despegues!», «¡saludos a la cabina!») y le exigimos hablar en primera persona con cadencia mexicana de barrio culto, anécdotas reales de producción analógica y reflexiones viscerales de psychotic.blog.
- La Voz Proyectada (Gemini Flash TTS – Charon con DSP Cálido): Sintetizamos la voz mediante la API de audio generativo de Vertex AI inyectando dirección escénica de proyección vocal firme para erradicar cualquier caída susurrada o tono meloso. Para otorgarle presencia de micrófono de radiodifusión en estudio (estilo Shure SM7B), aplicamos una curva de filtrado analógico con realce de graves de +4.5 dB en 110 Hz (
bass=g=4.5:f=110) y realce de presencia en medios-altos. - Ducking Dinámico sobre Base de Suno AI: La locución se ensambla al vuelo sobre una cama musical de fondo atenuada al 20% de volumen (
volume=0.20), rematando con un corte seco de 0.6 segundos y fade-out suave para golpear justo en el primer compás de la rola siguiente.
3. La Batalla contra la Latencia: Pre-Renderizado Asíncrono en Segundo Plano
En radiodifusión por internet sobre Icecast2, el silencio es fatal. Icecast cuenta con un mecanismo estricto de desconexión por inactividad de socket (source-timeout fijado en 10 segundos). Cuando implementamos la primera versión síncrona, el tiempo acumulado entre la inferencia de texto de Gemini (~4 seg), la síntesis de audio WAV (~6 seg) y la mezcla de FFmpeg (~2 seg) provocaba una brecha de 12 segundos de silencio absoluto al terminar cada canción. Resultado: Icecast desconectaba el socket por Broken Pipe y los reproductores de los oyentes se enmudecían.
La solución arquitectónica definitiva fue diseñar un Buffer Asíncrono de Próxima Pista (Next Track Pre-Buffer) mediante ThreadPoolExecutor:
- Mientras la canción actual se reproduce cómodamente hacia los oyentes (proporcionando una ventana segura de 3 a 4 minutos), un hilo en segundo plano toma el título de la canción siguiente y comienza a cocinar la intervención en la memoria RAM del servidor.
- Cuando la pista en curso llega a su último byte, el archivo MP3 del locutor ya está 100% renderizado y ecualizado en
/tmp/virtual_dj.mp3. - El streamer conmuta la fuente de audio en 0.0 milisegundos, garantizando flujo continuo, cero baches de silencio y cero caídas de socket.
4. Calibración de Filtros: Reducción del Arranque de dynaudnorm a 0.2 Segundos
Incluso con el audio pre-renderizado, nuestros monitoreos de oído crítico detectaron una pausa artificial de 4 segundos al inicio de cada archivo y otros 4 segundos al terminar la locución. Al auditar la tubería de FFmpeg, descubrimos que el filtro broadcast de normalización dinámica de volumen (dynaudnorm) utilizaba una ventana de análisis predeterminada de 250 milisegundos (f=250), lo que forzaba a la tubería en tiempo real (-re) a almacenar un colchón excesivo antes de liberar el primer byte útil.
Rediseñamos la curva hacia dynaudnorm=f=50:g=9:m=10.0:r=0.9:b=1. La latencia del primer byte se desplomó de 3.905 segundos a tan solo 0.236 segundos. El empalme entre la canción saliente, la intervención del locutor y el arranque del siguiente tema pasó a ser quirúrgico, con la inmediatez de una consola de transmisión analógica profesional.
5. Control Táctico desde el Escritorio: Switch Manual y Modo Nocturno
Para no obligarnos a reiniciar daemons ni tocar terminales SSH cada vez que queremos escuchar al locutor o ponerlo a descansar, implementamos un archivo de estado dinámico (dj_status.json) que el bucle de streaming lee en caliente en cada cambio de pista. Desarrollamos un lanzador táctico con interfaz interactiva en PowerShell (Control_Locutor_Virtual.bat) que permite:
- Modo Normal: El locutor interviene de forma balanceada cada 3 canciones.
- Modo Turbo: Interviene canción tras canción para pruebas de estrés y calibración en vivo.
- Modo Nocturno: Se activa exclusivamente en el rango programado de 22:00 a 04:00 hrs.
- Modo Desactivado (Off): Apaga la locución al vuelo y regresa la radio a música continua con cuñas institucionales.
La inteligencia artificial no vino a reemplazar el alma de la radio; vino a rescatarla de la mediocridad comercial corporativa. Transmitiendo sin censura las 24 horas en gemini.psychotic.blog/radio y psychotic.blog/radio.