我正在使用python编程语言,我想在其他wav文件的末尾加入wav文件?我在论坛中有一个问题,建议如何合并两个wav文件,即在某个偏移处添加一个wav文件的内容,但我想在彼此的末尾加入两个wav文件...
而且我有一个问题在玩我自己的wav文件,使用winsound模块..我能够播放声音,但在播放任何Windows声音之前使用time.sleep一段时间,不利的是,如果我想玩一个声音更长时间.睡眠(N),N秒也是,在N秒播放winsound nd停止后,窗口声音将重叠.
任何人都可以帮助??请建议如何解决这些问题...
提前致谢
tom*_*m10 43
Python随附波形模块,可以满足您的需求.当文件的详细信息(单声道或立体声,帧速率等)相同时,以下示例有效:
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])
output.writeframes(data[0][1])
output.writeframes(data[1][1])
output.close()
Run Code Online (Sandbox Code Playgroud)
Jia*_*aro 19
我是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")
Run Code Online (Sandbox Code Playgroud)
注意:pydub是一个围绕audioop的光包装.在幕后,它基本上就是Tom10提到的
Python 3 解决方案:
我们可以使用标准库来做到这一点,如 tom10 和 Eggbert 的答案所示。
下面是一个较短的版本:
然后,当从 wav_in 读取帧时,将帧写入 wav_out。
with wave.open(outfile, 'wb') as wav_out:
for wav_path in infiles:
with wave.open(wav_path, 'rb') as wav_in:
if not wav_out.getnframes():
wav_out.setparams(wav_in.getparams())
wav_out.writeframes(wav_in.readframes(wav_in.getnframes()))
Run Code Online (Sandbox Code Playgroud)只是以 @tom10 的答案为基础:
from contextlib import closing
with closing(wave.open(outfile, 'wb')) as output:
# find sample rate from first file
with closing(wave.open(wav_files[0])) as w:
output.setparams(w.getparams())
# write each file to output
for infile in wav_files:
with closing(wave.open(infile)) as w:
output.writeframes(w.readframes(w.getnframes()))
Run Code Online (Sandbox Code Playgroud)
它不是存储所有数据然后一次性写入最后,而是一点一点地写入。它还使用 contextlib.close,因此您不必关闭文件。
小智 5
我用的是pysox
波形模块和许多其他模块似乎不支持 mu-law wav。
pysox 要求您安装SoX 并更新您的 PATH 以包含其安装目录。
import sox
cbn=sox.Combiner()
sounds=[]
#PROCESS SOUND PATHS TO AN ARRAY
if len(sounds)>=2:
print(sounds)
cbn.build(sounds,'outputfilepath.ext','concatenate')
Run Code Online (Sandbox Code Playgroud)
你可以使用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)
Run Code Online (Sandbox Code Playgroud)