2010-10-28 5 views
12

J'ai deux fichiers wav que je veux mélanger pour former un fichier wav. Ils sont à la fois le même format d'échantillons, etc ...Mélange de deux fichiers audio avec python

Été chercher google sans fin.

Je préférerais le faire en utilisant le module d'onde en python.

Comment cela peut-il être fait?

Répondre

3

ce qui est très dépendante du format ce sont dans Voici un exemple de la façon de le faire en supposant 2 octets de large, des échantillons peu endian.

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

Et maintenant, tout ce qui reste à faire est de convertir samples_avg Retour à une chaîne binaire et écrivez cela dans un fichier en utilisant wave.writeframes. C'est juste l'inverse de ce que nous venons de faire, donc ça ne devrait pas être trop difficile à comprendre. Pour votre fonction int_to_bin, vous aurez probablement quoi faire usage de la fonction chr(code), qui renvoie le caractère avec le code de caractère de code (opposé ord)

+0

Merci pour la code.I se penchera un peu plus et voir comment cela fonctionne. – james

4

Une solution de python qui nécessite à la fois numpy et AudioLab, mais est rapide et simple:

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 

Si le taux d'échantillonnage (fs *) ou le codage (enc *) sont différentes, vous devrez peut-être un peu de traitement audio (assert sont strictement parler trop fort, comme wavread peut gérer certains cas transparantly).

14

Vous pouvez utiliser la bibliothèque pydub (un emballage léger, j'ai écrit autour du module d'onde python dans le std lib) pour le faire assez simplement:

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