2010-10-28 35 views
12

Tôi có hai tệp wav mà tôi muốn kết hợp với nhau để tạo thành một tệp wav. Cả hai định dạng mẫu giống nhau, v.v ...Trộn hai tệp âm thanh cùng với python

Tìm kiếm trên google không ngừng.

Tôi muốn sử dụng mô-đun sóng trong python.

Làm cách nào để thực hiện điều này?

Trả lời

3

này là rất phụ thuộc của định dạng này là trong Dưới đây là một ví dụ về làm thế nào để làm điều đó giả định 2 byte rộng, mẫu ít về cuối nhỏ:.

import wave 

w1 = wave.open("/path/to/wav/1") 
w2 = wave.open("/path/to/wav/2") 

#get samples formatted as a string. 
samples1 = w1.readframes(w1.getnframes()) 
samples2 = w2.readframes(w2.getnframes()) 

#takes every 2 bytes and groups them together as 1 sample. ("123456" -> ["12", "34", "56"]) 
samples1 = [samples1[i:i+2] for i in xrange(0, len(samples1), 2)] 
samples2 = [samples2[i:i+2] for i in xrange(0, len(samples2), 2)] 

#convert samples from strings to ints 
def bin_to_int(bin): 
    as_int = 0 
    for char in bin[::-1]: #iterate over each char in reverse (because little-endian) 
     #get the integer value of char and assign to the lowest byte of as_int, shifting the rest up 
     as_int <<= 8 
     as_int += ord(char) 
    return as_int 

samples1 = [bin_to_int(s) for s in samples1] #['\x04\x08'] -> [0x0804] 
samples2 = [bin_to_int(s) for s in samples2] 

#average the samples: 
samples_avg = [(s1+s2)/2 for (s1, s2) in zip(samples1, samples2)] 

Và bây giờ tất cả những gì còn lại để làm là chuyển đổi samples_avg quay lại chuỗi nhị phân và ghi vào tệp bằng cách sử dụng wave.writeframes. Đó chỉ là nghịch đảo của những gì chúng tôi vừa làm, vì vậy nó không phải là quá khó để tìm ra. Đối với chức năng int_to_bin của bạn, có thể bạn sẽ những gì để tận dụng các chức năng chr(code), mà trả về nhân vật với mã ký tự của code (đối diện của ord)

+0

Cảm ơn code.I sẽ nhìn vào nó một chút nhiều hơn và xem nó hoạt động như thế nào. – james

4

Một giải pháp python mà đòi hỏi cả hai NumPy và Audiolab, nhưng là nhanh và đơn giản:

import numpy as np 
from scikits.audiolab import wavread 

data1, fs1, enc1 = wavread("file1.wav") 
data2, fs2, enc2 = wavread("file2.wav") 

assert fs1 == fs2 
assert enc1 == enc2 
result = 0.5 * data1 + 0.5 * data2 

Nếu tỷ lệ lấy mẫu (fs *) hoặc mã hóa (enc *) là khác nhau, bạn có thể cần một số xử lý âm thanh (các khẳng định đang nói đúng quá mạnh, như wavread có thể xử lý một số trường hợp transparantly).

14

Bạn có thể sử dụng pydub thư viện (một wrapper ánh sáng xung quanh tôi đã viết các module sóng python trong lib std) để làm điều đó khá đơn giản:

from pydub import AudioSegment 

sound1 = AudioSegment.from_file("/path/to/my_sound.wav") 
sound2 = AudioSegment.from_file("/path/to/another_sound.wav") 

combined = sound1.overlay(sound2) 

combined.export("/path/to/combined.wav", format='wav') 
Các vấn đề liên quan