Hướng dẫn merge wav files python - hợp nhất các tệp wav bằng python

Tôi đang sử dụng ngôn ngữ lập trình Python, tôi muốn tham gia vào tệp WAV ở cuối tệp WAV khác? Tôi có một câu hỏi trong diễn đàn đề xuất cách hợp nhất hai tệp wav i.e thêm nội dung của một tệp wav ở một số phần bù nhất định, nhưng tôi muốn tham gia hai tệp wav ở cuối của nhau ...

Và tôi cũng đã có một đầu dò chơi tệp WAV của riêng mình, sử dụng mô -đun Winsound..Tôi đã có thể phát âm thanh nhưng sử dụng thời gian. Âm thanh dài hơn thời gian.s ngủ (n), N Sec cũng vậy, Windows Sound sẽ chồng lên nhau sau khi N giây chơi Winsound ND Stop ..

Bất cứ ai có thể giúp đỡ không ?? Xin vui lòng đề nghị làm thế nào để giải quyết những điều này ...

Cảm ơn trước

Hướng dẫn merge wav files python - hợp nhất các tệp wav bằng python

tom10

64,9K9 Huy hiệu vàng122 Huy hiệu bạc134 Huy hiệu đồng9 gold badges122 silver badges134 bronze badges

Khi được hỏi ngày 23 tháng 5 năm 2010 lúc 4:57May 23, 2010 at 4:57

Python tàu với mô -đun sóng sẽ làm những gì bạn cần. Ví dụ dưới đây hoạt động khi các chi tiết của các tệp (mono hoặc âm thanh nổi, tốc độ khung hình, v.v.) là như nhau:

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])
for i in range(len(data)):
    output.writeframes(data[i][1])
output.close()

Miguelmorin

4.4473 Huy hiệu vàng25 Huy hiệu bạc52 Huy hiệu Đồng3 gold badges25 silver badges52 bronze badges

Đã trả lời ngày 24 tháng 5 năm 2010 lúc 20:57May 24, 2010 at 20:57

tom10tom10tom10

64,9K9 Huy hiệu vàng122 Huy hiệu bạc134 Huy hiệu đồng9 gold badges122 silver badges134 bronze badges

2

Khi được hỏi ngày 23 tháng 5 năm 2010 lúc 4:57

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

Python tàu với mô -đun sóng sẽ làm những gì bạn cần. Ví dụ dưới đây hoạt động khi các chi tiết của các tệp (mono hoặc âm thanh nổi, tốc độ khung hình, v.v.) là như nhau:

MiguelmorinNov 14, 2012 at 17:39

4.4473 Huy hiệu vàng25 Huy hiệu bạc52 Huy hiệu ĐồngJiaaro

Đã trả lời ngày 24 tháng 5 năm 2010 lúc 20:5741 gold badges165 silver badges189 bronze badges

2

Tôi là người bảo trì Pydub, được thiết kế để làm cho loại điều này dễ dàng.
We can do this with the standard library as shown by tom10 and eggbert's answers.
Below is a shorter version:

  1. Lưu ý: Pydub là một trình bao bọc ánh sáng xung quanh âm thanh. Vì vậy, đằng sau hậu trường, nó thực chất là những gì Tom10 đã đề cập
  2. Đã trả lời ngày 14 tháng 11 năm 2012 lúc 17:39

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

JiaarojiaaroMar 23, 2018 at 17:26

72.4K41 Huy hiệu vàng165 Huy hiệu bạc189 Huy hiệu đồngspacether

Giải pháp Python 3: Chúng ta có thể làm điều này với thư viện tiêu chuẩn như được hiển thị bởi câu trả lời của Tom10 và Eggbert. Dưới đây là phiên bản ngắn hơn:1 gold badge21 silver badges22 bronze badges

2

Chỉ viết các tham số cho tệp sóng đầu tiên. Chúng ta có thể kiểm tra độ dài tệp wav_out để xem chúng ta chưa viết cho nó. Nếu chúng ta không viết các tham số sóng chỉ một lần.

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

Sau đó viết khung vào wav_out khi chúng được đọc từ wav_in.

Đã trả lời ngày 23 tháng 3 năm 2018 lúc 17:26Aug 26, 2015 at 16:52

Spacetherspacethereggbert

1.7241 Huy hiệu vàng21 Huy hiệu bạc22 Huy hiệu đồng5 gold badges27 silver badges37 bronze badges

1

Chỉ để xây dựng trên câu trả lời của @Tom10:

Thay vì lưu trữ tất cả các dữ liệu sau đó viết nó ở cuối một lần, nó viết từng chút một. Nó cũng sử dụng bối cảnh. Close để bạn không phải đóng các tệp.

Đã trả lời ngày 26 tháng 8 năm 2015 lúc 16:52

import sox    
cbn=sox.Combiner()
sounds=[]
#PROCESS SOUND PATHS TO AN ARRAY
if len(sounds)>=2:
    print(sounds)
    cbn.build(sounds,'outputfilepath.ext','concatenate')

EggberteggbertMar 29, 2019 at 16:44

2.9455 huy hiệu vàng27 Huy hiệu bạc37 Huy hiệu đồng

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)

5

Tôi đã sử dụng pysox

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

Mô-đun sóng và nhiều người khác dường như không hỗ trợ các wav-law.

Pysox Reqs mà bạn cài đặt SOX và cập nhật đường dẫn của mình để bao gồm thư mục được cài đặt.

Đã trả lời ngày 29 tháng 3 năm 2019 lúc 16:44

Bạn có thể sử dụng audiolab:

Tôi sẽ sử dụng librosa.load

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")
0. Kiểm tra tài liệu ở đây

Đầu ra:Oct 13, 2017 at 7:45

Hình dạng của x ==> (110250,)penduDev

Hình dạng của y ==> (110250,)34 silver badges37 bronze badges

2

Hình dạng của x+y = z ==> (220500,)

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

Hình dạng của Z Loaded ==> (220500,)

Đã trả lời ngày 13 tháng 10 năm 2017 lúc 7:45May 23, 2010 at 12:30