Python 读取声音文件,ogg 还是 wav?

Python read sound file, ogg or wav?

我想导入 Python 中的音乐,我正在使用 soundfile。我注意到导入 ogg 或 wav 文件会产生不同的结果,如下所示(wav 文件是使用 ffmpeg 转换的 ogg 文件)。使用下面的代码,我观察到 ogg 和 wav 文件之间的细微差异,这种差异是否正常?

编辑:我使用以下命令转换我的 ffmpeg -i filename.mp3 newfilename.wav

X, sample_rate= sf.read(wav_file)
print(wav_file)
print(X[0:20,])

它输出:

test_inputs/Shikantaza.wav
[[  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [ -3.05175781e-05  -3.05175781e-05]
 [ -3.05175781e-05   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]]
test_inputs/Shikantaza.ogg
[[  1.17459308e-06   3.78499834e-07]
 [  5.19584228e-06   2.25495864e-06]
 [  1.13173719e-05   6.28675980e-06]
 [  1.07316619e-05   4.50928837e-06]
 [  2.70867986e-06  -3.40946622e-06]
 [  5.37277947e-06   5.06399772e-07]
 [  3.64179391e-06   6.27796169e-07]
 [ -5.09244865e-06  -6.14764804e-06]
 [ -4.38827237e-06  -3.74127058e-06]
 [ -5.41250847e-06  -3.70974522e-06]
 [ -2.75347884e-06  -7.08531957e-07]
 [ -9.67129495e-07   6.15705801e-07]
 [ -4.91217952e-06  -3.82820826e-06]
 [  4.38740926e-06   6.00675048e-06]
 [ -3.00040119e-06  -4.78463562e-08]
 [ -2.18559871e-05  -1.67418439e-05]
 [ -1.57035538e-05  -8.82137283e-06]
 [ -1.28820702e-05  -5.31934711e-06]
 [ -9.44996100e-06  -8.10974825e-07]
 [ -5.33486082e-06   3.71237797e-06]]

对于第一个文件,您要解码为 WAV 格式的 16 位线性 PCM,然后将其转换为浮点数。对于第二个文件,您直接解码为浮点数。 16 位线性 PCM 的精度低于浮点数,因此会丢失信息,尽管与有损压缩的丢失相比,丢失通常可以忽略不计,因此可以忽略。

虽然 WAV 最常与 16 位线性 PCM 一起使用,但也可以将浮点 PCM 存储在 wav 文件中(尽管该文件大约是原来的两倍大)。要在 wav 中写入浮点数:

ffmpeg -i in.ogg -c:a pcm_f32le out.wav

有损格式的解码器也可能存在差异,从而产生略有不同的结果。此外,如果其中一个解码器不是无间隙的,它可能只会产生整个帧,因此可能在开始 and/or 结束时有一些额外的样本。