Helyben futó AI-zeneműhely: jegyzetek egy befejezetlen mellékprojektről

Mellékprojekt – és annak is nevezem. Egy kis helyi szerver, amely fél tucat nyílt zenei modellt fog össze egyetlen böngészős munkafelületen; a részeket egy közös kimeneti mappa tartja egyben. Mi működik, mi nem, és egyáltalán miért építettem meg.

Helyben futó AI-zeneműhely: jegyzetek egy befejezetlen mellékprojektről

Ez mellékprojekt. Nem szolgáltatás, nem szerepel az árlistán, és filmzenét sem vállalok vele. Prototípus, amely a stúdió egyetlen gépén fut. A csak böngészőben futó fele Musiccer néven nyilvános a Labs oldalon; a modellekre épülő fele nem. Azért írok róla, mert építés közben olyasmit tanultam a helyi modellekről, ami a fizetős munkámban is hasznomra válik.

Ami nem hagyott nyugodni: egy építészeti filmet megvágnak, színkorrigálnak, jóváhagynak, és ekkor kell hozzá harminc–kilencven másodpercnyi zene. Zenei stockkönyvtár – projektenként fizetni kell érte, aztán elmegy egy délután azzal, hogy az ember sorra elveti ugyanazt a hat „corporate-uplifting” számot, amelyet mindenki más is használ. Zeneszerző – nagy filmhez ő a jó választás, egy előcsarnokban szóló loophoz viszont túlzás. Állandó bosszúság, hogy melyik licenc melyik felhasználásra érvényes. Pontosan az a fajta probléma, amit egy vasárnap elkezdek piszkálgatni.

Képmodelleket már most is a saját hardveremen futtatok (a teljes utómunka-pipeline-t), legalább annyira a titoktartás, mint a költségek miatt. A hangnál kiderült, hogy ugyanaz a feladat, csak más köntösben: egy maréknyi nyílt modell, mindegyik saját Python-környezettel és saját elképzeléssel arról, mi számít fájlnak, köztük pedig rengeteg hálátlan bekötési munka. Ez a bekötés maga a munka. A képeknél is az volt.

A technológiai háttér

Egy Flask-szerver egy porton, kilenc statikus oldal, minden modell egy kis HTTP API mögött. Nincs buildlépés, nincs npm, nincs adatbázis. A generált fájlok az output/ mappába kerülnek, minden feladat saját könyvtárba.

  • Szimbolikus hangszerelés. A SymphonyGen – ütemre kvantált harmóniavázzal kondicionált hierarchikus modell, amelyet elfogadtak az ISMIR 2026 konferenciára – zenekari MIDI-t ír a nulláról vagy egy akkordmenetből kiindulva. Három kiadott checkpointja van, futásonként legfeljebb négy változatot ad.
  • Szövegből MIDI. Az AMAAI Lab text2midi modellje szöveges leírásból készít MIDI-vázlatot.
  • Folytatás és kíséret. A Stanfordon fejlesztett Anticipatory Music Transformer vagy ott folytatja a komponálást, ahol a MIDI-fájl véget ér, vagy dallamként kezeli azt, és szólamokat ír köré.
  • Audió. Az ACE-Step 1.5 helyi alfolyamatként fut: promptból valódi hanganyagot készít, megadott BPM-mel és hangnemmel.
  • Elemzés, a másik irányba. A Basic Pitch hanganyagból MIDI-t ír át, a Demucs négy sávra (stemre) bontja a számot, a Matchering pedig egy referenciafelvételhez igazítva masterel egy mixet.
  • Hang. Egyetlen szoftveres szintetizátor az egész alkalmazáshoz: js-synthesizer 1.13.0 és libfluidsynth 2.4.6 WebAssemblyben, ugyanazzal a GeneralUser GS soundfonttal, amellyel a szerveroldali FluidSynth renderel. Tizenhat MIDI-csatorna, egy sztereó kimenet, ezért a sávonkénti hangerőt és panorámát a CC7 és a CC10 szabályozza, nem pedig egy gain node, amely itt nem is létezhetne.

Két dolog nem a gépen fut: a GrooVAE első használatkor a Google CDN-jéről tölti le a dobos checkpointjait, az eszközoldalak pedig CDN-ről töltik be a MIDI-lejátszó könyvtárukat.

Az oldalak

A kezdőlap egy vázlatfüzet: akkordmenet-szerkesztő, dallamsáv, dobrács, hatvankét skála, kadenciák jelölése, reharmonizációs javaslatok, negatív harmóniás tükrözés, dalszövegsáv, Web MIDI be- és kimenet.

A vázlatfüzet – balra az akkordkerék, középen az akkordmenet és a dallamsáv, alul a skálabillentyűzet

A dobsáv külön oldalt kapott: hangszerenként euklideszi lépésszerkesztő, a minta gyűrűkként megrajzolva, és két gomb, amely átadja az ütemet a GrooVAE-nek, hogy humanizálja vagy újrajátssza.

A doboldal – hangszerenként euklideszi lépésszerkesztő, a minta gyűrűkként, és két modellre épülő groove-gomb

Ehhez kapcsolódik az a rész, amire senkinek sem volt szüksége: egy világtérkép. Skálák, dobminták és ütemmutatók a származási helyükre tűzve, valamint ötvenöt hagyományos dal negyvenhat országból és régióból, mindegyik betölthető a vázlatfüzetbe. Eredetileg arra szolgált, hogy egy ismeretlen skála mondjon is valamit. Megtartottam, mert tetszett.

Innen az anyag a dalszerkesztőbe kerül: canvasra rajzolt idővonal MIDI- és audiosávokkal, mozgatható, rövidíthető, kettévágható és loopolható klipekkel, klipenkénti hullámformával, metronómmal, beszámolással, mentéssel és visszavonással. A transzport egész tickekben számol, negyedhangonként 480-nal; egy 25 ms-onként futó ütemező tölti fel a 150 ms-os előretekintési ablakot – ez a bevett, két időforrásra épülő megoldás, és ettől nem okoz gondot a lejátszás közbeni szerkesztés.

Ugyanez az oldal ugyanarra az adatmodellre egy második nézetet is kínál: egy session-rácsot, amelyet egy az egyben az Abletontól vettem át, ahelyett hogy újra feltaláltam volna. Sávonként egyszerre egy klip szól, az indítás ütemre vagy negyedre kvantált, a jelenetek a sorok, és egy QWERTY-billentyűrács négy jelenetet és nyolc sávot fed le. Bounce-oláskor a szerver FluidSynth-tel rendereli a MIDI-sávokat, ezeket egy OfflineAudioContext-ben összekeveri az audioklipekkel, és a kész mixet visszateszi az output/ mappába.

A kimeneti mappa az üzenetbusz

Az egyetlen tervezési döntés, amelyet vitában is megvédenék, épp a legkevésbé ötletes. Minden előállító egy feladatkönyvtárat hoz létre egy kis manifest.json fájllal: mi készítette, mikor, melyik szülőfeladatból, és minden egyéb ismert metaadat, például a BPM és a hangnem. Minden fogyasztó az output/ mappához viszonyított útvonalat fogad el, feltöltés helyett. Ennyi az egész átjárhatósági réteg. A fájlok szolgálnak IPC-ként. Nincs adatbázis, nincs sémaregiszter.

Illusztráció: a fájlok mint üzenetbusz – minden feladat egy mappa egy kis manifesttel, és minden eszköz mappákat olvas

Szinte ingyen rengeteget ad. Egy választólista a legutóbbi feladatokat a származási láncukkal együtt mutatja, így a „sávok ← dal ← vázlat” egy pillantással átlátható. Minden eredményhez tartozik egy „Küldés ide” menü, amelynek minden célpontja egyetlen sor egy útválasztási táblában. Egy BroadcastChannel révén az egyik fülön elkészült eredmény jelzi magát a többi fülnek.

A Labs nyitóoldala – itt található ennek a projektnek a böngészős fele és a többi kis eszköz, fiók és feltöltés nélkül

Hol tart most

Prototípus, és az eszközök közötti átadás még mindig a gyenge pontja.

A legutóbbi fejlesztési kört meghatározó tervezési jegyzet a hibák számbavételével kezdődött: öt, egymással nem kompatibilis hangjegyformátum volt használatban, minden átadás egyirányú volt, a vázlatfüzetből kifelé, és három eszköz zsákutcának bizonyult – a doboldal egyáltalán nem használta a szervert, a generált hanganyag soha nem került a közös mappába, a hangszerelő változatai pedig nem jutottak tovább sehová. Ez a három hiba mára megoldódott. Ami a helyükre került, az nem kész rendszer, hanem egy konvenció, amelyet jelenleg minden komponens betart.

A befejezetlen részek konkrétan: a vázlatfüzetben még mindig külön példány van az időzítő kódból. A dalszerkesztő klipeket szerkeszt, nem hangjegyeket – nincs piano roll nézet. Az audió a lejátszási sebesség változtatásával követi a tempót, ami a hangmagasságot is megváltoztatja; a valódi time-stretchinghez új függőség kellene, és eddig senkinek sem hiányzott annyira, hogy felvegye. Tizenöt dallamsáv fölött a sávok már közös MIDI-csatornán osztoznak, mert egy szintetizátornak tizenhat csatornája van. A harmóniavázat a rendszer szó nélkül harminckét ütemre ismétli vagy vágja. Egyszerre csak egy nehéz feladat futhat, mert egy GPU van és egy zár. Ha a fül háttérbe kerül, a böngésző annyira lefojtja az ütemezőt, hogy a lejátszás elakad.

Mindez nem ledolgozásra váró hibalista. Ezek tudatosan vállalt plafonok, hogy valami működőképes legyen, és mindegyik ott van leírva annál a kódrészletnél, amely előidézi. Lejátszik, generál, az átadás oda-vissza működik, és még nagyon messze van attól, hogy termék legyen.

Semmi nem került belőle ügyfélnek átadott filmbe. Lehet, hogy soha nem is fog. Az AI-jal komponált zene szerepel az árlistán, de az a produkciós pipeline zenei motorjaiból érkezik, ugyanazon a közös renderfelületen keresztül, mint minden más, amit átadok – nem ebből a műhelyből. Amit helyette kaptam: sokkal pontosabb képet arról, hová jutottak a helyben futó hangmodellek, hol véreznek még el, és hogy az „AI-eszközök” mekkora része valójában fájlkezelés. Nagyjából ugyanerre jutottam a képeknél is.

Ha ön is épít ilyesmit esténként, írjon egy sort.