簡體   English   中英

Python:將 wav 文件寫入 numpy 浮點數組

[英]Python: write a wav file into numpy float array

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

使用librosa包並簡單地將 wav 文件加載到 numpy 數組:

y, sr = librosa.load(filename)

將音頻加載並解碼為時間序列 y,表示為一維 NumPy 浮點數組。 變量 sr 包含 y 的采樣率,即音頻每秒的采樣數。 默認情況下,所有音頻都混合為單聲道,並在加載時重新采樣為 22050 Hz。 可以通過向 librosa.load() 提供附加參數來覆蓋此行為。

Librosa 庫文檔中的更多信息

沒有足夠的聲譽在@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 問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM