[英]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.