如何用Python合并两个WAV文件?
我正在使用Python编程语言,我想把一个wav文件接到另一个wav文件的后面。论坛里有个问题提到如何合并两个wav文件,也就是在某个位置添加一个wav文件的内容,但我想的是把两个wav文件直接接在一起。
另外,我在用winsound模块播放自己的wav文件时遇到了问题。我能播放声音,但在播放任何Windows声音之前需要用time.sleep等一段时间。这样做的缺点是,如果我想播放的声音时间比time.sleep(N)长,N秒后Windows的声音就会重叠播放,winsound的声音会在N秒后停止。
有没有人能帮帮我?请告诉我如何解决这些问题...
提前谢谢大家!
8 个回答
50
我是pydub的维护者,这个工具的设计就是为了让这类操作变得简单。
from pydub import AudioSegment
sound1 = AudioSegment.from_wav("/path/to/file1.wav")
sound2 = AudioSegment.from_wav("/path/to/file2.wav")
combined_sounds = sound1 + sound2
combined_sounds.export("/output/path.wav", format="wav")
注意:pydub其实是对audioop的一个简单封装。所以在背后,它基本上是在做Tom10提到的那些事情。
66
Python自带一个叫做wave的模块,可以满足你的需求。下面的例子在文件的细节(比如单声道或立体声、帧率等)相同时可以正常工作:
import wave
infiles = ["sound_1.wav", "sound_2.wav"]
outfile = "sounds.wav"
data= []
for infile in infiles:
w = wave.open(infile, 'rb')
data.append( [w.getparams(), w.readframes(w.getnframes())] )
w.close()
output = wave.open(outfile, 'wb')
output.setparams(data[0][0])
for i in range(len(data)):
output.writeframes(data[i][1])
output.close()
3
你可以使用 audiolab
这个工具:
import audiolab, scipy
a, fs, enc = audiolab.wavread('file1.wav')
b, fs, enc = audiolab.wavread('file2.wav')
c = scipy.vstack((a,b))
audiolab.wavwrite(c, 'file3.wav', fs, enc)