Read the data of a single channel from a stereo wave file in Python

Richard_Papen picture Richard_Papen · Apr 18, 2014 · Viewed 15.6k times · Source

I have to read the data from just one channel in a stereo wave file in Python. For this I tried it with 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

But this code is very slow, especially if I have to work with longer files. So does anybody know a faster way to do this? I thought about the standard wave module by using wave.readframes(), but how are the frames stored there?

Answer

Warren Weckesser picture Warren Weckesser · Apr 18, 2014

scipy.io.wavfile.read returns the tuple (rate, data). If the file is stereo, data is a numpy array with shape (nsamples, 2). To get a specific channel, use a slice of data. For example,

rate, data = wavfile.read(path)
# data0 is the data from channel 0.
data0 = data[:, 0]