Python 中的立体声到单声道 wav

Stereo to Mono wav in Python

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

我知道这个音频数据if stereo被存储为一个多维数组,比如

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)

这正在生成一个单声道 wav 文件,但是声音很脏,并且在整个过程中都有咔嗒声等

我做错了什么?

事实证明,我只需要更改

(右+左)/2

(right/2) + (left/2)

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

audiodata = audiodata.astype(float)

其次,不要逐个元素地编写 Python 代码;对其进行矢量化:

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

甚至更好

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

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

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

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

应用平均值后,您必须将数据保存为 int16

wavfile.write(newfilename, sr, np.int16(newaudiodata))