为啥 scipy 和 librosa 在读取 wav 文件时不同?

Posted

技术标签:

【中文标题】为啥 scipy 和 librosa 在读取 wav 文件时不同?【英文标题】:Why are scipy and librosa different for reading wav file?为什么 scipy 和 librosa 在读取 wav 文件时不同? 【发布时间】:2018-07-24 02:51:19 【问题描述】:

所以我试图从波形文件中获取样本,我注意到它的值不同,具体取决于我使用的是 scipy 还是 librosa。

sampleFloats, fs = librosa.load('hi.wav', sr=48000)
print('0:.15f'.format(sampleFloats[len(sampleFloats)-1]))

from scipy.io.wavfile import read as wavread
# from python_speech_features import mfcc

[samplerate, x] = wavread('hi.wav') # x is a numpy array of integer, representing the samples 

# scale to -1.0 -- 1.0
if x.dtype == 'int16':
    nb_bits = 16 # -> 16-bit wav files
elif x.dtype == 'int32':
    nb_bits = 32 # -> 32-bit wav files
max_nb_bit = float(2 ** (nb_bits - 1))
samples = x / (max_nb_bit + 1.0) # samples is a numpy array of float representing the samples 

print(samples[len(samples)-1])

打印语句如下:

0.001251220703125
0.001274064182641886

文件的采样率为 48000。

为什么它们可能不同? librosa 是否使用了不同的标准化?

【问题讨论】:

打印出来的数字代表什么? 它们代表最后一个样本的值。 仅供参考(Python 提示):sampleFloats[len(sampleFloats)-1] 可以简化为 sampleFloats[-1] 为什么要除以max_nb_bit + 1.0?我怀疑应该是max_nb_bit - 1 如果您在对librosa.load() 的调用中使用sr=None 会发生什么? 【参考方案1】:

这是类型不匹配。 不仅打印值,而且打印其类型通常很有用。在这种情况下,由于规范化的完成方式,samples 值的类型为float64,而librosa 返回float32

This answer 可以帮助弄清楚如何规范化(另外,如上所述,确实是max_nb_bit - 1,而不是+

【讨论】:

以上是关于为啥 scipy 和 librosa 在读取 wav 文件时不同?的主要内容,如果未能解决你的问题,请参考以下文章

librosa的加载和scipy.io.wavfile的读取之间的区别

为啥 librosa 中的情节不同?

为啥 librosa 库中的频谱图具有不同的实际音轨持续时间?

如何消除 librosa griffin lim 引入的失真?

为啥 scipy 和 numpy fft 图看起来不同?

scikit-learn 和 scipy 库之间的确定系数不同。为啥?