Python:将一个wav文件写入numpy float数组

时间:2013-05-27 18:47:03

标签: python numpy wav

ifile = wave.open("input.wav")

如何将此文件写入numpy float数组?

4 个答案:

答案 0 :(得分:13)

>>> from scipy.io.wavfile import read
>>> a = read("adios.wav")
>>> numpy.array(a[1],dtype=float)
array([ 128.,  128.,  128., ...,  128.,  128.,  128.])

通常是字节,然后是int ...这里我们只是将它转换为float类型

你可以在这里阅读https://docs.scipy.org/doc/scipy/reference/tutorial/io.html#module-scipy.io.wavfile

答案 1 :(得分:8)

问了问题七年后...

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

答案 2 :(得分:0)

使用librosa包,只需使用以下命令将wav文件加载到numpy数组中即可:

y, sr = librosa.load(filename)
  

以时间序列y加载和解码音频,表示为   一维NumPy浮点数组。变量sr包含   y的采样率,即每秒的采样数   音频。默认情况下,所有音频混合为单声道并重新采样为22050   加载时的Hz。此行为可以通过提供来覆盖   librosa.load()的其他参数。

更多信息,请访问Librosa library documentation

答案 3 :(得分:0)

没有足够的声誉在@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 问题。