【问题标题】:Stereo to Mono wav in PythonPython中的立体声到单声道wav
【发布时间】:2015-08-04 17:35:22
【问题描述】:

我正在使用 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)

这正在生成一个单声道 wav 文件,但是声音很脏,并且自始至终都有点击等

我做错了什么?

【问题讨论】:

  • Close-voters:这不是印刷错误,而是涉及溢出以及如何防止溢出的实际数学错误。它应该保持打开状态。

标签: python audio signal-processing


【解决方案1】:

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

audiodata = audiodata.astype(float)

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

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

甚至更好

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

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

【讨论】:

  • 为什么不audiodata.mean(axis=1)
【解决方案2】:

原来,我只需要改变就是

(右+左)/2

(右/2)+(左/2)

【讨论】:

  • 你不应该接受你的答案吗?
  • @WinEunuuchs2Unix 不是当接受的答案更好时。当整数为奇数时,转换为浮点数可以节省一些损失
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2011-09-11
    • 2019-07-14
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多