본문 바로가기

Study Information Technology

음악 장르 분류 시스템 구축 CNN을 활용한 오디오 스펙트로그램 분류

728x90
반응형

음악 장르 분류 시스템 구축: CNN을 활용한 오디오 스펙트로그램 분류

Overview

음악 장르 분류 시스템은 음악 추천 시스템의 핵심 요소로, 사용자가 선호하는 음악을 더욱 정확하게 추천하는 데 기여합니다. 특히, 합성곱 신경망(CNN, Convolutional Neural Network)을 활용한 오디오 스펙트로그램 분석은 강력한 분류 성능을 보여주며, 오디오 신호의 특징을 잘 포착할 수 있습니다. 이번 글에서는 CNN을 사용하여 오디오 스펙트로그램을 기반으로 음악 장르를 분류하는 시스템을 구축하는 방법에 대해 자세히 설명하겠습니다.

1. 데이터 수집

음악 장르 분류 시스템을 구축하기 위해 먼저 필요한 것은 음악 데이터입니다. 일반적으로 사용되는 데이터셋으로는 GTZAN, FMA (Free Music Archive) 등이 있습니다.

GTZAN 데이터셋 예시

  • 구성: 10개 장르(클래식, 재즈, 록, 팝, 힙합 등)로 30초 길이의 오디오 클립 1000개
  • 형식: 각 곡은 WAV 형식으로 제공되며, 각 장르별로 100곡씩 수록되어 있습니다.

이런 데이터셋을 다운로드하고 로컬 환경에 저장하여 후속 단계에서 사용할 수 있습니다.

2. 오디오 스펙트로그램 변환

CNN 모델은 주로 이미지 데이터를 처리하기 위해 설계되었기 때문에, 오디오 신호를 시각적 형식으로 변환해야 합니다. 이를 위해 스펙트로그램을 생성합니다.

스펙트로그램 생성 과정

  1. 오디오 신호 로드: Python의 librosa 라이브러리를 사용하여 오디오 파일을 로드합니다.
  2. STFT (Short-Time Fourier Transform): 오디오 신호를 시간 영역에서 주파수 영역으로 변환합니다.
  3. 스펙트로그램: STFT 결과를 사용하여 스펙트로그램을 생성합니다.
import librosa
import numpy as np
import matplotlib.pyplot as plt

def create_spectrogram(file_path):
# 오디오 파일 로드
y, sr = librosa.load(file_path, sr=None)

# 스펙트로그램 생성
stft = np.abs(librosa.stft(y))
spectrogram = librosa.amplitude_to_db(stft, ref=np.max)

# 시각화
plt.figure(figsize=(10, 4))
librosa.display.specshow(spectrogram, sr=sr, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('Spectrogram')
plt.tight_layout()
plt.show()

# 사용 예시
create_spectrogram('path/to/your/audio/file.wav')

3. 데이터 전처리

스펙트로그램 생성 후, CNN에 입력할 수 있는 형태로 데이터를 전처리해야 합니다.

전처리 단계

  1. 크기 조정: 모든 스펙트로그램을 동일한 크기로 조정합니다. 예를 들어, 128x128 픽셀.
  2. 정규화: 각 픽셀 값을 0과 1 사이로 정규화하여 학습 속도를 향상시킵니다.
from sklearn.preprocessing import MinMaxScaler

def preprocess_spectrogram(spectrogram):
# 크기 조정 및 정규화
spectrogram_resized = cv2.resize(spectrogram, (128, 128))
spectrogram_normalized = MinMaxScaler().fit_transform(spectrogram_resized)
return spectrogram_normalized

4. CNN 모델 설계

CNN 모델은 오디오 스펙트로그램의 특징을 학습하여 장르를 분류합니다. 다음은 Keras를 사용하여 CNN 모델을 구축하는 예시입니다.

CNN 모델 예시

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout

def create_cnn_model():
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))  # 10개 장르

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
return model

# 모델 생성
cnn_model = create_cnn_model()

5. 모델 훈련

훈련 데이터를 준비하고 모델을 학습시킵니다. 데이터셋을 훈련 세트와 검증 세트로 나누고, 훈련을 진행합니다.

훈련 코드 예시

from keras.utils import to_categorical
from sklearn.model_selection import train_test_split

# X: 스펙트로그램 배열, y: 장르 레이블
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

# One-hot 인코딩
y_train_categorical = to_categorical(y_train, num_classes=10)
y_val_categorical = to_categorical(y_val, num_classes=10)

# 모델 훈련
history = cnn_model.fit(X_train, y_train_categorical, epochs=50, validation_data=(X_val, y_val_categorical))

6. 모델 평가

훈련이 완료된 후, 검증 데이터를 사용하여 모델의 성능을 평가합니다. 주로 정확도, 정밀도, 재현율 등의 지표를 사용합니다.

평가 코드 예시

loss, accuracy = cnn_model.evaluate(X_val, y_val_categorical)
print(f'Validation Accuracy: {accuracy * 100:.2f}%')

7. 예측 및 추천 시스템 통합

모델이 장르를 성공적으로 분류할 수 있다면, 이를 추천 시스템에 통합할 수 있습니다. 사용자가 선호하는 장르를 기반으로 유사한 곡들을 추천하는 방식입니다.

추천 시스템 예시

  1. 유사 곡 찾기: 사용자가 좋아하는 곡의 장르를 기반으로 데이터베이스에서 유사한 곡을 찾습니다.
  2. 추천: 추천할 곡 리스트를 사용자에게 제공하는 방식입니다.

8. 에러 처리 및 디버깅

모델 학습 및 평가 과정에서 다양한 에러가 발생할 수 있습니다. 예를 들어, 메모리 부족으로 인한 에러가 발생할 수 있습니다. 이런 경우, 배치 크기를 줄이거나, 더 작은 모델을 사용하는 것이 효과적입니다.

일반적인 에러 메시지

  • ResourceExhaustedError: OOM when allocating tensor...
  • 해결: 배치 크기 감소
  • ValueError: Shapes (None, x) and (None, y) are incompatible
  • 해결: 레이블의 차원 조정 (One-hot 인코딩 확인)

Conclusion

음악 장르 분류 시스템은 CNN을 활용하여 오디오 스펙트로그램을 효과적으로 분석함으로써, 추천 시스템의 정확성을 높이는 데 기여할 수 있습니다. 이 시스템은 데이터 수집, 전처리, 모델 설계, 훈련, 평가의 단계를 거쳐 최종적으로 추천 알고리즘에 통합될 수 있습니다. 이러한 기술은 음악 스트리밍 서비스에서 사용자 경험을 향상시키는 데 중요한 역할을 합니다.

참고문서

728x90
반응형