我有一个关于librosa的load
函数和scipy.io.wavfile
的read
函数之间的区别的问题。
from scipy.io import wavfile
import librosa
fs, data = wavfile.read(name)
data, fs = librosa.load(name)
导入的语音文件是同一文件。如果运行上面的代码,则两个函数的数据值会有所不同。我想知道为什么数据的价值不同。
从librosa.core.load
的文档字符串:
将音频文件加载为浮点时间序列。
音频将自动重新采样为给定速率(默认 sr=22050)。
若要保留文件的本机采样率,请使用 sr=None。
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
librosa.core.load
支持24位音频文件和96kHz采样率。因此,转换为浮点数和默认重采样,在许多情况下,它可能比scipy.io.wavfile.read
慢得多。