Python을 사용한 음악 장르 분류

Python에서 오디오 / 음악 신호 분석 가이드

Unsplash에 Jean의 사진

음악은 거울과 같으며, 당신이 좋아하든 싫어하든 당신이 누구인지, 무엇에 관심이 있는지 사람들에게 많은 것을 알려줍니다. "당신은 당신이 스트리밍하는 것입니다"라고 말하고 싶습니다 : Spotify

순자산이 260 억 달러에 달하는 Spotify 가 오늘날 음악 스트리밍 플랫폼을 지배하고 있습니다. 현재 데이터베이스에는 수백만 곡의 노래가 있으며 모든 사람에게 적합한 악보가 있다고 주장합니다. Spotify의 Discover Weekly 서비스는 밀레 니얼 세대의 인기를 끌었습니다. 말할 필요도없이 Spotify는 사용자가 음악을 찾고 듣는 방식을 개선하기 위해 연구에 많은 투자를했습니다. 기계 학습은 연구 의 핵심 입니다. NLP에서 협업 필터링, 딥 러닝에 이르기까지 Spotify는 모두 사용합니다. 노래는 디지털 서명을 기반으로 템포, 음향, 에너지, 댄스 가능성 등 일부 요소를 분석하여 불가능한 오래된 첫 데이트 질문에 답합니다. 어떤 종류의 음악을 좋아합니까?

객관적인

오늘날 회사 는 음악 분류를 사용하여 고객 (예 : Spotify, Soundcloud) 또는 단순히 제품 (예 : Shazam)에게 추천을 제공 할 수 있습니다. 음악 장르를 결정하는 것이 그 방향으로가는 첫 번째 단계입니다. 기계 학습 기술은 대규모 데이터 풀에서 추세와 패턴을 추출하는 데 매우 성공적으로 입증되었습니다. 음악 분석에서도 동일한 원칙이 적용됩니다.

이 기사에서는 파이썬에서 오디오 / 음악 신호를 분석하는 방법을 연구 할 것입니다. 그런 다음 학습 한 기술을 활용하여 음악 클립을 다른 장르로 분류합니다.

Python을 사용한 오디오 처리

사운드는 주파수, 대역폭, 데시벨 등과 같은 매개 변수를 갖는 오디오 신호 의 형태 로 표현됩니다. 일반적인 오디오 신호는 진폭과 시간의 함수로 표현 될 수 있습니다.

출처

이러한 사운드는 컴퓨터가 읽고 분석 할 수 있도록 다양한 형식으로 제공됩니다. 몇 가지 예는 다음과 같습니다.

  • mp3 형식
  • WMA (Windows Media Audio) 형식
  • wav (Waveform Audio File) 형식

Python에는 Librosa 및 PyAudio와 같은 오디오 처리를위한 훌륭한 라이브러리 가 있으며 일부 기본 오디오 기능을위한 내장 모듈도 있습니다.

오디오 수집 및 재생을 위해 주로 두 개의 라이브러리를 사용합니다.

1. 리브로 사

일반적으로 오디오 신호를 분석하는 Python 모듈이지만 음악에 ​​더 적합합니다. 여기에는 MIR (Music Information Retrieval) 시스템을 구축하기위한 너트와 볼트가 포함됩니다. 많은 예제 및 튜토리얼과 함께 매우 잘 문서화 되었습니다 .

패키지 디자인 원칙을 설명하는 고급 소개 SciPy 2015librosa 문서 를 참조하십시오 .

설치

pip install librosa
or
conda install -c conda-forge librosa

2. IPython.display.Audio

IPython.display.Audio jupyter 노트북에서 직접 오디오를 재생할 수 있습니다.

오디오 파일로드

import librosa
audio_path = '../T08-violin.wav'
x , sr = librosa.load(audio_path)
print(type(x), type(sr))
<class 'numpy.ndarray'> <class 'int'>
print(x.shape, sr)
(396688,) 22050

librosa.load(audio_path, sr=44100)

librosa.load(audio_path, sr=None)

샘플 속도 는 Hz 또는 kHz 단위로 측정 된 초당 전송되는 오디오 샘플 수입니다.

오디오 재생

사용 IPython.display.Audio하여 오디오 재생

import IPython.display as ipd
ipd.Audio(audio_path)
Ipython 오디오 위젯의 스크린 샷

이 위젯은 여기서 작동하지 않지만 노트북에서는 작동합니다. 들을 수 있도록 SoundCloud에 업로드했습니다.

오디오 예제에 mp3 또는 WMA 형식을 사용할 수도 있습니다.

오디오 시각화

파형

다음을 사용하여 오디오 배열을 플로팅 할 수 있습니다 librosa.display.waveplot.

%matplotlib inline
import matplotlib.pyplot as plt
import librosa.display
plt.figure(figsize=(14, 5))
librosa.display.waveplot(x, sr=sr)

스펙트로 그램

스펙트로 그램 의 시각적 표현이다 스펙트럼주파수소리 가 시간에 따라 변화 또는 다른 신호. 스펙트로 그램은 때때로라고 sonographs , 성문 , 또는 voicegrams . 데이터가 3D 플롯으로 표시되는 경우 폭포 라고 할 수 있습니다 . 2 차원 배열에서 첫 번째 축은 주파수이고 두 번째 축은 시간입니다.

다음을 사용하여 스펙트로 그램을 표시 할 수 있습니다. librosa.display.specshow.

X = librosa.stft(x)
Xdb = librosa.amplitude_to_db(abs(X))
plt.figure(figsize=(14, 5))
librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='hz')
plt.colorbar()

librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='log')
plt.colorbar()

librosa.output.write_wav NumPy 배열을 WAV 파일에 저장합니다.

librosa.output.write_wav('example.wav', x, sr)

이제 220Hz에서 오디오 신호를 생성 해 보겠습니다. 오디오 신호는 numpy 배열이므로 하나를 생성하여 오디오 함수에 전달합니다.

import numpy as np
sr = 22050 # sample rate
T = 5.0    # seconds
t = np.linspace(0, T, int(T*sr), endpoint=False) # time variable
x = 0.5*np.sin(2*np.pi*220*t)# pure sine wave at 220 Hz
Playing the audio
ipd.Audio(x, rate=sr) # load a NumPy array
Saving the audio
librosa.output.write_wav('tone_220.wav', x, sr)
    

특징 추출

모든 오디오 신호는 많은 기능으로 구성됩니다. 그러나 해결하려는 문제와 관련된 특성을 추출해야합니다. 특성을 추출하여 분석에 사용하는 프로세스를 특성 추출이라고합니다. 몇 가지 기능에 대해 자세히 살펴 보겠습니다.

  • 제로 크로싱 비율

예제 오디오 클립 의 제로 크로싱 비율 을 계산해 보겠습니다 .

# Load the signal
x, sr = librosa.load('../T08-violin.wav')
#Plot the signal:
plt.figure(figsize=(14, 5))
librosa.display.waveplot(x, sr=sr)
# Zooming in n0 = 9000 n1 = 9100 plt.figure(figsize=(14, 5)) plt.plot(x[n0:n1]) plt.grid()

zero_crossings = librosa.zero_crossings(x[n0:n1], pad=False)
print(sum(zero_crossings))
6

소리의 "질량 중심"이있는 위치를 나타내며 소리에 존재하는 주파수의 가중 평균으로 계산됩니다. 하나는 블루스 장르이고 다른 하나는 메탈에 속하는 두 곡을 생각해보십시오. 이제 전체 길이가 동일한 블루스 장르 노래에 비해 메탈 노래는 끝 부분에 더 많은 주파수가 있습니다. 따라서 블루스 노래의 스펙트럼 중심은 스펙트럼의 중간 어딘가에 있고 금속 노래의 경우 끝쪽에 있습니다.

librosa.feature.spectral_centroid 신호의 각 프레임에 대한 스펙트럼 중심을 계산합니다.

spectral_centroids = librosa.feature.spectral_centroid(x, sr=sr)[0]
spectral_centroids.shape
(775,)
# Computing the time variable for visualization
frames = range(len(spectral_centroids))
t = librosa.frames_to_time(frames)
# Normalising the spectral centroid for visualisation
def normalize(x, axis=0):
    return sklearn.preprocessing.minmax_scale(x, axis=axis)
#Plotting the Spectral Centroid along the waveform
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_centroids), color='r')
  • 스펙트럼 롤오프

librosa.feature.spectral_rolloff 신호의 각 프레임에 대한 롤오프 주파수를 계산합니다.

spectral_rolloff = librosa.feature.spectral_rolloff(x+0.01, sr=sr)[0]
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_rolloff), color='r')

신호의 MFCC (Mel frequency cepstral coefficients)는 스펙트럼 포락선의 전체 모양을 간결하게 설명하는 작은 기능 집합 (일반적으로 약 10-20)입니다. 그것은 인간의 목소리의 특성을 모델링합니다.

이번에는 간단한 루프 웨이브로 작업 해 봅시다.

x, fs = librosa.load('../simple_loop.wav')
librosa.display.waveplot(x, sr=sr)

mfccs = librosa.feature.mfcc(x, sr=fs)
print mfccs.shape
(20, 97)
#Displaying  the MFCCs:
librosa.display.specshow(mfccs, sr=sr, x_axis='time')

각 계수 차원의 평균과 단위 분산이 0이되도록 특성 스케일링을 수행 할 수도 있습니다.

import sklearn
mfccs = sklearn.preprocessing.scale(mfccs, axis=1)
print(mfccs.mean(axis=1))
print(mfccs.var(axis=1))
librosa.display.specshow(mfccs, sr=sr, x_axis='time')

Chroma 기능은 음악 옥타브의 12 개 반음 (또는 크로마)을 나타내는 12 개의 빈에 전체 스펙트럼이 투영되는 음악 오디오의 흥미롭고 강력한 표현입니다.

librosa.feature.chroma_stft 계산에 사용됩니다.

# Loadign the file
x, sr = librosa.load('../simple_piano.wav')
hop_length = 512
chromagram = librosa.feature.chroma_stft(x, sr=sr, hop_length=hop_length)
plt.figure(figsize=(15, 5))
librosa.display.specshow(chromagram, x_axis='time', y_axis='chroma', hop_length=hop_length, cmap='coolwarm')

음향 신호, 특징 및 특징 추출 프로세스에 대한 개요를 확인한 후 새로 개발 된 기술을 활용하여 기계 학습 문제를 해결할 때입니다.

객관적인

그의 섹션에서는 노래를 다른 장르로 분류하는 분류기를 모델링하려고합니다. 어떤 이유로 음악을 포함하는 것으로 가정되는 하드 디스크에서 무작위로 이름이 지정된 MP3 파일을 발견하는 시나리오를 가정 해 보겠습니다. 우리의 임무는 음악 장르에 따라 재즈, 클래식, 컨트리, 팝, 록, 메탈과 같은 다른 폴더로 분류하는 것입니다.

데이터 세트

사례 연구를 위해 유명한 GITZAN 데이터 세트를 사용할 것입니다. 이 데이터 세트는 IEEE Transactions on Audio and Speech Processing 2002에서 G. Tzanetakis 및 P. Cook의 장르 분류 " 음악 장르 분류 오디오 신호 " 에서 잘 알려진 논문에 사용되었습니다 .

데이터 세트는 30 초마다 1000 개의 오디오 트랙으로 구성됩니다. 블루스, 클래식, 컨트리, 디스코, 힙합, 재즈, 레게, 록, 메탈, 팝 등 10 가지 장르가 포함되어 있습니다 . 각 장르는 100 개의 사운드 클립으로 구성됩니다.

데이터 전처리

분류 모델을 훈련하기 전에 오디오 샘플의 원시 데이터를보다 의미있는 표현으로 변환해야합니다. 오디오 파일을 읽기위한 Python의 wave 모듈과 호환되도록 오디오 클립을 .au 형식에서 .wav 형식으로 변환해야합니다. 변환을 위해 오픈 소스 SoX 모듈을 사용했습니다. 다음은 SoX 변환을위한 편리한 치트 시트 입니다.

sox input.au output.wav
  • 특징 추출
  • 분류

어느 쪽이든 모델 측면에서 많은 실험을 할 수 있습니다. 자유롭게 실험하고 결과를 개선 할 수 있습니다. (스펙트로 그램 이미지에서) CNN 모델을 사용하면 더 나은 정확도와 시도해 볼 가치가 있습니다.

다음 단계

음악 장르 분류는 음악 정보 검색 의 여러 분야 중 하나입니다 . 여기에서 비트 추적, 음악 생성, 추천 시스템, 트랙 분리 및 악기 인식 등과 같은 음악 데이터에 대한 다른 작업을 수행 할 수 있습니다. 음악 분석은 다양한 분야이며 흥미로운 분야이기도합니다. 음악 세션은 어떻게 든 사용자에게 순간을 나타냅니다. 이러한 순간을 찾고 설명하는 것은 데이터 과학 분야에서 흥미로운 도전입니다.

Suggested posts

양자 컴퓨팅 Pt를위한 프로그래밍. 1 : NumPy

이제 양자 컴퓨팅이면의 물리학을 배우기 시작 했으므로 "이봐, 실제로 양자 컴퓨터를 사용하려면 실제로 양자 장치를 손으로 만들어야합니까?"라고 궁금해 할 것입니다. 답은 양자 컴퓨터를 컴퓨터라고 부르는 이유가 있습니다. 프로그래밍이 가능합니다! 이 시리즈에서는 수학 개념을 시뮬레이션하고 양자 컴퓨터에서 실행하는 소프트웨어를 구축하는 방법을 배우게됩니다. 깨끗하고 현대적이며 라이브러리가 풍부한 언어이기 때문에 Python을 사용하여 코드를 작성할 것입니다.

IBM Watson Studio의 AutoAI 노트북으로 마술사 코드 깨기

IBM Watson Studio의 AutoAI 노트북으로 마술사 코드 깨기

가장 유명한 행동 강령 중 하나입니다. "마술사는 절대 비밀을 밝히지 않습니다." 그러나 청중이 너무나 놀라워 서 '방금 일어난 일'이라는 느낌에 놀라서 비밀을 밝히지 않는 것이 거의 잔인한 순간이 있습니다.

Related posts

데이터 과학을위한 필수 수학 : 기초 및 기초 변경

데이터 과학을위한 필수 수학 : 기초 및 기초 변경

고유 분해 및 SVD에 유용한 기저의 선형 대수 개념 이해이 기사에서는 고유 분해 또는 특이 값 분해 (SVD)와 같은 행렬 분해 방법을 이해하는 흥미로운 방법 인 기저 개념에 대해 알아 봅니다. 정의 기본은 벡터 공간 (벡터 집합)을 설명하는 데 사용되는 좌표계입니다.

판다와 에라스무스 연구 교환 분석

판다와 에라스무스 연구 교환 분석

Erasmus 프로그램 2011-12에서 발생한 20 만 개의 연구 교환으로 데이터 세트를 분석 한 결과 1987 년 이후 Erasmus 프로그램은 매년 수십만 명의 유럽 학생들에게 한 학기 또는 1 년을 해외에서 보낼 기회를 다른 유럽에서 보낼 수있는 기회를 제공합니다. 경제적 인 지원뿐만 아니라 쉬운 교환 과정을 제공합니다. 유럽의 다양한 사람, 언어 및 문화에 대한 마음과 마음을 열어주는 정말 귀중한 경험입니다.

데이터 과학을위한 8 가지 기본 통계 개념

… 평범한 영어로 설명

데이터 과학을위한 8 가지 기본 통계 개념

통계는 "수량 데이터의 수집, 분석, 해석 및 표현을 다루는 수학의 한 분야"입니다. 프로그래밍과 기계 학습을 혼합하면 데이터 과학의 핵심 기술에 대해 꽤 잘 설명 할 수 있습니다.

데이터 과학의 9 가지 거리 측정

일반적인 거리 측정의 장점과 함정

데이터 과학의 9 가지 거리 측정

감독되거나 감독되지 않는 많은 알고리즘은 거리 측정을 사용합니다. 유클리드 거리 또는 코사인 유사성과 같은 이러한 측정은 종종 k-NN, UMAP, HDBSCAN 등과 같은 알고리즘에서 찾을 수 있습니다.