从Python中的立体声wav文件中读取单个通道的数据

时间:2014-04-18 12:42:27

标签: python scipy wave

我必须从Python中的立体声波形文件中的一个通道读取数据。 为此,我尝试了scipy.io:

import scipy.io.wavfile as wf
import numpy

def read(path):
    data = wf.read(path)
    for frame in data[1]:
        data = numpy.append(data, frame[0])
    return data

但是这段代码非常慢,特别是如果我必须使用更长的文件。 那么有人知道更快的方法吗?我通过使用 wave.readframes()来考虑标准 wave 模块,但是如何存储那些帧?

3 个答案:

答案 0 :(得分:13)

scipy.io.wavfile.read返回元组(rate, data)。如果文件是立体声,data是一个形状为(nsamples, 2)的numpy数组。要获取特定频道,请使用data rate, data = wavfile.read(path) # data0 is the data from channel 0. data0 = data[:, 0] 。例如,

{{1}}

答案 1 :(得分:6)

wave模块将字符串作为字符串返回,可以使用struct模块将其转换为数字。例如:

def oneChannel(fname, chanIdx):
""" list with specified channel's data from multichannel wave with 16-bit data """
    f = wave.open(fname, 'rb')
    chans = f.getnchannels()
    samps = f.getnframes()
    sampwidth = f.getsampwidth()
    assert sampwidth == 2
    s = f.readframes(samps) #read the all the samples from the file into a byte string
    f.close()
    unpstr = '<{0}h'.format(samps*chans) #little-endian 16-bit samples
    x = list(struct.unpack(unpstr, s)) #convert the byte string into a list of ints
    return x[chanIdx::chans] #return the desired channel

如果您的WAV文件有其他样本大小,您可以在我写的here的另一个答案中使用(uglier)函数。

我从未使用scipy的{​​{1}}功能,因此我无法比较速度,但wavfilewave方法我在这里使用一直对我有用。

答案 2 :(得分:0)

rate,audio = wavfile.read(path)

audio = np.mean(音频,轴= 1)