writeframes - 在Python中讀取*.wav文件




wf writeframes (7)

用於閱讀wav的不同python模塊:

至少有以下這些庫來讀取wave音頻文件:

最簡單的例子:

這是Pysoundfile的一個簡單示例:

import soundfile as sf
data, samplerate = sf.read('existing_file.wav') 

輸出格式:

警告,數據並不總是採用相同的格式,這取決於庫。 例如:

from scikits import audiolab
from scipy.io import wavfile
from sys import argv
for filetest in argv[1:]:
    [x, fs, nbBits] = audiolab.wavread(filePath)
    print '\nReading with scikits.audiolab.wavread: ', x
    [fs, x] = wavfile.read(filetest)
    print '\nReading with scipy.io.wavfile.read: ', x

用scikits.audiolab.wavread讀取:[0. 0. 0. ...,-0.00097656 -0.00079346 -0.00097656]用scipy.io.wavfile.read讀取:[0 0 0 ..., - 32 -26 -32 ]

PySoundFile和Audiolab在-1和1之間返回浮點數(就像matab那樣,這是音頻信號的慣例)。 Scipy和wave返回整數,可以根據編碼位數在float中轉換。

例如:

from scipy.io.wavfile import read as wavread
[samplerate, x] = wavread(audiofilename) # x is a numpy array of integer, representing the samples 
# scale to -1.0 -- 1.0
if x.dtype == 'int16':
    nb_bits = 16 # -> 16-bit wav files
elif x.dtype == 'int32':
    nb_bits = 32 # -> 32-bit wav files
max_nb_bit = float(2 ** (nb_bits - 1))
samples = x / (max_nb_bit + 1.0) # samples is a numpy array of float representing the samples 

我需要分析寫在.wav文件中的聲音。 為此,我需要將此文件轉換為數字集(例如,數組)。 我想我需要使用wave包。 但是,我不知道它究竟是如何工作的。 例如,我做了以下事情:

import wave
w = wave.open('/usr/share/sounds/ekiga/voicemail.wav', 'r')
for i in range(w.getnframes()):
    frame = w.readframes(i)
    print frame

由於這個代碼我希望看到聲壓作為時間的函數。 相反,我看到很多奇怪的,神秘的符號(不是十六進制數字)。 任何人,請求,幫助我嗎?


你也可以使用簡單的import wavio庫你還需要有一些基本的聲音知識。


如果只有兩個文件和採樣率非常高,你可以只交錯它們。

from scipy.io import wavfile
rate1,dat1 = wavfile.read(File1)
rate2,dat2 = wavfile.read(File2)

if len(dat2) > len(dat1):#swap shortest
    temp = dat2
    dat2 = dat1
    dat1 = temp

output = dat1
for i in range(len(dat2)/2): output[i*2]=dat2[i*2]

wavfile.write(OUTPUT,rate,dat)

如果您要對波形數據執行傳輸,那麼您可能應該使用SciPy ,特別是scipy.io.wavfile


您可以使用scikits.audiolab模塊完成此操作。 它需要NumPy和SciPy才能運行,還需要libsndfile。

注意,我只能讓它在Ubunutu上運行而不是在OSX上運行。

from scikits.audiolab import wavread

filename = "testfile.wav"

data, sample_frequency,encoding = wavread(filename)

現在你有了wav數據


我今天晚上做了一些研究,並想出了這個:

import wave, struct

waveFile = wave.open('sine.wav', 'r')

length = waveFile.getnframes()
for i in range(0,length):
    waveData = waveFile.readframes(1)
    data = struct.unpack("<h", waveData)
    print(int(data[0]))

希望這個片段可以幫助某人。 詳細信息:使用struct模塊 ,您可以獲取波形幀(在-32768之間的2s互補二進制; 0x8000和32767; 0x7FFF)這將讀取MONO,16位,WAVE文件。 我發現這個網頁在製定這個網頁時非常有用。

此代碼段讀取1幀。 要讀取多個幀(例如,13),請使用

waveData = waveFile.readframes(13)
data = struct.unpack("<13h", waveData)

根據這些來源scipy.io.wavfile.read(somefile)返回兩個項目的元組:第一個是每秒樣本的採樣率,第二個是一個numpy數組,其中包含從文件中讀取的所有數據。 看起來很容易使用!

例如:

from scipy.io import wavfile
fs, data = wavfile.read('./output/audio.wav')




wave