首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的立体声到单声道wav

Python中的立体声到单声道wav
EN

Stack Overflow用户
提问于 2015-05-22 23:52:16
回答 3查看 16.5K关注 0票数 9

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

我知道该音频数据if stereo被存储为多维数组,例如

代码语言:javascript
复制
audiodata[[left right]
          [left right]
          ...
          [left right]]

然后,我将使用此方法通过(right+left)/2创建一个新的单声道音频数据数组

代码语言:javascript
复制
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')

然后,我使用以下命令将此代码写入文件

代码语言:javascript
复制
wavfile.write(newfilename, sr, newaudiodata)

这是产生一个单声道wav文件,但声音是脏的,并有点击等贯穿始终

我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-23 01:49:21

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

代码语言:javascript
复制
audiodata = audiodata.astype(float)

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

代码语言:javascript
复制
d = (audiodata[:,0] + audiodata[:,1]) / 2

甚至更好

代码语言:javascript
复制
d = audiodata.sum(axis=1) / 2

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

票数 14
EN

Stack Overflow用户

发布于 2015-05-23 01:02:51

原来,我所要改变的就是

(right+left)/2

(右/2)+(左/2)

票数 3
EN

Stack Overflow用户

发布于 2020-01-04 20:54:13

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

代码语言:javascript
复制
audiodata = [s[0] for s in audiodata]
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30401042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档