Librosa는 오디오 및 음악 파일 분석을 돕는 Python 패키지입니다. 이 패키지는 음악 검색 정보 시스템(MIR) 구축에도 폭넓게 활용되고 있습니다. 이 글에서는 Librosa로 생성한 스펙트로그램 플롯을 원하는 특정 크기의 이미지 파일로 저장하는 방법을 단계별로 살펴보겠습니다.
구현 단계
그림(figure) 크기를 설정하고, 서브플롯 사이와 주변의 여백(padding)을 조정합니다.
figure와 서브플롯 집합을 생성합니다.
스펙트로그램의 시간당 샘플 수(hl), 이미지의 높이(hi)와 너비(wi)를 저장할 세 개의 변수를 초기화합니다.
데모 트랙을 로드합니다.
오디오 시계열 데이터 목록인 window를 생성합니다.
melspectrogram() 함수에 window와 앞서 정의한 변수들을 사용해 멜 스케일(mel-scaled) 스펙트로그램을 계산합니다.
power_to_db() 메서드를 사용해 파워 스펙트로그램(진폭의 제곱)을 데시벨(dB) 단위로 변환합니다.
스펙트로그램을 img로 표시합니다(이 단계에서 바로 저장할 수도 있습니다).
savefig()를 사용해 이미지를 저장합니다.
plt.show() 메서드로 화면에 이미지를 출력합니다.
예제 코드
import numpy as np
import matplotlib.pyplot as plt
import librosa.display
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
fig, ax = plt.subplots()
hl = 512 # 스펙트로그램에서 시간 단계당 샘플 수
hi = 128 # 이미지 높이
wi = 384 # 이미지 너비
# 데모 트랙 로드
y, sr = librosa.load(librosa.ex('trumpet'))
window = y[0:wi*hl]
S = librosa.feature.melspectrogram(y=window, sr=sr, n_mels=hi, fmax=8000,
hop_length=hl)
S_dB = librosa.power_to_db(S, ref=np.max)
img = librosa.display.specshow(S_dB, x_axis='time', y_axis='mel', sr=sr, fmax=8000, ax=ax)
plt.savefig("out.png")
plt.show()실행 결과
위 코드를 실행하면 지정한 그림 크기(7.50 × 3.50 인치)대로 멜 스펙트로그램이 out.png 파일로 저장되며, 동시에 화면에도 표시됩니다. figure.figsize 값을 조절하면 저장되는 이미지의 크기를 자유롭게 변경할 수 있고, 필요에 따라 savefig()에 dpi 옵션을 추가하면 해상도까지 세밀하게 제어할 수 있습니다.
