Ingeniería
Por qué DanceGAI usa un Planner + Noter para generar beatmaps
En lugar de pasar directamente del audio a las notas, ManiaGAI primero planifica el gameplay de cada sección con un modelo de difusión y luego coloca las notas con un transformer al estilo MaskGIT. Las razones, las concesiones y lo que hace posible.
La forma más natural de describir un generador de beatmaps con IA es “entra audio, pasa por una red neuronal, salen notas”. ManiaGAI no funciona así. Divide el trabajo en dos: un Planner decide cómo debería sentirse al jugar cada parte de la canción, y un Noter decide exactamente dónde van las notas. Este artículo explica por qué, qué hace cada modelo y qué cuesta esa división.
Un beatmap es un arreglo, no una transcripción
Un mapa que sigue fielmente el audio no es necesariamente un buen mapa. Un buen mapa de osu! mania se parece más a un arreglo: el mapper decide qué sonidos merecen notas, qué tan densa debe sentirse una sección, dónde va un jack o una long note, cómo fluyen los patrones entre las manos, y cómo cambia todo eso entre un Easy y un Expert de la misma canción.
Un único modelo que pasa directamente del audio a las notas tiene que tomar todas esas decisiones a la vez, en cada momento: estructura, dificultad, estilo y la columna exacta. Ese tipo de modelo tiende a acertar en los detalles locales mientras pierde la forma de la canción: un estribillo que no golpea más fuerte que la estrofa, un breakdown que no respira.
Dos preguntas, dos modelos
- Música
- Comprensión
- Planner
- Noter
- Validación
- Beatmap
Ambos modelos leen la misma imagen musical de la canción: una cuadrícula de timing y una representación del audio alineada con ella pulso a pulso (del modelo de código abierto MERT). A partir de ahí:
- El Planner responde qué debería pasar. Antes de que exista ninguna nota, traza la estructura de gameplay de toda la canción, sección por sección: qué tan difícil debería ser cada parte y la mezcla de long notes, jacks y otros tipos de patrones.
- El Noter responde cómo van las notas. Convierte el plan en una colocación real (qué columnas, qué notas son taps y cuáles long notes, cómo se conectan los patrones) siguiendo tanto el plan como el audio.
Cada modelo tiene un trabajo más acotado, y el plan le da a la generación de notas algo que a un modelo nota por nota le falta: una visión de toda la canción que ya está decidida.
El Planner: difusión gaussiana sobre toda la canción
El Planner es un modelo de difusión gaussiana de unos 6 millones de parámetros. Genera el plan de todas las secciones de la canción de forma conjunta, condicionado por la música, el número de teclas y la dificultad y el estilo pedidos.
La difusión encaja con este trabajo por dos razones. Un plan es una descripción suave y continua de una canción (la dificultad local y la mezcla de patrones que suben y bajan con el tiempo), que es el tipo de señal que los modelos de difusión manejan bien. Y generarlo como un todo, en lugar de sección tras sección, permite al Planner equilibrar la canción entera a la vez: puede hacer que el estribillo sea el pico y que el puente sea un respiro porque ve ambos.
El Noter: refinamiento al estilo MaskGIT
El Noter es un transformer no autorregresivo al estilo MaskGIT de unos 51 millones de parámetros. Los mapas se representan como tokens de patrón discretos. En lugar de escribirlos uno a uno desde el principio de la canción hasta el final, el Noter rellena el mapa completo y lo refina en varias pasadas: fija las notas de las que está seguro y revisa el resto. Cómo se programan esas pasadas a lo largo de una canción es un método propio, y una de las cosas que mantenemos en privado.
¿Por qué no generar el mapa de izquierda a derecha, como un modelo de lenguaje escribe texto?
- Escribir estrictamente de izquierda a derecha significa que las primeras decisiones no pueden tener en cuenta la música que viene después, y los errores se acumulan a lo largo de una canción larga.
- En un modelo de refinamiento, cada pasada ve el contexto a ambos lados de cada sección, lo que mantiene los patrones coherentes en toda la canción.
- El mapa completo se produce en un número fijo de pasadas en lugar de un token cada vez, lo que también importa para la velocidad.
- Una sección se puede revisar sin regenerar todo lo que viene después (más sobre esto abajo).
La dificultad y el estilo son entradas, no añadidos de última hora
La división es también lo que hace que la generación sea controlable. ManiaGAI recibe controles explícitos, y los modelos se entrenaron para seguirlos:
- Número de teclas: de 4K a 9K.
- Dificultad: cualquier selección de star ratings de ★1 a ★10; una sola ejecución produce un mapset completo.
- Estilo: cinco dimensiones: proporción de long notes, long notes inversas, jacks, long notes cortas y delay. Cada dificultad puede tener su propio estilo, calibrado a partir de mapas reales con ese número de teclas y ese star rating.
Estos controles actúan sobre el plan, que es donde importan: “más difícil”, “más long notes” o “más jacks” son decisiones sobre la forma de una sección, no sobre una nota. La densidad no es un control aparte: se deriva de la dificultad objetivo y del plan. Y como cada dificultad se genera a partir de la misma comprensión de la canción, un mapset se lee como una familia de mapas y no como mapas sin relación entre sí.
La regeneración local sale del propio diseño
Los mapas generados rara vez están mal en todas partes. Lo más habitual es que falle un pasaje: un patrón que no encaja, un tramo demasiado denso. Regenerar el mapa entero para arreglarlo tira a la basura todo lo que ya estaba bien.
- Seleccionar
- Enmascarar
- Regenerar
- Refinar
Como el Noter refina un mapa completo en lugar de escribirlo de izquierda a derecha, puede regenerar una región seleccionada manteniendo fijo todo lo que la rodea y usando las notas de alrededor como contexto; así la nueva sección se integra en el mapa en lugar de chocar con él. Esa es la base de la edición por secciones: un editor de mapas en el que seleccionas la parte que no te gusta y regeneras solo esa sección, o editas las notas tú mismo y pruebas el resultado jugando, está en pruebas internas. Todavía no está disponible en el sitio.
Entrenarlos por separado
Los dos modelos se entrenan por separado, cada uno con la representación con la que trabaja: el Planner como modelo de difusión sobre una descripción del gameplay de cada sección, y el Noter mediante predicción de tokens enmascarados sobre tokens de patrón. Las muestras se equilibran por número de teclas y nivel de dificultad para que las combinaciones raras, como 8K a ★10, no queden ahogadas por las comunes. Los datos detrás de ambos se describen en Por dentro del dataset de un mapper de osu! mania con IA.
Lo que cuesta la división
Una jerarquía no sale gratis. Las concesiones con las que convivimos:
- Dos modelos que entrenar y mantener sincronizados. El plan es una interfaz entre ellos; cuando cambia su definición, ambos lados tienen que adaptarse.
- El Noter solo puede ser tan bueno como el plan que recibe. Un plan que juzga mal una sección le da al Noter un encargo equivocado.
- Un plan solo describe lo que decidimos describir. La dificultad y la mezcla de patrones por sección capturan mucho de lo que hace que un mapa se sienta como se siente, pero no todo lo que pretende un mapper.
Lo que no afirmamos
No hemos comparado este diseño con un único modelo de extremo a extremo entrenado con los mismos datos, así que no afirmamos que sea mejor. Lo que sí podemos decir es que nos da una forma más limpia de modelar por separado la estructura de largo alcance y la colocación local de las notas, un lugar natural para los controles de dificultad y estilo, y un modelo que puede revisar una sección de un mapa sin tocar el resto. El estilo de mapping todavía se controla con un puñado de dimensiones; describir un estilo con un ejemplo en lugar de con barras deslizantes es una dirección en la que estamos trabajando.
La página de Tecnología muestra dónde encajan ambos modelos en el pipeline completo, y cómo hicimos rápida la generación explica lo que hace falta para ejecutarlos.