2010-10-28 17 views
12

Ich habe zwei WAV-Dateien, die ich zusammen mischen möchte, um eine WAV-Datei zu bilden. Sie sind beide die gleichen Proben Format etc ...Mischen von zwei Audiodateien zusammen mit Python

Google endlos gesucht.

Ich würde es bevorzugen, es mit dem Wave-Modul in Python zu tun.

Wie kann das gemacht werden?

Antwort

3

dies ist sehr abhängig von dem Format dieser in sind hier ein Beispiel dafür, wie es 2 Byte breiten, Little-Endian-Proben zu tun, vorausgesetzt:.

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

Und alle jetzt das zu tun bleibt, ist samples_avg zu konvertieren zurück zu einer binären Zeichenkette und schreibe das in eine Datei unter Verwendung wave.writeframes. Das ist nur das Gegenteil von dem, was wir gerade getan haben, also sollte es nicht zu schwer sein, es herauszufinden. Für Ihre int_to_bin Funktion, werden Sie wahrscheinlich, was die Verwendung der Funktion chr(code), zu machen, die das Zeichen mit dem Zeichencode von code (gegenüber von ord) gibt

+0

Vielen Dank für den code.I es in ein wenig aussehen mehr und sehen, wie es funktioniert. – james

4

Eine Python-Lösung, die sowohl numpy und audiolab erfordert, ist aber schnell und einfach:

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 

Wenn Abtastrate (fs *) oder Codierung (enc *) unterschiedlich sind, können Sie einige Audio-Verarbeitung benötigen (die assert streng zu stark sprechen, wie wavread einige Fälle behandeln können in transparenter Weise).

14

können Sie verwenden, um die pydub Bibliothek (eine leichte Wrapper ich um das Python Wellen-Modul in der std lib geschrieben), es zu tun recht einfach:

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') 
Verwandte Themen