Как объединить два файла WAV с помощью Python? - PullRequest
18 голосов
/ 23 мая 2010

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

А также у меня была проблема с воспроизведением моего собственного файла wav с использованием модуля winsound. Я мог воспроизводить звук, но использовал time.sleep в течение определенного времени, прежде чем воспроизводить любой звук Windows, недостаток в том, что если я хотел игратьЗвук дольше, чем время. Сон (N), также N сек., звук Windows будет перекрываться после того, как N сек. сыграет звуковоспроизведение и остановку.

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

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

Ответы [ 8 ]

42 голосов
/ 25 мая 2010

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()
17 голосов
/ 14 ноября 2012

Я поддерживаю 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

3 голосов
/ 26 августа 2015

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

2 голосов
/ 29 марта 2019

Я использовал pysox

Волновой модуль и многие другие, похоже, не поддерживают mu-law wavs.

pysox reqs, которые вы устанавливаете 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')
1 голос
/ 23 марта 2018

Решение Python 3:
Мы можем сделать это с помощью стандартной библиотеки, как показано в tom10 и ответах Эгберта.
Ниже приведена более короткая версия:

  1. Запишите только параметры для первого волнового файла. Мы можем проверить длину файла wav_out, чтобы убедиться, что мы еще не записали в него. Если мы не запишем волновые параметры только один раз.
  2. Затем запишите фреймы в wav_out, когда они читаются из wav_in.

    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()))
    
1 голос
/ 13 октября 2017

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

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

Выход:

форма х ==> (110250,)

форма у ==> (110250,)

форма x + y = z ==> (220500,)

форма z загружена ==> (220500,)

1 голос
/ 23 мая 2010

Вы можете использовать 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 голосов
/ 23 мая 2010

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

...