정확히 LLM 관련 게시물은 아니지만, 모든 것이 로컬 추론(local inference)으로 이루어지기 때문에 이곳 분들이 좋아할 것 같아 올립니다. 노래에 맞춰 플레이하는 브라우저 리듬 러너를 만들었는데, 이 게임에서는 배경이 음악을 통해 구축됩니다. 사용자가 직접 MP3 파일을 넣을 수 있으며, '듣는' 과정 전체가 장치 내부, 즉 탭 안에서 이루어집니다. 아무것도 업로드되지 않습니다. 모든 모델은 onnxruntime-web(wasm)을 사용하여 각자 웹 워커(web worker) 내에서 로컬로 실행됩니다.
각 모델이 수행하는 작업은 다음과 같습니다:
- BeatNet (비트 및 다운비트 추적, 약 1.6 mb): 모든 비트와 마디 시작 지점을 찾아냅니다. 이 그리드 위에 레벨 전체가 놓여 있으며, 모든 장애물, 점프, 발차기는 이 비트 중 하나에 배치되고 드롭(drop)은 그 마디 라인에 떨어집니다.
- Basic Pitch by spotify (음표 전사, 약 0.2 mb): 어떤 음표들이 연주되고 있는지 파악합니다. 길게 지속되는 음표는 사용자가 스윙하는 마디나 선이 되고, 솔로(solo) 부분은 비행하는 고리들의 연속으로 변환되며, 각 고리는 해당 음표의 피치에 맞춰져 있습니다.
- Spleeter vocals net (소스 분리, 약 20 mb): 보컬을 믹스에서 추출하여 나머지 노래가 다음 모델을 혼란스럽게 하지 않도록 합니다.
- SwiftF0 (피치 추적, 약 0.1 mb): 목소리가 얼마나 높은지, 그리고 각 음절이 언제 시작하는지를 16ms 간격으로 추적합니다. 노래를 부르는 구절에서는 가수의 음절에 맞춰 고리들을 통과하며, 목소리의 멜로디에 따라 위아래로 움직입니다.
네 모델을 합치면 약 22 mb이며, 첫 로드 후 캐시됩니다. 만약 장치가 실시간으로 이 모델들을 실행할 수 없다면, 게임은 일반 DSP(Digital Signal Processing) 방식으로 전환되어도 작동합니다. 일반 DSP는 온셋(onsets), 모든 마디의 음량, 드롭이 떨어지는 위치를 파악합니다. 이것이 세계와 날씨를 결정하며, 드롭이 떨어질 때 세상은 미쳐 날뛰게 됩니다.
같은 노래는 항상 같은 세상을 만들어내기 때문에 학습할 수 있습니다. 비디오는 Pendulum & WARGASM의 'Cannibal' 전체를 게임 자체 봇 코드(MIT)가 연주한 것입니다: https://github.com/Felliks/Struna 플레이해 보기: https://struna.ai (휴대폰에서도 작동합니다)
영어가 모국어가 아니어서 AI의 도움을 받아 이 게시물을 작성했습니다.
코드의 상당 부분은 AI 도움(Claude Code)을 받아 작성되었어요. 브라우저에서 오디오 모델을 구동하는 다른 사용자들도 이를 공개해야 하는 건가요? 비트 트래킹(beat tracking)에 무엇을 사용하시는지 궁금합니다. 제 것은 여전히 /u/MrFelliks가 제출한 빠른 노래를 절반의 템포로 읽는 경우가 있어요 [link] [comments].