2) 솔루션 개요와 차별성
💡 쉽게 말하면: 국악 용어를 몰라도 되도록, 사용자가 이미 아는 음악 이름을 입구로 씁니다. “비 오는 날 듣는 아이유”라고 적으면 AI가 그 감성을 해석해 닮은 국악을 찾아 주고, 왜 닮았는지 설명해 줍니다. 그리고 그 감성이 그대로 필터가 되어 샘플 라이브러리로 이어집니다.
2-1. 솔루션 한 줄
사용자가 좋아하는 음악의 감성을 Gemini가 해석하고, pgvector가 국립국악원 음원 500건에서 가장 닮은 트랙을 찾아 근거와 함께 제시하며, 그 감성이 프리셋 URL을 타고 샘플 라이브러리 필터로 이어지는 국악 감성 매칭 플랫폼.
2-2. 세 개의 벽에 대응하는 세 개의 기능
| 문제 | SoundBridge의 대응 | 구현 위치 |
|---|---|---|
| 검색어의 벽 | 자연어 한 문장으로 검색. 국악 용어 지식 0으로 진입 | POST /api/soundbridge/discover |
| 감성의 벽 | 감성 6종 태그 + 벡터 유사도 + KO/EN 근거 문장 자동 생성 | TrackDiscoverInteractor · GeminiAdapter |
| 활용의 벽 | 장단별 루프 단위(박) 정규화 + BPM + KOGL 라이선스 배지 | jangdan 테이블 · LicenseBadge · LoopBadge |
① 검색어의 벽 → 자연어 입구
입력: "비 오는 날 듣는 아이유"
↓ Gemini analyze_emotion
{ emotions: ["서정", "차분"], mood: "잔잔하고 쓸쓸한",
instrument_hints: ["가야금"], embed_text: "비 오는 날의 잔잔하고..." }
사용자는 국악 어휘를 하나도 쓰지 않습니다. 번역은 전부 서버에서 일어납니다.
② 감성의 벽 → 근거가 붙은 매칭
매칭 결과에는 점수만이 아니라 왜 닮았는지가 한국어와 영어로 함께 옵니다. 프론트엔드의 WhyBox 컴포넌트가 이 문장을 카드 안에 그대로 보여 줍니다.
{
"id": "…", "title": "상사별곡050", "instrument": "장구", "jangdan": "중모리",
"emotion_tags": ["서정", "차분"], "bpm": 90, "loop_unit_beats": 12,
"score": 0.87,
"explanation": "느린 중모리 장단의 여백이 잔잔한 발라드의 호흡과 겹칩니다.",
"preset_url": "/create?instrument=장구&emotion=서정&bpm_min=70&bpm_max=110"
}
③ 활용의 벽 → 마디가 맞는 샘플
장단마다 루프 단위(박)를 마스터 테이블로 못 박아 두었습니다.
| 장단 | 루프 단위 | 감성 매핑(수집 규칙) |
|---|---|---|
| 자진모리 | 12박 | 신남 · 경쾌 |
| 중모리 | 12박 | 서정 · 차분 |
| 굿거리 | 12박 | 흥겨움 · 신명 |
| 휘모리 | 4박 | 긴박 · 빠름 |
| 세마치 | 6박 | 슬픔 · 차분 |
| 엇모리 | 10박 | 신비 · 독특 |
크리에이터는 CREATE에서 루프 단위 = 12박으로 필터링해 자기 프로젝트 마디에 바로 얹을 샘플만 볼 수 있습니다.
2-3. 브릿지 — 이 프로젝트의 이름값
DISCOVER와 CREATE는 흔히 별개 서비스로 만들어집니다. SoundBridge는 이 둘을 한 줄의 URL로 잇습니다.
DISCOVER 결과 트랙 (가야금 · 서정 · BPM 100)
↓ CreatePresetInteractor (외부 IO 없는 순수 로직)
/create?instrument=가야금&emotion=서정&bpm_min=80&bpm_max=120
↓ useCreatePreset 훅이 쿼리 파싱
CREATE 필터가 채워진 상태로 열림 + PresetBanner로 "어디서 왔는지" 표시
BPM은 max(60, bpm − 20) ~ min(200, bpm + 20) 범위로 넓혀 전달합니다. 정확히 같은 BPM만 걸면 결과가 0건이 되기 쉽기 때문입니다. 자세한 규칙은 프리셋 브릿지 설계에 있습니다.
2-4. 유사 서비스와의 차별성
| 구분 | 국악 아카이브 / 국악디지털아카이브 | 해외 샘플팩 (Splice 등) | SoundBridge |
|---|---|---|---|
| 주 사용자 | 연구자·교육자 | 음악 크리에이터 | 국악을 모르는 크리에이터 |
| 검색 방식 | 곡명·악기·장단 | 장르·BPM·키 태그 | 자연어 감성 문장 |
| 국악 커버리지 | 매우 넓음 | 사실상 없음 (Asian 카테고리 대체) | 국립국악원 공공 음원 |
| 왜 이 곡인가 | 설명 없음 | 설명 없음 | AI 생성 KO/EN 근거 문장 |
| 루프 활용성 | 원본 음원 제공 | 루프·원샷 정리됨 | 장단→루프 단위(박) 정규화 |
| 라이선스 | 이용 조건 별도 확인 | 유료 구독, 조건 상이 | KOGL 1·2 배지로 상업 가능 여부 즉시 표시 |
| 비용 | 무료 | 유료 구독 | 무료 (공공 라이선스 기반) |
포지셔닝 한 줄: 아카이브는 보존하고, 샘플팩은 공급합니다. SoundBridge는 국악을 모르는 사람에게 국악을 번역합니다.
2-5. 설계 원칙 — AI가 사실을 지어내지 않는다
Gemini는 이 시스템에서 두 가지 일만 합니다.
- 사용자 입력 문장 → 감성 키워드와 임베딩용 텍스트 생성
- 이미 확정된 매칭 결과 → 왜 닮았는지 설명하는 문장 생성
어떤 트랙이 매칭되는지는 Gemini가 정하지 않습니다. 그건 pgvector의 코사인 거리 계산 결과입니다. BPM·장단·루프 단위·라이선스 같은 사실 값도 전부 DB에서 옵니다. 즉 LLM은 번역과 설명만 담당하고, 판단과 사실은 결정론적 계산이 담당합니다. 이 경계는 지능형 매칭 파이프라인에서 코드 수준으로 확인할 수 있습니다.