본문 바로가기

딥러닝/소리데이터

[Tensorflow] Audio data preprocessing (오디오데이터 전처리)

deeplearning 에서 audio 영역에서 널리 사용되는 기능은 mel-spectrogram 입니다.

mel spectrogram

시간에 따른 신호의 주파수 스펙트럼을 시각적으로 표현 한 것
  • audio domain 에서 가장 인기있는 특징표현 (feature representation) 이다.
  • 일반 spectrogram 은 frequecny domain 이 표현 되어있지만 , mel - spectrogram 은 mel scale (인간의 청각 민감도를 고려한) 으로 표현 되어있다.
  • mel scale 은 로그 스케일 변환이 일어난다. ( 정식명칭 : log - mel spectrogram)
  • log 는 scale , mel 은 requency domain 을 의미한다.

오디오 데이터를 5개의 간단한 step 으로 preprocessing 하는 방법

  1. audio signal 의 short-time Fourier transform(푸리에변환) 을 계산 한다.
  2. 크기 계산
  3. mel filter bank 를 예시로 본다.
  4. 선형 scale → mel scale 로 변환한다.
  5. 크기를 → log_sacel 로 변환한다.

자세히 

audio signal 의 short-time Fourier transform(푸리에변환) 을 계산 한다. : [S TFT 를 계산]

- function 

# function 
import tensorflow as tf 
tf.signal.stft(signals) 

# parameter 
# frame_length : 샘플에서 각 프레임의 길이 (=window-lengh , window-size) 
# frame_step : frame 간 sample 갯수 (= hob-lengh, hobp-size) 
# fft_length : FFT szie 

spectrograms = tf.signal.stft(singals,
                            frame_length = 1024,
                            frame_step = 512 )
  • stft 는 긴 신호를 frame 이라고 불리는 작은 segment로 나눈다.
  • 각 frame 에 대한 spectrom 을 계산한다.
  • 이 frame 은 일반적으로 가장자리에서 데이터 손실을 최소화 하기 위해 edge 부분이 겹쳐지는 (overlapped) 형태이다.
  • 각 프레임의 스펙트럼을 결합하면 → spectrogram 이 생성된다.

크기 계산

  • stft 로부터 복소수 값의 tensor 로 return 된다.
  • 크기 계산은 절댓값을 취한다 (tf.abs())
magnitude_spectrograms= tf.abs(spectrograms)
  • spectrogram 값의 크기를 측정 했으므로 시각화가 가능해진다.

크기를 적절하게 sacling하기

크기를 적절히 조정하기 전에는 많은것을 보기 힘들다.
(첫번째 magnitude spectrogram ) 두번째 magnitude spectrogram 은 scaling 된 시각화 이다.
# function 
import librosa 

librosa.amplitude_to_db()
  • log_magnitude power-spectrogram 이다.
  • scaling 하지 않은 시각화 and scaling 한 시각화


Mel filter bank 를 인스턴스 화

선형 스케일 스펙트로그램을 → 멜 스케일로 왜곡하는 멜 필터뱅크를 생성한다.

그냥 spectrogram 을 mel spectrogram 으로 바꾸려면

  1. frequency 를 mel scale 로 warping (왜곡) 한다.
  2. fft bin (구간) 을 mel-frequency bin (구간) 으로 결합한다.

위 두가지 과정을 거쳐야 하며 함수로 진행이 가능하다.

# function 
tf.signal.linear_to_mel_weight_matrix() 

#parameter
#num_mel_bins = mel-frequnecy band 의 갯수 (멜 주파수 대역의 수)
#num_spetrogram_bins = fft_length//2 + 1 (소스 스펙트로 그램에 있는 고유 스펙트로 그램 빈의 수 ) 
#sample_rate  (입력 신호의 초당 샘플 수 ) 
#lower_edge_hertz (멜 스케일에 포함 할 헤르츠의 최저 주파수)
#upper_edge_hertz : 멜 스케일에 포함하는 가장 높은 주파수


선형 scale → mel scale 로 변환한다.

squared magnitude-spectogram 과 mel filter bank 를 곱한다.

⇒ mel-scaled power-spectrogram 이 결과물로 나온다.

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

크기를 → log_sacel 로 변환한다.

우리는 음량의 변화를 대수적으로 감지한다.
따라서 이 마지막 단계에서 우리는 mel spectrogram 의 크기도 대수적으로 확장하려고한다.
  • 마지막으로 소리변환을 로그 스케일로 인식할 수 있도록 log 변환을 시행한다.
  • mel-spectrogram 에 log 를 씌울 수 있지만 log(0) 값이 정의되면 힘들어진다.

따라서 대신 수치적으로 안정적인 방식을 채택한다.

  • magnitude 를 db 로 바꾸어 크기를 전환한다.
#function 
import librosa 

librosa.power_to_db
log_magnitude_mel_spectrograms = power_to_db(mel_power_spectrograms)

log scale 로 변환 후 spectrogram 의 최대값은 0 이 되고 최소값은 - top_db 가 된다.