librosa 加载与 scipy.io.wavfile 读取之间的差异

Difference between load of librosa and read of scipy.io.wavfile

我有一个关于librosa的load函数和scipy.io.wavfileread函数的区别的问题。

from scipy.io import wavfile
import librosa

fs, data = wavfile.read(name)
data, fs = librosa.load(name)

导入的语音文件是同一个文件。如果你 运行 上面的代码,数据的值从两个函数中出来是不同的。我想知道为什么数据的值不同。

来自 librosa.core.load 的文档字符串:

Load an audio file as a floating point time series.

Audio will be automatically resampled to the given rate (default sr=22050).

To preserve the native sampling rate of the file, use sr=None.

scipy.io.wavfile.read 不会自动对数据重新采样,如果样本在文件中是整数,则不会转换为浮点数。

librosa.core.load 支持 24 位音频文件和 96kHz 采样率。因此,在许多情况下,转换为浮点数和默认重采样可能比 scipy.io.wavfile.read 慢得多。

还值得一提的是,librosa.load() 规范化了数据(因此所有数据点都在 1 和 -1 之间),而 wavfile.read() 没有。

数据不同是因为scipy没有对输入信号进行归一化。

这里是一个片段,展示了如何更改 scipy 输出以匹配 librosa 的输出:

nbits = 16

l_wave, rate = librosa.core.load(path, sr=None)
rate, s_wave = scipy.io.wavfile.read(path)

s_wave /= 2 ** (nbits - 1)

all(s_wave == l_wave)
# True