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