如何使用python加入两个wav文件?

时间:2010-05-23 04:57:26

标签: python audio wav

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

我也有一个问题在玩我自己的wav文件,使用winsound模块..我能够播放声音,但在播放任何Windows声音之前使用time.sleep一段时间,不利的是,如果我想要的话发出声音的时间更长。睡眠时间(N),N秒也是,在N秒播放winsound nd stop后,窗口声音将重叠。

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

提前致谢

8 个答案:

答案 0 :(得分:42)

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()

答案 1 :(得分:17)

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

答案 2 :(得分:3)

建立@ 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,因此您不必关闭文件。

答案 3 :(得分:1)

Python 3解决方案:
我们可以用标准库来完成这个,如tom10和eggbert的答案所示 以下是较短的版本:

  1. 仅写入第一个wave文件的参数。我们可以测试wav_out文件长度,看看我们是否还没有写入它。如果我们还没有写过一次波形参数。
  2. 然后在从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()))
    

答案 4 :(得分:1)

我使用了pysox

wave模块和许多其他模块似乎不支持mu-law wavs。

您安装SoX

pysox要求 并更新您的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')

答案 5 :(得分:0)

您可以使用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)

答案 6 :(得分: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/

答案 7 :(得分:0)

我会使用librosa.loadlibrosa.write_wav。 查看文档here

import librosa
import numpy as np
import librosa.display

example_audio = librosa.util.example_audio_file()
x, sr = librosa.load(example_audio, duration=5)
print('shape of x ==> ' + str(x.shape))
y, sr = librosa.load(example_audio, duration=5)
print('shape of y ==> ' + str(y.shape))
z = np.append(x,y)
print('shape of x+y = z ==> ' + str(z.shape))
librosa.output.write_wav('joined_file.wav', z, sr)

z_loaded, sr = librosa.load('joined_file.wav')
print('shape of z loaded ==> ' + str(z_loaded.shape))
  

输出:

     

x的形状==> (110250,)

     

y的形状==> (110250,)

     

x + y = z ==>的形状(220500,)

     

z的形状==> (220500,)