[python] 파이썬을 사용한 음악 스타일 분류

목차

  1. 들어가기
  2. 데이터 수집
  3. 데이터 전처리
  4. 머신러닝 모델 학습
  5. 결론

들어가기

음악은 다양한 스타일과 장르를 가지고 있습니다. 이번 블로그에서는 파이썬과 머신 러닝을 활용하여 음악의 스타일을 분류하는 방법에 대해 알아보겠습니다.

데이터 수집

음악 스타일 분류를 위해 GTZAN Genre Collection 데이터셋을 사용할 것입니다. 데이터셋은 1000개의 30초 길이의 음악 샘플을 포함하고 있으며, 10가지 다른 음악 장르를 가지고 있습니다.

import librosa
import numpy as np

def extract_feature(file_name):
    X, sample_rate = librosa.load(file_name)
    stft = np.abs(librosa.stft(X))
    mfccs = np.mean(librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=40).T,axis=0)
    chroma = np.mean(librosa.feature.chroma_stft(S=stft, sr=sample_rate).T,axis=0)
    mel = np.mean(librosa.feature.melspectrogram(X, sr=sample_rate).T,axis=0)
    contrast = np.mean(librosa.feature.spectral_contrast(S=stft, sr=sample_rate).T,axis=0)
    tonnetz = np.mean(librosa.feature.tonnetz(y=librosa.effects.harmonic(X), sr=sample_rate).T,axis=0)
    return mfccs,chroma,mel,contrast,tonnetz

데이터 전처리

데이터를 전처리하여 모델에 사용할 수 있는 형태로 변환해야 합니다. 이를 위해 음악 파일에서 특징을 추출할 것입니다.

import os
import pandas as pd

def create_metadata_and_labels(data_path):
    metadata = []
    labels = []
    for root, dirs, files in os.walk(data_path):
        for file in files:
            if file.endswith(".wav"):
                file_name = os.path.basename(file)
                label = file_name.split('.')[0]
                mfccs, chroma, mel, contrast, tonnetz = extract_feature(os.path.join(root, file))
                metadata.append({
                    'mfccs': mfccs, 'chroma': chroma, 'mel': mel, 'contrast':contrast, 'tonnetz': tonnetz
                })
                labels.append(label)
    return pd.DataFrame(metadata), pd.Series(labels)

머신러닝 모델 학습

전처리된 데이터를 사용하여 음악 스타일을 분류하기 위한 머신러닝 모델을 학습합니다.

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

metadata, labels = create_metadata_and_labels('data_path')
le = LabelEncoder()
y = le.fit_transform(labels)
X_train, X_test, y_train, y_test = train_test_split(metadata, y, test_size=0.2, random_state=42)

model = RandomForestClassifier(n_estimators=100, max_depth=50)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

결론

머신러닝 모델을 사용하여 음악 스타일을 분류하는 방법을 살펴보았습니다. 파이썬과 머신 러닝을 활용하여 다양한 음악 장르를 자동으로 분류하는 것은 흥미로운 주제입니다.

이는 실제로 음악 스트리밍 플랫폼이나 음악 추천 시스템에 적용될 수 있으며, 사용자 경험을 향상시키는데 도움이 될 수 있습니다.

참조