Music Utility for Suggestion & Evolution
몇년전부터 여러 부서에서 음악관련 개발 요청이 있었다. 보도/시사에서는 배경음악을 AI로 생성 가능하냐는 문의였고 라디오에서는 실시간 음악 추천과 BGM 큐레이션을 AI가 도와줄 수 있냐는 거였다.
들어보니 상황이 만만치 않았다. 수십년간 쌓인 음악의 데이터 규모도 컷고 무엇보다 저작권 이슈가 쉽지 않았다. 고민과 함께 MUSE 프로젝트가 시작됐다.
처음엔 그냥 검색 시스템이었다
솔직히 처음 설계는 단순했다. DB에 있는 음원 풀 데이터를 긁어와서 벡터로 임베딩하고, 비슷한 곡을 찾아주는 RAG 하나만 만들면 될 줄 알았다. 배치 스크립트 몇 개 만들고 AI 서버에 임베딩 모델 하나 올리면 끝날 줄 알았다.
그런데 아티스트 검색과 곡 검색은 완전히 다른 문제였다. "아이유 노래 틀어줘"라는 요청과 "이 곡이랑 비슷한 분위기 틀어줘"라는 요청은 같은 RAG로 처리하면 자꾸 엉뚱한 결과가 나왔다. 아티스트 정보(활동 시기, 장르, 소속)를 다루는 RAG와, 실제 음원 풀(멜로디, 템포, 분위기)을 다루는 RAG를 따로 만들어야 했다.
결국 파이프라인을 나눴다. 다중 RAG 구조를 정리하는 문서를 따로 만들 정도로 꼬였다(파일명만 봐도 고생이 느껴질 정도 -_-;). 하나로 "퉁"칠 수 있을 거라 생각했던 게 오산이었다.
대용량의 데이터를 실시간으로 검색해야 하는 상황이라, 벡터 DB를 직접 구현했다. Milvus 같은 오픈DB 사용해도 됐지만, 경량의 최적화된 벡터DB를 직접 만들고자 하는 열정이 불타올랐다.(그러지 말걸 -_ -...) FAISS로 인덱스를 만들고 클러스터 구성을 트레이닝 시켰다.
이렇게 만든 대량의 인덱스와 다중 RAG는 플레이리스트 생성 기능의 기반이 됐다. (잘 만든 아키텍처의 가치는 확장에서 온다.)
검색만으로는 끝나지 않더라
그다음 요청은 좀 다른 방향이었다. "아예 없는 음악도 하나 만들어줄 수 있어요? 효과음도요." 텍스트 프롬프트만 던지면 곡이나 효과음이 뚝딱 나오는 걸 원했다.
문제는 방송에 쓸 음악을 AI로 만들다 보니 기존 곡과 너무 비슷한 결과물이 나올 위험이 있었다는 거다. 그래서 생성된 음원을 보유 음원과 비교하는 저작권 검사 파이프라인을 따로 붙였다. 점수가 임계값을 넘으면 아예 반환하지 않는다. 이 로직 하나 다듬는 데도 꽤 오래 걸렸다.
AI Agent 세상으로
AI 시대가 도래하고 MCP가 보편화 되면서 개발자가 아니더라도 누구가 쉽게 에이전트를 만들어 사용하는 세상이 됐다. 필자가 속한 회사도 그 변화에 빠르게 편승중이라, 지금까지 만든 검색·생성 기능을 쉽게 가져다 쓸 수 있게 열어뒀다. 검색과 BGM·효과음 생성을 제공하고, 클라이언트별 하루 생성 한도를 관리한다.
단, 음원 생성의 경우 저작권 검사를 건너뛸 수 있는 파라미터는 아예 만들지 않았다(요청이 들어와도 안 만들어줄 생각이다).
MUSE는 현장의 이야기에 귀기울이고 적극적으로 대응하면서 만들어진 종합 음악 플랫폼이다. AI가 실제 방송 업무(편성, 제작)에 이질감없이 녹아든 서비스이며 사용자가 지속적으로 늘어나면서 그 가치를 더욱 인정받고 있다. 단순히 기능 구현만을 고려하지 않고 확장 가능하도록 아키텍처를 만들었기 때문에, MUSEEK(https://fishingproductfr.com/@joypinkgom/212) 부터 MUSE 까지 음악 플랫폼 생태계가 구축될 수 있었다.