개발이모저모

[python] librosa.load()가 안될 때 (mp3) soundfile을 사용하자 (ValueError: Input signal length=0 is too small)

아티스트갓건 2022. 11. 8. 16:39

내가 맥미니 M1을 사고 이것저것 테스트 중인데

오디오 라이브러리인 librosa가 평소보다 느리더니 에러가 나더라.

심지어 이렇게 기본적인 코드까지도...

import librosa

y, sr = librosa.load('test.mp3')

print(y.shape)
ValueError: Input signal length=0 is too small to resample from 44100->22050

당연히 돼야하는 코드가 안돼서 매우 당황스럽다.

혹시나 m1이라서 문제인가 싶어서 구형 맥으로도 실행해봤지만 결과는 똑같았다.

퇴사하기 전까지 window 컴에선 문제없이 돌아가던 코드였다.. 아마 맥에서만 생긴 오류가 아닐까 생각했다.

 

테스트 해보니 wav파일은 되고 mp3파일은 안된다. 오디오 세계에서 mp3는 어딜가던 환영받지 못하는 포맷인듯하다.. 하지만 원래 되던게 안되니까 열받는다.

 

원인은 잘 모르겠지만, 간단하게 해결 할 수 있다

import soundfile as sf

y, sr = sf.read('test.mp3')

print(y.shape)
(9421824, 2)

librosa는 soundfile이라는 라이브러리를 기반한다. 불러오는것도 soundfile이 다한다. soundfile로 음원을 불러온 다음에, 이후엔 librosa의 어떤 함수도 다 잘 작동한다.

soundfile.read()를 활용하자

import soundfile as sf
import librosa

y, sr = sf.read('test.mp3')

# 만약 테스트 중인 파일이 Stereo일 경우, 모노로 바꿔준다
if len(y.shape) == 2:
	# left와 right를 합친다음 2로 나눠준다. librosa.load 로 stereo파일을 불러올때 이 방식을 쓴다.
    y = (y[0] + y[1]) / 2

## 대표적으로 많이 사용되는 함수들    
STFT = librosa.stft(y = y)
MEL = librosa.feature.melspectrogram(y = y)
MFCC = librosa.feature.mfcc(y = y)
CHROMA = librosa.feature.chroma_stft(y = y)
ZCR = librosa.feature.zero_crossing_rate(y = y)

print('data : ',y.shape)
print('STFT : ', STFT.shape)
print('MEL : ', MEL.shape)
print('MFCC : ', MFCC.shape)
print('CHROMA : ', CHROMA.shape)
print('ZCR : ', ZCR.shape)
# 결과
data :  (9421824,)
STFT :  (1025, 18403)
MEL :  (128, 18403)
MFCC :  (20, 18403)
CHROMA :  (12, 18403)
ZCR :  (1, 18403)

librosa.load로 데이터를 불러오면, 뭔가 좀 느린데 soundfile.read로 불러오면 훨씬 빠르다. 대신 자동으로 mono로 바꿔준다던지, samplerate나 bitdepth 등을 통일 시킨다던지 등은 안되고 파일의 정보 그대로 적용되기 때문에, 이부분은 본인이 진행중인 프로젝트 성격에 맞게 고쳐주어야 한다.