Python scipy中wav文件样本数据范围的问题

Python scipy中wav文件样本数据范围的问题,python,numpy,scipy,wav,Python,Numpy,Scipy,Wav,谢谢你的阅读。我正在用Python和numpy/scipy做一个音频处理的小项目。我会提前说,我不太熟悉音频的真实细节。我从神经网络的角度来研究这个问题 无论如何,我正在使用scipy.io.wavfile在numpy数组中读写wav文件。我的问题是音频帧的数据类型。对于我的神经网络,我必须将数据标准化为-1到1之间的浮点数,而我最初遇到的一个问题是从最终成为正确音频文件的所有内容中获取数据。我必须将所有样本转换为int16,以获得具有正确长度的正确波形 这很有意义,因为我的音频文件有16位的深

谢谢你的阅读。我正在用Python和numpy/scipy做一个音频处理的小项目。我会提前说,我不太熟悉音频的真实细节。我从神经网络的角度来研究这个问题

无论如何,我正在使用scipy.io.wavfile在numpy数组中读写wav文件。我的问题是音频帧的数据类型。对于我的神经网络,我必须将数据标准化为-1到1之间的浮点数,而我最初遇到的一个问题是从最终成为正确音频文件的所有内容中获取数据。我必须将所有样本转换为int16,以获得具有正确长度的正确波形

这很有意义,因为我的音频文件有16位的深度

但是现在,我尝试在不同的音频文件上做同样的事情,有24位的深度,并且在用

stream = sp.read(audiofile, False)
结果流的采样位数过多。我知道一个24位整数可以存储的最大数字大约是1600万。相反,我得到了数十亿的价值。我从这个函数中得到的数组是int32类型的。 此外,我无法找到将这些示例放回有效wav文件的方法,这一点也不奇怪。我只得到沉默,而长度是混乱的,而不是它是什么

def convert_to_3D(sample, network, variance):
'''
Convert audio samples to virtual surround
'''
dtype = sample.dtype
sample = sample.astype(float)
# Normalize
sample = (sample/variance)
# Transform
resultStream = network.insert_input(sample)  
# Denormalize
resultStream = resultStream * variance
resultStream = np.rint(resultStream)
resultStream = resultStream.astype(dtype) #("int16")
return resultStream

def convert_file(filename, network):
stream = u.read(filename)    
variance = np.var(stream)
print "Varianz: ", variance
print "Converting..."
for i in range(len(stream)):
    stream[i] = convert_to_3D(stream[i], network, variance)
filename = filename.rsplit( ".", 1 )[0] + "_3D.wav" 
u.write(stream, filename )
print "File ", filename, " has been written"

有人能解释一下吗?

Scipy不支持24位wav文件。我在这里猜测,但可能您的每个32位整数都有3个字节来自一个样本,另一个来自下一个样本。如果数组的长度是预期长度的3/4,则可能就是这样。将24位值提取为32位整数应该不会太难,但我不确定您是否能够以相同的格式编写任何内容。Python的wave模块似乎可以实现这一点,请参阅。我应该注意到,长度实际上是3/4。非常感谢,这解开了谜团。我想我现在必须考虑使用wave模块。