python - 为什么 scipy 和 librosa 在读取 wav 文件时不同?
问题描述
所以我试图从波形文件中获取样本,我注意到它是一个不同的值,具体取决于我使用的是 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 是否使用不同的标准化?
解决方案
这是类型不匹配。不仅打印值,而且打印其类型通常很有用。在这种情况下,由于规范化的完成方式,samples
值的类型是float64
,而librosa
返回float32
。
这个答案可以帮助弄清楚如何规范化(同样,如上所述,它确实是max_nb_bit - 1
,不是+
)
推荐阅读
- python - 使用聚类算法进行车辆齿轮预测(机器学习)
- c - 在 Pyinstaller 中使用 Cython
- hash - 我们可以反复对输入进行哈希处理并无限期地对其进行哈希处理吗?
- automation - Vividus 工具无法解析日期表达式
- javascript - 将文本设置为默认值 - V̶u̶l̶n̶e̶r̶a̶b̶i̶l̶i̶t̶y̶ -> 漏洞
- llvm - malloc 或 _Znwm,我们应该在 LLVM IR 系统中使用它
- docusignapi - 如何使用 REST API 定义信封中的文档顺序?
- java - 计算元音的数量并以具有更多元音的字符串优先的方式打印它们
- docker - 在测试网络中使用 Hyperledger Fabric 示例运行“network.sh up”时出错
- numpy - 将矩阵转换为 LAPACK 的最快实现