我正在使用scipy方法wavefile.read()加载wav,这会给我采样率和音频数据

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

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

然后,我使用此方法通过取(right + left)/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文件,但是声音很脏,并且在整个过程中都单击了等

我究竟做错了什么?

最佳答案

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

audiodata = audiodata.astype(float)

其次,不要逐个元素地编写Python代码;向量化它:
d = (audiodata[:,0] + audiodata[:,1]) / 2

甚至更好
d = audiodata.sum(axis=1) / 2

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

10-06 09:02