Python np 数组转换为列表和返回不一样
Python np array converted to list and back isn't the same
我使用 python-sounddevice
模块制作了一个录音机,但记录是 NumPy 数组,所以我将它们转换为列表,然后再转换回来,但它不起作用:
import sounddevice as sd, numpy as np, scipy.io.wavfile as wavf
fs = 48000
sd.default.samplerate = fs
sd.default.channels = 2
r = sd.rec(2*fs)
sd.wait()
wavf.write("C:\...\r.wav", fs, r) # works
wavf.write("C:\...\r2.wav", fs, np.array(r.tolist())) # doesn't work
默认情况下 numpy.array
创建一个 64 位浮点数数组 (numpy.float64
),但是 WAVE 文件格式不是为 32 位浮点数设计的。
您可以使用类似的东西:
np.array(r.tolist(), dtype=np.float32)
最初 Multimedia Multimedia Programming Interface and Data Specifications 1.0 (1991),WAVE 文件只支持少数几种数据格式,广泛使用的是 Microsoft 脉冲编码调制 (PCM) 16 位定点编码。数据点表示为整数。
1994 年,随着新的多媒体数据类型和数据技术的推出,许多新格式被引入,但浮点编解码器仍未正式注册。几年后的 1998 年 RFC 2361 已经列出了波形格式 0x0003(IEEE:浮动),但没有实现细节。
目前大多数音频播放器都支持32位浮点样本编码,很少有支持64位浮点样本的。
ffmpeg
等编码器或 MPlayer
等播放器支持 64 位 PCM 编码,应该能够在不进行任何修改的情况下转换和播放您的 r2.wav
。
我使用 python-sounddevice
模块制作了一个录音机,但记录是 NumPy 数组,所以我将它们转换为列表,然后再转换回来,但它不起作用:
import sounddevice as sd, numpy as np, scipy.io.wavfile as wavf
fs = 48000
sd.default.samplerate = fs
sd.default.channels = 2
r = sd.rec(2*fs)
sd.wait()
wavf.write("C:\...\r.wav", fs, r) # works
wavf.write("C:\...\r2.wav", fs, np.array(r.tolist())) # doesn't work
默认情况下 numpy.array
创建一个 64 位浮点数数组 (numpy.float64
),但是 WAVE 文件格式不是为 32 位浮点数设计的。
您可以使用类似的东西:
np.array(r.tolist(), dtype=np.float32)
最初 Multimedia Multimedia Programming Interface and Data Specifications 1.0 (1991),WAVE 文件只支持少数几种数据格式,广泛使用的是 Microsoft 脉冲编码调制 (PCM) 16 位定点编码。数据点表示为整数。
1994 年,随着新的多媒体数据类型和数据技术的推出,许多新格式被引入,但浮点编解码器仍未正式注册。几年后的 1998 年 RFC 2361 已经列出了波形格式 0x0003(IEEE:浮动),但没有实现细节。
目前大多数音频播放器都支持32位浮点样本编码,很少有支持64位浮点样本的。
ffmpeg
等编码器或 MPlayer
等播放器支持 64 位 PCM 编码,应该能够在不进行任何修改的情况下转换和播放您的 r2.wav
。