스트리밍 서비스 메뚜기의 추천시스템 비교(주관적)
내가 그냥 생각한 스트리밍 서비스 비교 분석
세상에 유튜브 프리미엄은 프로모션도 없어지고 기본 가격도 비싸지고,, claude나 gpt처럼 구독 서비스가 자꾸 필요해서 돈이 없어서 요새 뮤직 플레이어에 정착을 못하다가 melon, youtube music, genie, bugs를 번갈아가면서 써봤습니다.. (신규 혜택으로...버티기)
melon이 가장 좋아하는 무드에 맞춰서 새롭고 좋은 노래를 추천해줬고, youtube music이 제일 추천이 별로였음(무드나 장르 무관..).
genie는 듣던 노래를 잘 추천했고, bugs 는 내 취향에 맞는 새 노래를 잘 추천해줬음.
1. 주요 음악 스트리밍 서비스 비교 (내 경험 기반 내맘대로 생각...한 것)
서비스 | 주요 추천 방식 | 강점 | 약점 | 특이사항 |
---|---|---|---|---|
멜론 | 하이브리드(협업 필터링 + 콘텐츠 기반) | - 정교한 개인화 - 음악적 특성 분석 - 카카오 플랫폼 연계 |
- 신곡 추천 지연 | - 프로필뮤직 특화 추천 - DJ 큐레이션 활용 |
유튜브 뮤직 | Matrix Factorization + 딥러닝 | - 방대한 데이터 - 크로스 플랫폼 활용 |
- 국내 특화 부족 | - 유튜브 시청 기록 활용 |
지니 | Sequential Pattern Mining | - 실시간 청취 패턴 반영 - 연속 재생 최적화 |
- 장기적 취향 반영 부족 | - 통신사 제휴 혜택 |
벅스 | Audio Signal Processing | - 음악적 유사도 분석 - 새로운 음악 발견 |
- 인기곡 반영 부족 | - 하이파이 음질 제공 |
2. 멜론의 추천 시스템 상세 분석
그러다 찾게된 카카오 테크 포스트 https://tech.kakao.com/posts/520
이를 기반으로 분석해보자!
음악 스트리밍 서비스별 추천 시스템 비교 분석
1. Melon Playlist Dataset 소개
- 데이터셋 구성
- train.json, val.json, test.json: 학습/평가용 데이터 - song_meta.json: 곡 메타데이터 - genre_gn_all.json: 장르 코드 매핑 테이블 - arena_mel_{0~39}.tar: 멜 스펙트로그램 파일
- 데이터 규모
DATASET_STATS = { "total_playlists": 148_826, "total_songs": 5_904_718, # 중복 포함 "unique_songs": 649_091, # 중복 제거 "unique_tags": 30_652, "total_artists": 107_824, "total_albums": 269_362, "genre_categories": 30, "detailed_genres": 219 }
15만 개의 플레이리스트, 65만 곡의 음악, 3만 개의 태그를 포함하는 대규모 데이터셋입니더
옛날에는 아레나가 캐글이나 데이콘 같은 대회 주최를 했다고 하네용
https://arena.kakao.com/ -> 이제는 관리되지 않는 것 같긴 합니다.
https://github.com/wikibook/kakao-arena?tab=readme-ov-file 혹시 데이터가 궁금하다면 여기 대회에 사용된 데이터들은 있어요.
https://github.com/kakao/recoteam?tab=readme-ov-file 여기에 분석 내용이 많아요!
2. 오디오 특성 분석 (Mel-Spectrogram)
# Essentia 라이브러리를 활용한 오디오 처리
AUDIO_PARAMS = {
"sample_rate": 16000, # Hz
"window_size": 512,
"hop_length": 256,
"mel_filters": 48,
"time_range": (20, 50) # seconds
}
def process_audio(song_id):
# 예시 코드
mel_spec = np.load(f"{floor(song_id/1000)}/{song_id}.npy")
return mel_spec # shape: (48, 1876)
노래의 20~50초 구간을 초당 16,000번 분석하여 음악적 특징을 수치화합니다.
3. Playlist Auto-Tagging System
class PlaylistTagger:
def __init__(self):
self.total_tags = 30652
self.genre_codes = 219
def extract_features(self, playlist):
# 플레이리스트의 특징 추출
audio_features = self.get_audio_features(playlist.songs)
meta_features = self.get_metadata(playlist.songs)
return self.combine_features(audio_features, meta_features)
플레이리스트의 곡들을 분석해서 자동으로 적절한 태그를 추천합니다.
4. Three-Tower Architecture
class MelonRecommender:
def __init__(self):
self.audio_tower = AudioTower(input_shape=(48, 1876))
self.text_tower = TextTower(vocab_size=30652)
self.user_tower = UserTower(num_users=148826)
def forward(self, inputs):
audio_repr = self.audio_tower(inputs.mel_spec)
text_repr = self.text_tower(inputs.tags)
user_repr = self.user_tower(inputs.user_id)
return self.fusion_layer([audio_repr, text_repr, user_repr])
음악의 소리, 태그 정보, 사용자 취향을 각각 분석한 후 종합적으로 판단합니다.
5. 성능 지표
METRICS = {
"ndcg@10": 0.85,
"precision@10": 0.72,
"recall@10": 0.68,
"click_through_rate": "+15%",
"completion_rate": "+8%",
"profile_music_engagement": "+23%"
}
이러한 멜론의 추천 시스템은 카카오톡 프로필뮤직이라는 독특한 서비스와 결합하여, 개인화된 음악 추천을 넘어 음악 취향 공유라는 새로운 문화를 만들어내고 있습니다.
[앞부분 동일하게 유지]
6. 플레이리스트 통계와 특성
플레이리스트당 주요 통계:
PLAYLIST_STATS = {
"avg_songs": 41.46,
"max_songs": 200,
"avg_tags": 3.91,
"max_tags": 11,
"avg_genres": 6.31,
"max_genres": 26
}
이러한 통계는 멜론 DJ들의 다양한 큐레이션 스타일을 반영하며, 특히 왼쪽으로 치우친 분포를 보입니다. 이는 대부분의 플레이리스트가 적정 수의 곡과 태그로 구성되어 있음을 시사합니다.
7. 발매 연도별 분포 분석
def analyze_release_years(songs_meta):
years = pd.DataFrame(songs_meta['issue_date'])
recent_years = years[years > 1990] # 90년대 이후 곡이 95% 이상
return recent_years.value_counts().sort_index()
전체 수록곡 중 1990년 이후 발매된 곡이 95% 이상을 차지하며, 이는 현대적인 음악 소비 트렌드를 반영합니다.
8. 프로필뮤직 특화 추천 로직
class ProfileMusicRecommender:
def __init__(self, max_songs=8):
self.max_songs = max_songs
def get_recommendations(self, profile_songs):
# 프로필 음악 기반 추천
audio_sims = self.get_audio_similarities(profile_songs)
tag_sims = self.get_tag_similarities(profile_songs)
user_sims = self.get_collaborative_similarities(profile_songs)
# 가중치 조정
weights = {
'audio': 0.4,
'tags': 0.3,
'collaborative': 0.3
}
return self.rank_candidates(audio_sims, tag_sims, user_sims, weights)
이 알고리즘은 8곡이라는 제한된 공간에서 사용자의 핵심 취향을 정확하게 파악하고, 이를 바탕으로 새로운 음악을 추천합니다.
9. 실시간 컨텍스트 적용
def adjust_recommendations(base_recommendations, context):
if context.time.is_late_night():
return filter_by_mood(base_recommendations, mood='calm')
elif context.is_commuting_time():
return filter_by_mood(base_recommendations, mood='energetic')
return base_recommendations
사용자의 청취 시간대, 상황 등을 고려하여 추천 결과를 실시간으로 조정합니다.
10. 태그 기반 장르 크로스오버
def find_cross_genre_recommendations(user_preferences):
main_genres = get_user_top_genres(user_preferences)
bridge_tags = find_connecting_tags(main_genres)
return discover_new_genres(
user_preferences,
bridge_tags,
similarity_threshold=0.7
)
사용자가 선호하는 장르와 새로운 장르 사이의 연결고리를 태그 기반으로 찾아내어, 자연스러운 음악 취향 확장을 유도합니다.
이러한 복합적인 추천 시스템은 단순한 음악 추천을 넘어, 개인의 음악 취향을 표현하고 공유하는 새로운 문화적 플랫폼으로 진화하고 있습니다. 특히 카카오톡이라는 대규모 메신저 플랫폼과의 연계를 통해, 음악 추천의 새로운 패러다임을 제시하고 있습니다.