所以我问标题中的所有内容:
我有一个wav文件(由输入音频由PyAudio编写),我想将其转换为对应声级(幅度)的浮点数据,以进行一些傅立叶变换等…
任何人都有想法将WAV数据转换为浮点数?
解决方法:
我已经确定了两种不错的方法.
方法1:使用wavefile模块
使用这种方法如果你不介意安装一些额外的库,这些库在我的Mac上有点乱,但在我的Ubuntu服务器上很容易.
https://github.com/vokimon/python-wavefile
import wavefile
# returns the contents of the wav file as a double precision float array
def wav_to_floats(filename = 'file1.wav'):
w = wavefile.load(filename)
return w[1][0]
signal = wav_to_floats(sys.argv[1])
print "read "+str(len(signal))+" frames"
print "in the range "+str(min(signal))+" to "+str(min(signal))
方法2:使用波形模块
如果您想减少模块安装麻烦,请使用此方法.
从文件系统读取一个wav文件,并将其转换为-1到1范围内的浮点数.它适用于16位文件,如果它们是> 1个通道,将以与文件中相同的方式交错样本.对于其他位深度,请根据本页底部的表将参数中的’h’更改为struct.unpack:
https://docs.python.org/2/library/struct.html
它不适用于24位文件,因为没有24位数据类型,因此无法告诉struct.unpack要做什么.
import wave
import struct
import sys
def wav_to_floats(wave_file):
w = wave.open(wave_file)
astr = w.readframes(w.getnframes())
# convert binary chunks to short
a = struct.unpack("%ih" % (w.getnframes()* w.getnchannels()), astr)
a = [float(val) / pow(2, 15) for val in a]
return a
# read the wav file specified as first command line arg
signal = wav_to_floats(sys.argv[1])
print "read "+str(len(signal))+" frames"
print "in the range "+str(min(signal))+" to "+str(min(signal))