Post

오디오 데이터 전처리 및 feature 추출

오디오 데이터 전처리 및 feature 추출

이번 포스트에서는 오디오 데이터를 전처리하고, feature를 추출하는 방법에 대해 다뤄보려고 합니다. 오디오 데이터 분석을 할 때 많이 사용되는 librosa 라이브러리를 사용하여 각 단계에서 어떤 과정을 거치는지 살펴보겠습니다.

1. 데이터 불러오기

WAV, MP3, FLAC 등 다양한 포맷의 오디오 파일을 불러와서 시간 도메인 신호로 변환합니다.

1
2
3
import librosa

y, sr = librosa.load('audio.wav', sr=16000)
  • y: waveform (amplitude array)
  • sr: sampling rate (Hz)

2. 전처리

오디오 데이터는 녹음 환경이나 장비에 따라 품질이 일정하지 않은 경우가 많기 때문에, 주로 아래와 같은 전처리를 수행합니다.

작업설명
리샘플링 (Resampling)모든 오디오의 sampling rate를 통일 (보통 16kHz)
노이즈 제거배경 소음을 줄이는 filtering (spectral gating 등)
정규화음량(Level)을 일정하게 맞춤
무음 제거 (VAD)음성이 없는 구간을 제거 (Voice Activity Detection)

3. 푸리에 변환 (Fourier Transform)

음파는 시간축 위에 표시되지만, 기계가 이해하기 좋게 하려면 주파수 성분으로 바꾸는 것이 유리합니다. 푸리에 변환(FT)은 신호를 여러 주파수의 조합으로 분해합니다. 하지만 푸리에 변환을 거치게 되면, 어떤 주파수가 있는지는 알 수 있지만 언제 나왔는지는 모르게 됩니다. 즉, 시간 정보가 완전히 사라지는 것입니다.

단기 푸리에 변환 (STFT: Short-Time Fourier Transform)

이러한 이유로 푸리에 변환 대신 단기 푸리에 변환이 주로 사용됩니다. 단기 푸리에 변환은 긴 신호를 짧은 구간(window)으로 나누고, 각 구간에 푸리에 변환을 적용하는 방법으로, 시간과 주파수 정보를 동시에 표현할 수 있다는 장점이 있습니다.

1
2
3
import numpy as np

D = librosa.stft(y, n_fft=512, hop_length=160, win_length=400)
  • n_fft: 변환할 FFT 사이즈
  • hop_length: 윈도우 간 겹침 정도

결과는 주파수 × 시간으로 이루어진 스펙트럼 행렬입니다.

4. 진폭 및 파워 계산

STFT 결과는 복소수이므로 magnitude(진폭)나 power(제곱)를 구해 사용합니다.

1
2
magnitude = np.abs(D)       # 진폭 스펙트럼
power = magnitude ** 2      # 파워 스펙트럼

5. 로그 스케일 변환 (dB)

사람은 선형(linear) 이 아니라 로그(log) 로 소리를 인식합니다. 그래서 스펙트럼 값을 로그 스케일로 변환해 데시벨(dB) 단위로 표현하면, 작은 소리도 강조할 수 있고 학습의 안정성이 높아진다는 장점이 있습니다.

1
S_db = librosa.amplitude_to_db(magnitude, ref=np.max)

6. feature 추출

Spectrogram

  • STFT 결과를 시각화
  • 시간에 따라 주파수 에너지가 어떻게 분포하는지 보여줌
1
2
3
4
import matplotlib.pyplot as plt
librosa.display.specshow(S_db, sr=sr, hop_length=160, x_axis='time', y_axis='linear')
plt.colorbar(format='%+2.0f dB')
plt.show()

Mel-Spectrogram

  • 인간 청각 특성을 반영한 스펙0트럼
  • 주파수 축을 Mel Scale로 변환
  • 저주파 영역을 더 세밀히 표현
1
2
mel_spec = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
mel_spec_db = librosa.power_to_db(mel_spec)

MFCC (Mel-Frequency Cepstral Coefficients)

  • Mel-Spectrogram에 DCT (이산 코사인 변환) 적용
  • 주요 특징만 남기고 차원 축소
1
mfcc = librosa.feature.mfcc(S=mel_spec_db, n_mfcc=13)
This post is licensed under CC BY 4.0 by the author.