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
Vielen Dank für den code.I es in ein wenig aussehen mehr und sehen, wie es funktioniert. – james