Python 将wav数据的左通道读入numpy数组

Python 将wav数据的左通道读入numpy数组,python,numpy,hex,numpy-ndarray,pyaudio,Python,Numpy,Hex,Numpy Ndarray,Pyaudio,我使用pyaudio从麦克风获取输入或读取wav文件,并在播放时分析流。如果输入是立体声,我只想分析正确的频道。我已经能够提取数据并使用循环转换为整数: levels = [] length = len(data) if channels == 1: for i in range(length//2): volume = abs(struct.unpack('<h', data[i:i+

我使用pyaudio从麦克风获取输入或读取wav文件,并在播放时分析流。如果输入是立体声,我只想分析正确的频道。我已经能够提取数据并使用循环转换为整数:

        levels = []
        length = len(data)
        if channels == 1:
            for i in range(length//2):
                volume = abs(struct.unpack('<h', data[i:i+2])[0])
                levels.append(volume)
        elif channels == 2:
            for i in range(length//4):
                j = 4 * i + 2
                volume = abs(struct.unpack('<h', data[j:j+2])[0])
                levels.append(volume)
levels=[]
长度=长度(数据)
如果通道==1:
对于范围内的i(长度//2):

volume=abs(struct.unpack)(“您在这里从二进制文件读取16位整数。似乎您首先将数据读入
data
变量,类似于
data=f.read()
,在这里不可见。然后执行以下操作:

for i in range(length//2):
    volume = abs(struct.unpack('<h', data[i:i+2])[0])
    levels.append(volume)
这比我在测试5MB数据时上面的手动操作快了100多倍

在第二种情况下,您使用了交错的左右值。同样,您可以读取所有值(假设您有足够的内存),然后只访问其中的一半:

data = np.fromfile(f, dtype='<i2')
left = data[::2]
right = data[1::2]

谢谢!数据是从pyaudio中分块传递的,pyaudio从wav文件中获取数据(并且只将wav文件内容的数据部分传递给变量“data”或者从麦克风输入生成它,并分块执行。我需要二进制流以便pyaudio可以播放它。因此我不能使用文件读取部分。假设is已经传递了变量“data”,就像在我的原始代码中一样,我应该使用:levels=np.frombuffer(数据,dtype='@ViennaMike完全正确!我也将其添加到了答案中,这样您就有了一个完整的解决方案;)
data = np.fromfile(f, dtype='<i2')
left = data[::2]
right = data[1::2]
channel_data = np.frombuffer(data, dtype='<i2')
if channels == 2:
    channel_data = channel_data[1::2]
levels = np.abs(channel_data)