MFCC 파이썬 코드 01
By: Youngjae Oh | #Artifical Intelligence #Machine Learning #Audio
MFCC의 파이썬 구현 코드를 살펴보자.
일단 코드를 설명하기 전에, librosa 라이브러리에 대한 간단한 설명이 필요할 것이다.
librosa는 음악과 오디오 분석을 위한 파이썬 라이브러리로, 설치는 여타 라이브러리와 다르지 않게 매우 간단하다. 본인도 아직 librosa에 대한 기능을 완벽하게 이해하거나 숙지하진 못하였지만, 아주x100 유용한 툴임에는 틀림없다.
자 이제 코드를 한번 뜯어보도록 하자. 일단 필요한 라이브러리들을 임포트하도록 하자. matplotlib 라이브러리는 그래프 표현에 사용되고, librosa는 분석에, numpy 최댓값 기능을 사용하기 위하여 임포트하였다.
이제 분석할 오디오 파일을 불러오도록 하자. 이 포스트에서는 Palebabyblue-사랑방 손님을 사용하였다. 작업을 48khz로 하였기에 sample_rate를 48000으로 설정해 주었다.
어려운거 시작이다. 일단 오디오 파일을 time series로 로드하자. librosa.load() 는 다양한 인자를 받는다. 받을 수 있는 파라미터들은 다음과 같다.
path: string, int, pathlib.Path or file-like object.
- 인풋으로 사용될 오디오 파일의 경로.
sr: number > 0[scalar]
- 인풋으로 사용될 오디오. 파일의 샘플 레이트(현재 코드에서는 48000)
mono: bool
- 스테레오를 모노로 변환하기
offset: float
- 몇 초부터 로드할지 결정
duration: float
- 몇 초까지 로드할지 결정
dtype: numeric type
- 반환할 audio time series의 데이터 타입.
res_type: str
- resample 타입
현재 코드에서는 path와 sr 만 파라미터로 전달해 주었다.
이제 Mel-scaled Spectogram을 구해 보자.
librosa.feature.melspectogram()은 로드된 오디오를 mel-scaled spectogram으로 연산하는 코드이다.
인자로는 auidio time-series, sample rate, spectrogram, FFT window의 길이, hop_length, win_length 등이 있지만, 이 코드에서는 y(audio time-series), sr(sample rate), n_mels(128)만을 전달해 주었다.
n_mels는 생성할 Mel Band의 수를 정해준다.
위 코드에서 Mel Spectrogram을 받았으니, 이제 이를 데시벨 유닛(Decibel Unit)으로 변환해 주어야 한다.
librosa.power_to_db() 함수는 Power spectrogram을 데시벨 유닛으로 변환해 주는데, 여기서 power spectrogram은 amplitude squared이다.
인자로는 S(input power), ref(scalar or callable), amin(최소 threshold) 등을 받지만, 이 코드에서는 input power와 ref 값만을 인자로 전달해 주었다.
power spectrogram에 대한 자세한 설명은 다음에 다시 다루도록 하자.
이제 MFCC를 구할 차례다.
librosa.feature.mfcc는 MFCC를 구하는 것으로, 인자로는 y(audio time-series), sr(sample rate), S(log-power Mel spectrogram), n_mfcc(반환할 MFCC의 수) 등이 있지만, 이 코드에서는 S와 n_mfcc 만을 인자로 전달해 주었다.
이제 구할 거 다 구했다. 이제 그래프를 구하기 위해 Delta Feature를 구해보자.
librosa.feature.delta()는 받은 인풋 데이터에 대한 delta matrix를 반환한다.
요렇게 생겨먹었다. 기분 나쁘게 생겼다.
이제 matplotlib을 사용하여 그래프를 그려보자.
결과물은 아래와 같다.
여기서는 짧은 코드를 사용하지 않고 긴 소스를 사용하여 작업하였더니, 보기가 쉽지 않다.
레퍼런스:
MFCC 파이썬 구현과 의미
librosa