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

IAM*_*IAM 7 python numpy wav

ifile = wave.open("input.wav")
Run Code Online (Sandbox Code Playgroud)

我怎么能把这个文件写成一个numpy浮点数组呢?

Jor*_*ley 17

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

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

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


Mat*_*ker 12

问这个问题七年后......

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
Run Code Online (Sandbox Code Playgroud)

  • @Unsigned_Arduino 你刚刚尝试过吗?根据文档,wave 模块至少从 2.7 版本开始就已经成为 Python 的一部分,并且它仍然包含在 3.8 版本中:https://docs.python.org/3.8/library/wave.html (3认同)

sam*_*man 10

使用librosa包并将 wav 文件加载到 numpy 数组:

y, sr = librosa.load(filename)
Run Code Online (Sandbox Code Playgroud)

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

更多信息请参阅Librosa 库文档