Inżynieria
Dlaczego DanceGAI generuje beatmapy za pomocą Planner + Noter
Zamiast zamieniać audio prosto w nuty, ManiaGAI najpierw planuje rozgrywkę każdej sekcji modelem dyfuzyjnym, a potem rozmieszcza nuty transformerem w stylu MaskGIT. Uzasadnienie, kompromisy i to, co to umożliwia.
Najbardziej naturalny opis generatora beatmap z AI to „audio na wejściu, sieć neuronowa, nuty na wyjściu”. ManiaGAI nie działa w ten sposób. Dzieli zadanie na dwie części: Planner decyduje, jak każda część piosenki ma się grać, a Noter decyduje, gdzie dokładnie trafiają nuty. Ten wpis wyjaśnia, dlaczego tak, co robi każdy z modeli i ile kosztuje taki podział.
Beatmap to aranżacja, a nie transkrypcja
Mapa, która wiernie podąża za audio, nie musi być dobrą mapą. Dobra mapa osu! mania bliższa jest aranżacji: mapper decyduje, które dźwięki zasługują na nuty, jak gęsta ma być dana sekcja, gdzie pasuje jack albo długa nuta, jak patterny przechodzą między dłońmi — i jak to wszystko zmienia się między Easy a Expert tej samej piosenki.
Pojedynczy model, który zamienia audio prosto w nuty, musi podejmować wszystkie te decyzje naraz, w każdej chwili: strukturę, trudność, styl i dokładne rozmieszczenie w kolumnach. Taki model zwykle dobrze radzi sobie z lokalnymi szczegółami, ale gubi kształt piosenki — refren nie uderza mocniej niż zwrotka, a breakdown nie daje odetchnąć.
Dwa pytania, dwa modele
- Muzyka
- Rozumienie
- Planner
- Noter
- Walidacja
- Beatmap
Oba modele czytają ten sam muzyczny obraz piosenki: siatkę timingu i reprezentację audio wyrównaną do niej beat po beacie (z open-source’owego modelu MERT). Dalej:
- Planner odpowiada na pytanie, co ma się dziać. Zanim powstanie jakakolwiek nuta, rozkłada strukturę rozgrywki całej piosenki, sekcja po sekcji: jak trudna ma być każda część i jaka ma być mieszanka długich nut, jacków i innych typów patternów.
- Noter odpowiada na pytanie, jak mają iść nuty. Zamienia plan w faktyczne rozmieszczenie — które kolumny, które nuty są zwykłe, a które długie, jak łączą się patterny — podążając zarówno za planem, jak i za audio.
Każdy model dostaje węższe zadanie, a plan daje generowaniu nut coś, czego brakuje modelowi działającemu nuta po nucie: obraz całej piosenki, który został już ustalony.
Planner: dyfuzja gaussowska nad całą piosenką
Planner to gaussowski model dyfuzyjny o około 6 milionach parametrów. Generuje plan dla wszystkich sekcji piosenki jednocześnie, warunkowany muzyką, liczbą klawiszy oraz żądaną trudnością i stylem.
Dyfuzja pasuje do tego zadania z dwóch powodów. Plan to gładki, ciągły opis piosenki — lokalna trudność i mieszanka patternów rosnące i opadające w czasie — a z takim sygnałem modele dyfuzyjne radzą sobie dobrze. A generowanie go w całości, zamiast sekcja po sekcji, pozwala Plannerowi wyważyć całą piosenkę naraz: może sprawić, że refren będzie szczytem, a bridge chwilą oddechu, bo widzi oba.
Noter: udoskonalanie w stylu MaskGIT
Noter to nieautoregresyjny transformer w stylu MaskGIT o około 51 milionach parametrów. Mapy są reprezentowane jako dyskretne tokeny patternów. Zamiast zapisywać je jeden po drugim od początku piosenki do końca, Noter wypełnia całą mapę i udoskonala ją w kilku przejściach — zatwierdzając nuty, których jest pewien, i wracając do pozostałych. To, jak te przejścia są rozłożone w piosence, to nasza własna metoda i jedna z rzeczy, które zachowujemy dla siebie.
Dlaczego nie generować mapy od lewej do prawej, tak jak model językowy pisze tekst?
- Pisanie ściśle od lewej do prawej oznacza, że wczesne decyzje nie mogą uwzględniać późniejszej muzyki, a błędy kumulują się w długiej piosence.
- W modelu udoskonalającym każde przejście widzi kontekst po obu stronach każdej sekcji, co utrzymuje spójność patternów w całej piosence.
- Cała mapa powstaje w stałej liczbie przejść, a nie po jednym tokenie naraz — co ma też znaczenie dla szybkości.
- Sekcję można poprawić bez generowania od nowa wszystkiego, co jest po niej (więcej o tym niżej).
Trudność i styl to dane wejściowe, a nie dodatek na koniec
Podział sprawia też, że generowanie da się kontrolować. ManiaGAI przyjmuje jawne ustawienia, a modele zostały wytrenowane, żeby za nimi podążać:
- Liczba klawiszy — od 4K do 9K.
- Trudność — dowolny wybór ocen gwiazdkowych od ★1 do ★10; jeden przebieg tworzy cały mapset.
- Styl — pięć wymiarów: udział długich nut, odwrócone długie nuty (inverse), jacki, krótkie długie nuty i delay. Każdy poziom trudności może dostać własny styl, skalibrowany na prawdziwych mapach przy tej liczbie klawiszy i tej ocenie gwiazdkowej.
Te ustawienia działają na plan, czyli tam, gdzie mają znaczenie: „trudniej”, „więcej długich nut” czy „więcej jacków” to decyzje o kształcie sekcji, a nie o pojedynczej nucie. Gęstość nie jest osobnym pokrętłem — wynika z docelowej trudności i planu. A ponieważ każdy poziom trudności jest generowany z tego samego zrozumienia piosenki, mapset czyta się jak jedną rodzinę map, a nie zbiór niezwiązanych ze sobą.
Lokalne generowanie od nowa wynika z samej konstrukcji
Wygenerowane mapy rzadko są złe w całości. Częściej jeden fragment odstaje — pattern, który nie pasuje, odcinek zbyt gęsty. Generowanie całej mapy od nowa, żeby to naprawić, wyrzuca wszystko, co już było dobre.
- Zaznacz
- Zamaskuj
- Wygeneruj ponownie
- Udoskonal
Ponieważ Noter udoskonala całą mapę, zamiast pisać ją od lewej do prawej, może ponownie wygenerować zaznaczony fragment, zachowując bez zmian wszystko wokół i używając otaczających nut jako kontekstu — dzięki temu nowa sekcja wpasowuje się w mapę, zamiast się z nią gryźć. To podstawa edycji na poziomie sekcji: edytor map, w którym zaznaczasz fragment, który ci się nie podoba, i generujesz ponownie tylko tę sekcję, albo sam edytujesz nuty i testowo grasz wynik, jest w wewnętrznych testach. Na stronie nie jest jeszcze dostępny.
Osobny trening
Oba modele są trenowane osobno, każdy na reprezentacji, z którą pracuje: Planner jako model dyfuzyjny nad opisem rozgrywki każdej sekcji, Noter przez przewidywanie zamaskowanych tokenów patternów. Próbki są równoważone między liczbami klawiszy i poziomami trudności, żeby rzadkie kombinacje, takie jak 8K przy ★10, nie ginęły wśród częstych. Dane stojące za oboma modelami opisuje artykuł Zbiór danych stojący za AI mapperem osu! mania.
Ile kosztuje podział
Hierarchia nie jest za darmo. Kompromisy, z którymi żyjemy:
- Dwa modele do wytrenowania i utrzymania w zgodzie. Plan jest interfejsem między nimi; gdy zmienia się jego definicja, obie strony muszą za tym nadążyć.
- Noter może być tylko tak dobry jak plan, który dostaje. Plan, który źle oceni sekcję, daje Noterowi złe wytyczne.
- Plan opisuje tylko to, co zdecydowaliśmy się opisać. Trudność i mieszanka patternów na poziomie sekcji oddają wiele z tego, jak mapa się czuje, ale nie wszystko, co zamierza mapper.
Czego nie twierdzimy
Nie porównaliśmy tej konstrukcji w benchmarku z pojedynczym modelem end-to-end trenowanym na tych samych danych, więc nie twierdzimy, że jest od niego lepsza. Możemy powiedzieć tyle, że daje nam czystszy sposób na osobne modelowanie struktury dalekiego zasięgu i lokalnego rozmieszczenia nut, naturalne miejsce na ustawienia trudności i stylu oraz model, który potrafi poprawić jedną sekcję mapy bez ruszania reszty. Styl mapowania wciąż jest sterowany kilkoma wymiarami; opisywanie stylu przykładem zamiast suwakami to kierunek, w którym zmierzamy.
Strona Technologia pokazuje, gdzie oba modele mieszczą się w pełnym pipeline, a artykuł o tym, jak przyspieszyliśmy generowanie, opisuje, czego wymaga ich uruchamianie.