wave.readframes()和librosa.load()的差异

2024-05-16 16:15:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用方法wave.readframes()librosa.load()加载wave文件

import librosa
import wave
sample_wave = './data/mywave.wav'

#open file and stft by librosa
a, sr = librosa.load(sample_wave,sr=44100)

print(len(a))
print(a)

#open file and by wave
wav=wave.open(sample_wave)
data=wav.readframes(wav.getnframes())
b = np.frombuffer(data,dtype=np.int16)

print(len(b))
print(b)

结果是这样的

490255 #(length of by the librosa data)
[-3.0517578e-05  3.9672852e-04 -3.0517578e-05 ...  3.0517578e-05
  3.0517578e-05  0.0000000e+00] #(the data by librosa)
490255 #(length of by the wave data)
[-1 13 -1 ...  1  1  0] #(the data by wave)

两者的OK长度与490255相同

然而,数据是完全不同的(我猜wave的数据几乎是librosa数据的三分之一)

为什么会出现这种差异


Tags: andthe数据sampleimportdatabyload
2条回答

默认情况下,^{}将样本转换为浮点wave.readframes将数据保留为文件中的原始格式,代码将值解释为16位整数,这显然是该文件的正确格式

尝试将librosa.load的调用更改为

a, sr = librosa.load(sample_wave,sr=44100, dtype=np.int16)

原因是librosa使用此buff_to_float()函数缩放数据

要使wave帧具有与librosa中相同的值,您可以自己缩放数据:

import wave

# Load audio
wav = wave.open(sample_wave, 'rb')
frames = wav.readframes(wav.getnframes())
data = np.frombuffer(frames, dtype=np.int16).astype(np.float32)

# Scale the audio
scale = 1./float(1 << ((8 * wav.getsampwidth()) - 1)) # from librosa
data *= scale

相关问题 更多 >