Audio Processing

소리 데이터를 활용한 딥러닝 - Mel Spectrogram

jinmc 2022. 7. 22. 17:03
반응형

소리를 이용한 딥러닝을 하는데 있어서 한 가지 방법은 Mel Spectrogram을 이용하는 방법입니다.  

 

Mel Spectrogram이란, 소리의 파형을 인간이 들을 수 있는 범위로 줄인 Mel scale로 다운 스케일한 이후 그 파형을 그림으로 그린 모양이라고 할 수 있습니다.  

 

librosa library를 이용합니다.

audio_file = "sound.wav"
y, sr = librosa.load(audio_file)
sr = 44100
mel_spec = librosa.feature.melspectrogram(y=y, sr=sr, n_fft=2048, hop_length=1024)
mel_spec = librosa.power_to_db(mel_spec, ref=np.max)

plt.figure(figsize=(8,6))
librosa.display.specshow(mel_spec, y_axis='mel', fmax=8000, x_axis='time')
plt.title('Mel Spectrogram' + audio_file)
plt.colorbar(format='%+2.0f dB')

간단한 스크립트지만, 하나하나 살펴보면서 이해해보도록 하겠습니다.

 

1. librosa.load() 

- 오디오 파일을 로드합니다.

샘플레이트는 어떻게 넣느냐에 따라서 정해집니다.

오디오는 디폴트 샘플 레이트 (22050)으로 리샘플링 됩니다.

만약 원본 샘플 레이트를 유지하고 싶으면, sr = None을 넣으면 됩니다.

이후 y, sr을 리턴하는데, y는 numpy Ndarray의 형태로 주어집니다.

y 는 floating point와 time series의 형태로 주어집니다.

 

2. librosa.feature.melspectrogram()

- mel spectrogram을 만듭니다. 

Mel Spectrogram을 만드는 원리에 대해서는, 푸리에 변환을 이용해서 

Time Domain s(t) 를 Frequency Domain S(w) 로 만든다고 합니다.

자세한 사항에 대해서는 참조를 참고하면 좋을 듯 합니다.

 

그 중에서도 우리는 FFT(Fast Fourier Transform)을 사용합니다.

특히, 음악이나 음성, 소리의 경우에는 Frequency 가 일정하지 않고 계속 변하기 때문에, FFT을 각각의 변하는 Frequency에 해 주어야 하는데, 이를 STFT (Short-time Fourier Tranform) 이라고 하고, 이를 계산한 그래프를 Spectrogram이라고 합니다.

 

n_fft 와 hop_length의 경우에는, 한 번의 STFT를 적용하는 길이(window length) 를 말합니다. 또, hop_length는, 각각의 window 사이의 길이를 뜻합니다. 아래 그림에서 확인할 수 있습니다. 만일 hop_length가 n_fft보다 긴 경우에는, padding이 필요할 수 있습니다.

3. librosa.power_to_db():

- 소리는 압력에 따라 20 마이크로파스칼부터 20Pa까지, 백만 정도의 스케일이 있는데,

인간의 귀로 들을 수 있는 소리는 고작 작은 범위에 지나지 않는다고 합니다.

ref 로 np.max()를 넣음으로서, 소리의 최대값을 0db로 매칭시키고, 다른 값들은 -로 잡는다고 합니다.

또한, 범위의 한계가 디폴트값으로 80db로 되어있어서, -80db보다 낮은 값은 모두 -80db로 나온다고 합니다.

 

power_to_db를 하지 않았을 때와 했을 때의 차이

 

참조 : Understanding Mel Spectrogram , what is n_fft and hop_length in mel_spectrogram? , librosa_amplitude_to_db, 오디오 데이터 전처리

 

반응형