[Tensorflow] 오디오 데이터 전처리하기1(librosa, fft, log- melspectrogram)

건너별·2021년 12월 12일
1

ML

목록 보기
11/21

학습목표

  • 모든 인공신경망 모델에서 쓰일 수 있는 preprocessing layer 만드는 법을 안다.

mel - spectrogram


[가로축 : 시간, 세로축 : 주파수, 색깔 : dB(magnitude)]

  • audio domain에서 가장 인기있는 특징 표현(feature representation)입니다.
  • 일반 spectrogram은 frequency domain이 표현되어 있으나, mel-spectrogram이 mel-scale(인간의 청각 민감도를 고려한)
  • mel scale은 로그 스케일 변환이 일어남 -> 제대로 된 이름은 log-mel spectrogram
  • log는 scale, mel은 frequency domain을 의미

5개의 간단한 step으로 전처리하는 법

  1. audio signal의 short-time Fourier transform 을 계산
  2. 크기 계산
  3. mel filter bank 를 예시로 보여준다.
  4. 선형 scale -> mel scale로 변환
  5. 크기 -> log_scale로 변환

1. audio signal의 short-time Fourier transform 을 계산

function : tf.signal.stft(signals)
parameter :

  • frame_length : 각 프레임 길이
  • frame_step : frame 간 sample 개수
    , fft_length : FFT size
spectrograms = tf.signal.stft(signals,
                              frame_length=1024,
                              frame_step=512)
  • stft는 긴 신호를 frame이라고 불리는 작은 조각으로 나눕니다. 이 frame은 데이터 손실을 최소화하기 위해 edge 부분이 겹쳐지는(overlapped) 형태입니다.

2. 크기 계산

  • STFT로부터 복소수 값의 tensor로 return된다.
  • 크기계산은 절댓값을 씌워야죠 ! tf.abs()
magnitude_spectrograms = tf.abs(spectrograms)

이제 spectrogram 값의 크기를 측정했으므로, 시각화가 가능합니다.

2-1. 크기를 적절히 scaling 해줘야 해요.

함수 : librosa.amplitude_to_db()

  • 엄밀히 말하면, log-magnitude power-spectrogram 입니다.

  • 아래는 scaling 한 그림이랑 안한 그림입니다.

3. mel filter bank 를 예시로 보여준다.

  • 그냥 스펙트로그램을 mel spectrogram으로 바꿔주려면
  1. frequency를 mel-scale로 warping(휘게 하다)
  2. fft bin(구간)을 mel-frequency bin(구간)으로 결합함
    위 두 가지 과정을 거쳐야 합니다.

이 과정은 아래 함수로 진행이 가능합니다.

  • 함수 : tf.signal.linear_to_mel_weight_matrix()
  • parameter :
    1. num_mel_bins : mel-frequency band의 개수
    2. num_spectrogram_bins: fft_length//2 + 1
    3. sample_rate
    4. lower_edge_hertz , upper_edge_hertz : 가장 높은 주파수


[mel-filter bank with 16 mel-bins]

4. 선형 scale -> mel scale로 변환

squared magnitude-spectrograms
mel-filter bank를 곱하여 봅시다.

그러면 mel-scaled power-spectrogram을 결과물로 받게 됩니다.

mel_power_specgrams = tf.matmul(tf.square(magnitude_spectrograms),
                                mel_filterbank)

5. 크기 -> log_scale로 변환

마지막으로 소리 변환을 로그 스케일로 인식할 수 있도록 로그 변환을 해줍니다.
mel -spectrogram에 log를 씌우는 방법도 있지만, log(0)가 정의되면 골치아파 집니다.
대신 magnitude를 dB(decibel)로 바꾸어 크기를 전환합니다.
함수 : librosa.power_to_db

log_magnitude_mel_spectrograms = power_to_db(mel_power_spectrograms)

6. 마무리

log scale로 변환 후 spectrogram의 최댓값은 0이 되고 최소값은 - top_db 가 됩니다. 위의 멜 스펙트로그램을 다시 한 번 확인해 봅시다.

[최대 0dB, 최소 -80dB]

Reference

profile
romantic ai developer

0개의 댓글