在Python中立体声到单声道wav

时间:2015-05-22 15:52:16

标签: python audio signal-processing

我正在使用scipy方法wavefile.read()加载一个wav,它为我提供了samplerate和audiodata

我知道这个音频数据如果立体声存储为多维数组,如

audiodata[[left right]
          [left right]
          ...
          [left right]]

然后我使用此方法通过(右+左)/ 2

创建一个新的单声道音频数据数组
def stereoToMono(audiodata)
    newaudiodata = []

    for i in range(len(audiodata)):
        d = (audiodata[i][0] + audiodata[i][1])/2
        newaudiodata.append(d)

    return np.array(newaudiodata, dtype='int16')

然后我使用

将其写入文件
wavfile.write(newfilename, sr, newaudiodata)

这会产生一个Mono wav文件,但声音很脏并且已经点击等

我做错了什么?

3 个答案:

答案 0 :(得分:7)

首先,audiodata的数据类型是什么?我假设它是一些固定宽度的整数格式,因此你会溢出。如果在处理之前将其转换为浮点格式,它将正常工作:

audiodata = audiodata.astype(float)

其次,不要按元素编写Python代码元素;矢量化:

d = (audiodata[:,0] + audiodata[:,1]) / 2

甚至更好

d = audiodata.sum(axis=1) / 2

这将比您编写的逐个元素循环快得多。

答案 1 :(得分:2)

事实证明,所有我不得不改变的是

(右左+)/ 2

(右/ 2)+(左/ 2)

答案 2 :(得分:-1)

这应该有效。您从立体声数据中获取第一个通道:

audiodata = [s[0] for s in audiodata]