
LoFinity: 갓 뽑아낸 여유로운 로파이 비트 🎧
요약
육아 휴직 중 개발된 LoFinity는 사용자가 분위기를 입력하면 로파이 비트를 생성해주는 웹 기반 서비스입니다. Three.js와 Anthropic의 모델, MusicGen을 활용하여 3D 환경에서 음악을 생성하고 카세트 테이프 형태로 제공합니다.
핵심 포인트
- Three.js를 활용한 로우 폴리 스타일의 3D 웹 인터페이스 구현
- MusicGen 모델의 30초 생성 제한을 극복하기 위한 오디오 시드 연속 생성 방식 적용
- Anthropic 모델을 활용한 프롬프트 기반 음악 생성 워크플로우
- 개인적인 프로젝트로서의 개발 경험과 기술적 도전 과제 공유
Build Small Hackathon에서 가져온 작고 매우 개인적인 이야기

솔직하게 시작해 보겠습니다. 저는 육아 휴직 중에, 쉬지 않는 유아와 이제 막 세상을 알아가는 아기와 함께 이 모든 것을 만들었습니다. 사람들은 육아 휴직이 휴식이라고 생각합니다. 그렇지 않습니다. 그것은 아름답고, 시끄러우며, 약간의 대혼란 (pandemonium) 상태입니다.
그래서 LoFinity는 저의 작은 탈출구가 되었습니다. 여기저기서 한 시간, 혹은 20분씩, 항상 낮잠 시간 사이에 짬을 내어 작업했습니다. 그리고 솔직히 말하자면? 이것은 제 정신 건강에 가장 좋은 일 중 하나였습니다. 집을 떠나지 않고도 혼란으로부터 단절될 수 있는 방법이자, 저만의 것을 천천히, 하나씩 만들어가는 과정이었기 때문입니다.
왜 lofi인가, 그리고 왜 나인가
이 아이디어는 저에게 새로운 것이 아닙니다. 1년 넘게 머릿속에 담아두고 있었습니다. 저는 lofi 음악을 정말 좋아합니다. 진심으로 제가 가장 좋아하는 장르 중 하나입니다. 단순히 소리가 좋아서만은 아닙니다. 저는 신경다양성 (neurodivergent)을 가지고 있으며, 집중하는 것이 항상 쉽지만은 않습니다. lofi는 진정한 게임 체인저 (game-changer)였습니다. 따뜻하고 반복적이며 약간은 불완전한 비트들은 90년대 어린 시절의 향수를 불러일으키는 동시에, 마침내 제 뇌를 진정시키고 작업할 수 있게 해줍니다. 그래서 끝없이 lofi를 생성하는 작은 기계를 만드는 것은 거의 개인적인 일처럼 느껴졌습니다.
LoFinity란 무엇인가
LoFinity는 lofi를 위한 자판기입니다. 당신은 아늑한 로우 폴리 (low-poly) 스타일의 애니메이션 느낌이 나는 작은 거리에 도착합니다. 기계로 걸어가서, 동전을 넣고, 분위기 ("눈 내리는 오두막에서 늦게까지 공부하기")를 입력하면, 갓 생성된 노래가 담긴 카세트 테이프가 툭 튀어나옵니다. 모든 것이 여유롭고, 즐거우며, 도파민 (dopamine)을 과하게 자극하지 않습니다.
제가 지금 시작한 솔직한 이유
재미있는 점은 이겁니다. 제 머릿속에는 아주 명확한 _비전 (vision)_이 있었습니다. 하지만 그것을 실제로 구현할 만큼 Three.js에 익숙하지 않았죠. 웹에서의 3D는 항상 저를 위축되게 만들었습니다. 그러던 중 Anthropic이 Fable 5를 출시했고, 저는 반드시 그것을 써봐야만 했습니다. 정말 인상적이었습니다.
저는 _"그냥 모델에 프롬프트를 넣어서 노래 한 곡을 얻으면 되겠지."_라고 생각하며 시작했습니다. 하지만 현실은 제 비웃음을 샀습니다.
교훈 1: 30초라는 벽이 존재한다. MusicGen은 한 번에 약 30초 정도를 생성하며, 그것으로 끝입니다. 그것이 모델의 학습 윈도우 (training window)입니다. 제가 더 긴 테이프를 원하게 된 순간, 저는 조각들을 이어 붙여야 했습니다. 오디오의 마지막 몇 초를 가져와서 그것을 시드 (seed)로 다시 입력하고, 이어서 생성하는 방식입니다. 이론적으로는 간단합니다. 하지만 실제로는 연속 생성 과정에서 소리가 서서히 이상한 노이즈로 변질되었습니다. 저는 몇 시간 동안 그 버그를 쫓았습니다. 앰비언스 (ambience)가 시드로 유출되고 있었던 걸까요? 가이던스 스케일 (guidance scale) 문제였을까요? 그러다 진짜 원인을 이해하게 되었습니다. 각 연속 생성 단계가 _시드 + 30초_를 생성하고 있었고, 이로 인해 뒷부분이 모델의 30초 안심 구역을 벗어나 무너져 내리게 된 것이었습니다. 해결책은 총 길이가 해당 윈도우를 절대 넘지 않도록 매 생성 단계를 제한하는 것이었습니다. _"모델이 실제로 어떻게 작동하는지 가서 읽어봐라"_라는 아주 겸허해지는 순간이었습니다.
교훈 2: 하나의 모델이 모든 것을 할 수는 없다, 그러니 오케스트레이션 (orchestrate)하라. 음악 모델은 음악에는 뛰어나지만, "비"나 "바이닐 지지직 소리 (vinyl crackle)"와 같은 질감 관련 단어에는 완전히 _귀머거리_입니다. 그래서 저는 모델과 싸우는 것을 그만두었습니다. 작은 LLM이 레시피를 계획하고, MusicGen이 음표를 연주하며, 별도의 앰비언스 레이어가 그 위에 비 소리와 지지직거리는 소리를 추가합니다. 각 모델이 자신이 잘하는 한 가지 일만 수행하게 하는 것입니다. 작은 모델들과 스마트한 오케스트레이션의 조합은 모든 것을 다 하려는 하나의 거대한 모델보다 강력합니다.
교훈 3: 제약 조건이 당신을 창의적으로 만든다. ZeroGPU에서 실행한다는 것은 GPU가 별도의 포크된 프로세스 (forked process)에서 작동함을 의미하므로, 제가 만든 멋진 진행 표시줄 (progress bar)이 워커 (worker)가 무엇을 하고 있는지 볼 수 없었습니다. 저는 그것과 싸우는 대신, 진행 표시줄을 부드러운 _시간 기반 추정치 (time-based estimate)_로 전환했습니다. 또 다른 재미있는 점은, 런타임이 SPACES_ZERO_GPU='1'을 설정하지 'true'를 설정하지 않는다는 것이었습니다. 제 정확한 문자열 체크 로직 때문에 한동안 모든 작업이 조용히 CPU로 전송되었습니다. 업계에서 8년을 일했는데도 여전히 이런 고전적인 겸허함을 느끼곤 합니다 ✌️😅
그래서, 그럴 만한 가치가 있었을까요?
천 번이라도 그렇다고 말하겠습니다. 1년 넘게 품어왔던 아이디어를 세상에 내놓았고, 마침내 Three.js에 익숙해졌으며, 초보 부모로서의 삶 속 자투리 시간들을 쪼개어 이 일을 해냈습니다. LoFinity는 작고, 작은 오픈 모델 (open models) 위에서 구동되며, 진정으로 '나의 것'입니다. 배경에 로파이 (lofi) 음악이 깔려 있을 때 뇌가 더 잘 돌아가는 사람으로서, 그 음악을 만들어내는 기계를 구축하는 과정은 묘하게 치유되는 경험이었습니다.
여러분만의 테이프를 만들고 싶다면, 문은 열려 있습니다. 동전을 넣어보세요. ☕🎵
제가 목표로 하는 배지들 🏅
-
🌳 Thousand Token Wood (기발한 트랙) + Community Choice: LoFinity는 순수하게 아늑하고 기발합니다.
-
🎨 Off Brand: UI는 기본 Gradio 컴포넌트를 훨씬 뛰어넘는, 완전히 커스텀된 Three.js 세계입니다.
-
🐣 Tiny Titan: 제가 배포하는 모든 모델은 4B 이하입니다 (MiniCPM5-1B ~1B + MusicGen-medium ~1.5B).
-
🧩 MiniCPM sponsor prize: OpenBMB의 MiniCPM5-1B는 모든 곡을 계획하는 두뇌 역할을 합니다.
-
🎬 Best Demo: 데모 영상과 소셜 포스트를 올리고 나면 (말 그대로 제 다음 할 일입니다).
-
🤖 Best Agent: 멀티 모델 오케스트레이션 (multi-model orchestration), 즉 작은 LLM이 계획하고, 오디오 모델이 실행하며, 앰비언스 (ambience) 레이어가 무대를 꾸미는 방식입니다. 자율 에이전트 (autonomous agent)라기보다는 파이프라인 (pipeline)에 가깝지만, 다단계 모델 협업 (multi-step model collaboration)은 실재합니다.
-
🏆 Bonus Quest Champion: 여러 보너스 기준을 충족하는 것이 의미가 있다면 말이죠.
-
🃏 Judges' Wildcard: 뭐... 3D 로파이 자판기는 와일드카드 그 자체니까요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기