Как присоединиться к двум wav файлам с помощью python?

Я использую язык программирования python, я хочу присоединиться к wav файлу в конце другого wav файла? У меня есть вопрос на форуме, в котором предлагается объединить два wav файла. Добавляем содержимое одного wav файла при определенном смещении, но я хочу присоединиться к двум wav файлам в конце друг друга...

А также у меня была проблема с воспроизведением моего собственного wav файла, используя winsound-модуль. Я смог воспроизвести звук, но используя time.sleep в течение определенного времени, прежде чем играть в любом звуке окон, недостаток ума это, если бы я хотел для воспроизведения звука дольше, чем time.sleep(N), N sec также, звук окон wil jst перекрывается после N секунд воспроизведения winsound nd stop..

Может кто-нибудь помочь? пожалуйста, любезно предложите, как решить эту проблему...

Заранее спасибо

Ответы

Ответ 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)

Ответ 2

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

Ответ 3

Я поддерживаю 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 - это световая оболочка вокруг аудиопроигрывателя. Таким образом, за кулисами, он делает то, что сказал Tom10

Ответ 4

Просто чтобы построить на @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, поэтому вам не нужно закрывать файлы.

Ответ 5

я использую библиотеку 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/

Ответ 6

Я использовал бы librosa.load и librosa.write_wav. Посмотрите документ здесь