2010-10-28 35 views
12

Tengo dos archivos wav que quiero mezclar para formar un archivo wav. Ambos son el mismo formato de muestras, etc ...Mezcla de dos archivos de audio junto con python

He estado buscando en Google interminablemente.

Preferiría hacerlo utilizando el módulo de onda en python.

¿Cómo se puede hacer esto?

Respuesta

3

esto es muy dependiente del formato de éstos están en He aquí un ejemplo de cómo hacerlo asumiendo 2 bytes de ancho, muestras little-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)] 

y ahora todo lo que queda por hacer es convertir samples_avg volver a una cadena binaria y escribir eso en un archivo usando wave.writeframes. Eso es solo lo contrario de lo que acabamos de hacer, por lo que no debería ser demasiado difícil de entender. Para su función int_to_bin, es probable que lo pueda hacer uso de la función chr(code), que devuelve el carácter con el código de caracteres de code (opuesto de ord)

+0

Gracias por la code.I se verá en ella un poco más y ver cómo funciona. – james

4

Una solución pitón que requiere tanto numpy y Audiolab, pero es rápido y 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 la frecuencia de muestreo (fs *) o la codificación (ENC *) son diferentes, es posible que tenga algún tipo de procesamiento de audio (la aserción están estrictamente hablando demasiado fuerte, como wavread puede manejar algunos casos forma transparente).

14

Puede utilizar el pydub biblioteca (un envoltorio de luz que escribí alrededor del módulo de onda pitón en el lib std) para hacerlo bastante simple:

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