ifile = wave.open("input.wav")
现在我该如何将这个文件写成一个numpy浮点数数组呢?
>>> from scipy.io.wavfile import read
>>> a = read("adios.wav")
>>> numpy.array(a[1],dtype=float)
array([ 128., 128., 128., ..., 128., 128., 128.])
通常是将字节转换为整数,但这里我们将其转换为浮点类型。
您可以在这里阅读相关信息:https://docs.scipy.org/doc/scipy/reference/tutorial/io.html#module-scipy.io.wavfile
这个问题被提出七年后...
import wave
import numpy
# Read file to get buffer
ifile = wave.open("input.wav")
samples = ifile.getnframes()
audio = ifile.readframes(samples)
# Convert buffer to float32 using NumPy
audio_as_np_int16 = numpy.frombuffer(audio, dtype=numpy.int16)
audio_as_np_float32 = audio_as_np_int16.astype(numpy.float32)
# Normalise float32 array so that values are between -1.0 and +1.0
max_int16 = 2**15
audio_normalised = audio_as_np_float32 / max_int16
wave.getsampwidth
是frombuffer
中int16
或int32
的值,对吗? - avocadoint16
,或4个字节=> int32
。我猜我之前没有遇到过除每个样本2个字节之外的WAV文件。好观点。 - Matthew Walkerlibrosa
包,只需加载wav文件到numpy数组即可:y, sr = librosa.load(filename)
我没有足够的声望在@Matthew Walker的回答下面进行评论,因此我发表了一个新答案,加入了对Matt答案的观察。 max_int16
应该是 2 ** 15-1
而不是 2 ** 15
。
更好的做法是,我认为应该用以下语句替换归一化行:
audio_normalised = audio_as_np_float32 / numpy.iinfo(numpy.int16).max
channels = ifile.getnchannels()
audio_stereo = np.empty((int(len(audio_normalised)/channels), channels))
audio_stereo[:,0] = audio_normalised[range(0,len(audio_normalised),2)]
audio_stereo[:,1] = audio_normalised[range(1,len(audio_normalised),2)]
我相信这回答了评论区@Trees的问题。
max_int16
的定义问题很有趣。 16位整数的范围为-32768到32767。 如果我们想要在-1到1之间进行缩放,则需要用绝对意义上最大可能值即32768或2 ** 15
来除以。 因此,在我的答案中定义了max_int16
。 - Matthew Walker