Volver a proyectos

KuraiMusik

Una radio por internet que nunca se apaga. La IA genera la música y el sistema la mezcla y la transmite solo, las 24 horas, en varias estaciones y sin nadie en cabina.

  • 2026
  • Next.js
  • FastAPI
  • Celery
  • Redis
  • Liquidsoap
  • Icecast
  • ACE-Step
  • Docker
  • Prometheus

Probar en vivo

Lo que ves

Entra, elige una estación entre Dubstep, Hacker Music y Jazz, y escucha una transmisión continua como en una radio de verdad. No hay lista que armar: los temas se generan con IA, pasan de uno a otro con crossfade y el reproductor te muestra qué está sonando.

Portada de KuraiMusik, con el botón Enter Experience sobre un fondo oscuro.
1. Entra
Selector de moods de KuraiMusik, con Dubstep, Hacker Music y Jazz, sobre los controles de reproducción y volumen.
2. Elige un mood y dale play
Reproductor de KuraiMusik sonando un tema de jazz generado con IA.
3. Escucha

Arquitectura

Una radio no puede hacer pausa mientras un modelo termina de generar. Por eso separé lo que tarda de lo que tiene que sonar siempre: la música se genera en segundo plano y la emisión solo toma lo que ya está listo.

  1. Cliente webNext.js

    Vive en su propio repositorio. Elige la estación, reproduce el stream y recibe en tiempo real la canción actual y el estado del sistema.

  2. OrquestadorFastAPI

    Expone las estaciones, la canción en curso y la salud del sistema, y avisa de los cambios por WebSocket y Socket.IO.

  3. Generación en segundo planoCelery y Redis

    Vigila el buffer de cada estación y encola temas nuevos cuando hacen falta, sin tocar la emisión.

  4. Mezcla y emisiónLiquidsoap e Icecast

    Liquidsoap mezcla las pistas con crossfade y normaliza el volumen, e Icecast distribuye el audio a quien esté escuchando.

  • ACE-StepGenera la música, como microservicio aparte
  • RedisColas de trabajo
  • LiquidsoapMezcla y control de ganancia
  • IcecastStreaming a los oyentes
  • PrometheusMétricas y salud del sistema
  • Una playlist que evoluciona

    Cada estación mantiene un buffer dinámico. Se generan temas nuevos de forma continua y los más antiguos salen para hacerles espacio, así que con el tiempo la programación cambia por completo en vez de repetir las mismas canciones en bucle.

  • Los fallos no llegan a los oídos

    Un circuit breaker protege al sistema cuando falla la API de generación, y la radio sigue sonando con lo que ya hay en el buffer. Su estado también llega al cliente, que puede avisar con un amable "estamos afinando la señal".

  • Que suene como una radio

    Las transiciones con crossfade y el control automático de ganancia evitan cortes y saltos de volumen entre temas generados por separado. Cada MP3 lleva además sus metadatos ID3.

  • Estaciones como configuración

    Cada estación se declara en un archivo YAML, con su punto de montaje, su nombre y sus prompts. Sumar una no requiere tocar el código del orquestador.

  • Un cliente que se entera al instante

    Los cambios de canción, las actualizaciones del buffer y el estado del circuit breaker se envían como eventos, para que la interfaz no tenga que estar preguntando.

El reto

Sostener una radio de música generada con IA todo el día, sin operador, de forma que un fallo puntual nunca llegue a los oídos de quien está escuchando. Generar un tema tarda, y una transmisión en vivo no puede esperar.

Lo que hay detrás

  • El backend y el motor de streaming viven en un repositorio, el cliente en Next.js en otro y ACE-Step corre como un servicio independiente.
  • Todo el backend se levanta con Docker Compose, incluidos Icecast y Liquidsoap.
  • El sistema expone sondas de salud, métricas de Prometheus y logs estructurados.
  • Tiene rate limiting para proteger la API de abusos.
  • Las pruebas cubren unidad, integración, smoke, contratos de API, resiliencia y carga con Locust.

Decisiones y trade-offs

  • Generar antes de transmitir. Generar por adelantado consume más recursos, pero quien escucha no depende del tiempo de inferencia del modelo.
  • Degradar en vez de caer. Si una pieza falla, el sistema la aísla y la radio sigue sonando.
  • Separar el generador de la radio. Hay más servicios que coordinar, pero el modelo puede fallar, reiniciarse o cambiar sin detener la emisión.
  • Usar Icecast y Liquidsoap en vez de un streaming propio. Dependo de sus formas de configurarse, y a cambio me apoyo en herramientas de radio ya probadas.