2010-05-23 23 views
14

Estoy usando el lenguaje de programación python, quiero unirme al archivo wav uno al final de otro archivo wav? Tengo una pregunta en el foro que sugieren cómo combinar dos archivos WAV es decir, añadir el contenido de un archivo WAV en cierta compensación, pero yo quiero unir dos archivos WAV al final de uno al otro ...¿Cómo unir dos archivos wav usando python?

Y También tuve un problema al reproducir mi propio archivo wav, usando el módulo winsound. Pude reproducir el sonido pero usando el time.sleep por cierto tiempo antes de reproducir cualquier sonido de Windows, la desventaja es que si quería tocar un sonido ya penas hay time.sleep (N), N sEC también, las ventanas se solapan sonido Wil JST después de n seg jugar el Winsound nd detener ..

¿alguien puede ayudar ?? por favor amablemente a sugerir la forma de resolver estos prob ...

Gracias i n avanzar

Respuesta

1

usted podría utilizar audiolab:

import audiolab, scipy 
a, fs, enc = audiolab.wavread('file1.wav') 
b, fs, enc = audiolab.wavread('file2.wav') 
c = scipy.vstack((a,b)) 
audiolab.wavwrite(c, 'file3.wav', fs, enc) 
+0

necesito instalar cualquier paquete para usar scipy ... Estoy usando un python2.6 puedo obtener una versión compatible para descargar si es necesario..pueden proporcionarme el enlace por favor ..i trataron de frm sitio scipy sí bt enfrentado ne prob..if SME hay pasos fot instalación favor suggest..Thank u por la respuesta .. ¿conoce u cómo jugar el sonido, he mencionado mi problema ingenio jugando, cualquier medir fr eso? – kaushik

+0

Python 2.6 está bien, y el sitio web Numpy/Scipy también debería estar bien. Es posible que deje que otros respondan sus preguntas y proporcione más sugerencias. Aunque mi respuesta sí funciona, probablemente haya soluciones directas más elegantes. –

+0

Ahh..thanks, formas ne mi otro prob acerca jugando archivos wav se resuelven ahora – kaushik

0

yo uso la SOX [1] biblioteca y luego lo llamo como

>>> import subprocess 
>>> sound_output_path = /tmp 
>>> sox_filenames = ['file.wav', 'file1.wav'] 
>>> subprocess.call(['sox'] + sox_filenames + ['%s/out.wav' % sound_output_path]) 

[1] http://sox.sourceforge.net/

30

barcos de Python con el wave módulo que hará lo que necesita. El siguiente ejemplo funciona cuando los detalles de los archivos (mono o estéreo, velocidades, etc.) son los mismos:

import wave 

infiles = ["sound_1.wav", "sound_2.wav"] 
outfile = "sounds.wav" 

data= [] 
for infile in infiles: 
    w = wave.open(infile, 'rb') 
    data.append([w.getparams(), w.readframes(w.getnframes())]) 
    w.close() 

output = wave.open(outfile, 'wb') 
output.setparams(data[0][0]) 
output.writeframes(data[0][1]) 
output.writeframes(data[1][1]) 
output.close() 
10

Soy el encargado del mantenimiento de pydub, que está diseñado para hacer este tipo de cosas fácil.

from pydub import AudioSegment 

sound1 = AudioSegment.from_wav("/path/to/file1.wav") 
sound2 = AudioSegment.from_wav("/path/to/file2.wav") 

combined_sounds = sound1 + sound2 
combined_sounds.export("/output/path.wav", format="wav") 

Nota: pydub es una envoltura de luz alrededor de audioop. Así que detrás de las escenas, que está haciendo esencialmente lo Tom10 mencionó

+0

¡Esto es impresionante! Gracias. – mondieki

2

sólo para construir sobre la respuesta de @ tom10:

from contextlib import closing 

with closing(wave.open(outfile, 'wb')) as output: 

    # find sample rate from first file 
    with closing(wave.open(wav_files[0])) as w: 
     output.setparams(w.getparams()) 

    # write each file to output 
    for infile in wav_files: 
     with closing(wave.open(infile)) as w: 
      output.writeframes(w.readframes(w.getnframes())) 

En lugar de almacenar todos los datos a continuación escribirlo al final de una sola vez, que lo escribe mordió por poco También usa contextlib.close para que no tenga que cerrar archivos.

0

me gustaría utilizar librosa.load y librosa.write_wav. Echa un vistazo al doc. here