2010-05-23 92 views
14

我正在使用python编程语言,我想加入到其他wav文件末尾的wav文件中? 我有一个问题,在论坛建议如何合并两个wav文件即添加一个wav文件的内容在一定的偏移量,但我想加入两个wav文件在对方的末尾...如何使用python连接两个wav文件?

而且我也有一个概率播放我自己的WAV文件,使用winsound模块..我能够播放声音,但使用time.sleep一段时间之前播放任何Windows声音,缺点机智这是如果我想播放声音更长的时间。睡眠(N),N秒也,窗户声音将在N秒后重叠播放winsound和NEND停止..

任何人都可以帮忙??请善意建议如何解决这些问题...

谢谢我N使

回答

1

你可以使用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) 
+0

我是否需要安装任何软件包以使用scipy ...我正在使用python2.6我可以得到一个兼容的版本供下载,如果我必须...可以提供给我的链接请..我试图frm scipy网站本身bt面临sme prob ..如果有步骤fot安装请建议..谢谢你的答案.. 你知道如何发挥声音,我提到我的概率机智弹唱,任何测量fr? – kaushik 2010-05-23 05:35:21

+0

Python 2.6很好,而Numpy/Scipy网站也应该没问题。我可能会让别人回答你的问题并提供进一步的建议。虽然我的答案确实有效,但可能会有更优雅的直接解决方案。 – 2010-05-23 05:50:43

+0

啊..感谢,方式我的其他问题关于playin的wav文件现在解决.. – kaushik 2010-05-23 06:58:35

0

我用的是SOX [1]库,然后调用它像

>>> import subprocess 
>>> sound_output_path = /tmp 
>>> sox_filenames = ['file.wav', 'file1.wav'] 
>>> subprocess.call(['sox'] + sox_filenames + ['%s/out.wav' % sound_output_path]) 

[1] http://sox.sourceforge.net/

30

的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]) 
output.writeframes(data[0][1]) 
output.writeframes(data[1][1]) 
output.close() 
10

我的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提到

+0

这是令人印象深刻的!谢谢。 – mondieki 2017-05-06 08:38:57

2

只是建立在@ 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())) 

不是存储所有数据,然后一气呵成末写它的,它写它咬一点点。它也使用contextlib.close,所以你不必关闭文件。

0

我会使用librosa.loadlibrosa.write_wav。 检出文档here