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

  1. Muzyka
  2. Rozumienie
  3. Planner
  4. Noter
  5. Walidacja
  6. 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.

  1. Zaznacz
  2. Zamaskuj
  3. Wygeneruj ponownie
  4. 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.