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 结束时有一些额外的样本。
我想导入 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 结束时有一些额外的样本。