본문 바로가기

Audio & Speech

[Sound AI #11] 오디오 데이터 전처리 (Python Coding)

Sound of AI 유튜브를 바탕으로 작성되었습니다.

이전 포스팅에서 다룬 오디오 데이터 전처리를 파이썬으로 구현해보려 한다.


우선 우리가 사용할 라이브러리들을 import 하자

import numpy as np
import librosa, librosa.display 
import matplotlib.pyplot as plt

FIG_SIZE = (15,10)

librosa가 설치되어있지 않다면, 밑에 코드로 설치를 해주자

!pip install --ignore-installed librosa

그 다음는 실습에 사용할 wav 파일을 하나 준비해 경로 지정을 해주자

file = "/content/blues.00000.wav"

 

blues.00000.wav
1.26MB

나는 colab에서 이 wav 파일을 업로드해서 진행했다.


WAV 파일 불러오기

# load audio file with Librosa
sig, sr = librosa.load(file, sr=22050)

print(sig,sig.shape)

[ 0.00732422  0.01660156  0.00762939 ... -0.05560303 -0.06106567
 -0.06417847] (661794,)

librosa.load를 통해 wav 파일의 signal과 sample rate를 뽑아낼 수 있다. signal이 661794개의 벡터로 이뤄져 있음을 알 수 있다.

 

Waveform 시각화

plt.figure(figsize=FIG_SIZE)
librosa.display.waveplot(sig, sr, alpha=0.5)
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
plt.title("Waveform")


단순 푸리에 변환 → Spectrum

fft = np.fft.fft(sig)

# 복소공간 값 절댓갑 취해서, magnitude 구하기
magnitude = np.abs(fft) 

# Frequency 값 만들기
f = np.linspace(0,sr,len(magnitude))

# 푸리에 변환을 통과한 specturm은 대칭구조로 나와서 high frequency 부분 절반을 날려고 앞쪽 절반만 사용한다.
left_spectrum = magnitude[:int(len(magnitude)/2)]
left_f = f[:int(len(magnitude)/2)]

plt.figure(figsize=FIG_SIZE)
plt.plot(left_f, left_spectrum)
plt.xlabel("Frequency")
plt.ylabel("Magnitude")
plt.title("Power spectrum")

푸리에 변환 결과는 복소공간에 형성되어 실수부와 허수부로 나뉘게 된다. 이 값을 절댓값을 취해 magnitude로 사용한다. Frequency는 초당 주기의 반복 빈도 수 이므로, 초당 샘플갯수인 sr보다 클 수 없다. 따라서 0 ~ frequency 사이에서 len(magnitude) 만큼 frequency domain을 만들어 주자.


STFT → Spectrogram

STFT는 단순 푸리에 변환과 다르게 시간 정보를 보존하기 위해, frame 단위로 FFT를 수행한다. 따라서 frame 수와 frame 당 sample 수를 지정해주어야 한다. 또한 Spectrogram에서는 dB 값을 사용하므로, 푸리에 변환의 결과인 magnitude에 로그 Scaling을 통해 dB로 변환해준다.

# STFT -> spectrogram
hop_length = 512  # 전체 frame 수
n_fft = 2048  # frame 하나당 sample 수

# calculate duration hop length and window in seconds
hop_length_duration = float(hop_length)/sr
n_fft_duration = float(n_fft)/sr

# STFT
stft = librosa.stft(sig, n_fft=n_fft, hop_length=hop_length)

# 복소공간 값 절댓값 취하기
magnitude = np.abs(stft)

# magnitude > Decibels 
log_spectrogram = librosa.amplitude_to_db(magnitude)

# display spectrogram
plt.figure(figsize=FIG_SIZE)
librosa.display.specshow(log_spectrogram, sr=sr, hop_length=hop_length)
plt.xlabel("Time")
plt.ylabel("Frequency")
plt.colorbar(format="%+2.0f dB")
plt.title("Spectrogram (dB)")

 


MFCC

# MFCCs
# extract 13 MFCCs
MFCCs = librosa.feature.mfcc(sig, sr, n_fft=n_fft, hop_length=hop_length, n_mfcc=13)

# display MFCCs
plt.figure(figsize=FIG_SIZE)
librosa.display.specshow(MFCCs, sr=sr, hop_length=hop_length)
plt.xlabel("Time")
plt.ylabel("MFCC coefficients")
plt.colorbar()
plt.title("MFCCs")

# show plots
plt.show()

  • 익명 2020.10.09 14:53 댓글주소 수정/삭제 댓글쓰기

    비밀댓글입니다

    • 댓글 감사합니다!
      저는 librosa 패키지를 이용해 wav를 불러오고 시각화 했습니다. 코드는 문제가 없을텐데 시각화하는 부분은 코드 환경에 영향을 받으므로 colab 같은 도커 환경에서 시도해보시면 좋을 것 같습니다:)

    • 감사드립니다!!!!! 너무 멋지십니다

  • zeroche 2021.03.30 11:44 댓글주소 수정/삭제 댓글쓰기

    내용 너무 알찹니다.
    제 PC에서도 잘 테스트 했습니다.
    한가지 질문이 있다면 librosa 설치에 관련하여
    인터넷이 연결된 PC는 잘되는데.. 인터넷이 안되는 PC에 설치 하는 방법 부탁드립니다.
    감사합니다.

    • 부족한 글인데 좋게 봐주셔서 감사합니다. librosa 패키지는 인터넷에서 다운받아 설치되므로 인터넷이 연결되는 곳에서 pip 로 설치가능합니다.
      인터넷이 안되는 곳에서 설치하려면 인터넷이 되는 곳에서 librosa 패키지를 다운 받은 뒤 설치하시면 됩니다:)

  • bread7055 2021.04.08 21:53 댓글주소 수정/삭제 댓글쓰기

    안녕하세요 저는 수학을 공부하다가 이 블로그를 보게 된 고등학생입니다.
    학교 수학 과제로 푸리에 변환을 공부하다가 시각화를 할 방법이 궁금해져서 검색을 하다가 이 블로그를 찾게 되었습니다.
    정말 큰 도움이 되었습니다.
    하나 궁금한점은 푸리에 변환 그래프에서 x축의 간격이 2000으로 나오는데 혹시 간격을 조절할수 있는 방법이 있는지입니다.
    spectrum을 좀 더 정확하게 분석해보고 싶어서입니다.
    이런글을 써주셔서 감사합니다.

    • 좋게 봐주셔서 감사합니다~
      고등학생이 푸리에 변환을 하신다니 멋지십니다ㅎㅎ

      그래프는 matplotlib라는 패키지를 활용하고 있습니다. "plt xlim 범위조절" 등을 키워드로 검색해보시면 x 축 영역을 조정하여 시각화 하실 수 있을 겁니다:)

  • toytom 2021.05.13 02:22 댓글주소 수정/삭제 댓글쓰기

    안녕하세요 파이썬으로 mfcc 기능을 구현하는 글을 찾다가 이 글을 보게된 대학생입니다
    게시물을 참고하여 mfcc를 기능을 구현을 잘했는데 궁금한점이 있어 글을 남기게 되었습니다.
    n.fft.fft()를 하면 반환값을 signal 크기로 normalization 해주어서 magnitude값이 크게 나오지 않도록 한다는데 여기 코딩에서는 안한 이유가 굳이 안해 줘도 되는 과정이라 생략하신 건지 아니면 이유가 있으신 건지 궁금합니다
    그리고 fft를 거쳐 나온 Power Spectrogram을 엑셀 파일로 받고 싶은데 받을 수 있는 방법이 있을까요??

    좋은 게시물 너무 감사합니다 ^^

    • 좋게 봐주셔서 감사합니다:)
      normalize 하는 부분을 결국 scale의 문제기 때문에 생략했습니다. task에 따라 적합한 scaling을 진행하면 될 것 같습니다!
      엑셀 파일 부분은 제가 엑셀은 잘 몰라서 답변드리기 어려울 것 같습니다.

  • toytom 2021.05.13 15:07 댓글주소 수정/삭제 댓글쓰기

    아 그럼 그래프로 표현을 할때 SCALE 문제라서 normalize 한다는거군요 감사합니다 !! ㅎㅎ

  • ssuuu 2022.05.29 00:40 댓글주소 수정/삭제 댓글쓰기

    mfcc 관련 공부하고 있는 학생입니다 너무 상세하게 자료를 올려주셔서 잘보고있습니다.
    혹시 코드 맨 처음 fig_size 값은 처음부터 정해놓고 하신건지 저 fig_size 값의 정의를
    정확하게 알고싶습니다~ 혹시 별도로 mfcc 추출을 위해 해당 음향데이터에 대한 fig size별도로
    확인할 수 있는지 궁금합니다!