2010-05-23 21 views
14

Sto usando il linguaggio di programmazione Python, voglio unirmi al file wav uno alla fine di un altro file wav? Ho una domanda nel forum che suggerisce come unire due file wav, cioè aggiungere il contenuto di un file wav a un certo offset, ma voglio unire due file wav alla fine di ogni altro ...Come unire due file wav usando python?

E inoltre ho avuto un prob che suona il mio file wav, usando il modulo winsound .. Sono stato in grado di riprodurre il suono ma usare il time.sleep per un certo tempo prima di suonare qualsiasi suono Windows, svantaggio wit questo è se volessi suonare un suono più a lungo tempo addormentato (N), anche N sec, il suono del suono si sovrapporrà dopo N sec suonare il winsound nd stop ..

Qualcuno può aiutare? Si prega gentilmente di suggerire a come risolvere questi prob ...

Grazie io Anticipo

risposta

1

si potrebbe usare 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

ho bisogno di installare alcun pacchetto per utilizzare SciPy ... Sto usando un python2.6 posso ottenere una versione compatibile per il download se ho to..can u fornirmi il link si prega ..i ho provato a visitare il sito scipy stesso bt di fronte a prob ... se non ci sono passaggi per l'installazione per favore suggerisci ... Grazie per la risposta .. Sai come si suona il suono, ho citato il mio gioco di prova, qualsiasi misura fr che ?? – kaushik

+0

Python 2.6 va bene, e anche il sito Web di Numpy/Scipy dovrebbe andare bene. Potrei lasciare che gli altri rispondano alle tue domande e fornire ulteriori suggerimenti. Sebbene la mia risposta funzioni, ci sono probabilmente soluzioni più eleganti e dirette. –

+0

Ahh..grazie, in tutti i modi il mio altro problema sui file wav di playin sono risolti ora .. – kaushik

0

uso il SOX [1] biblioteca e poi lo chiamo come

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

navi Python con il wave modulo che farà ciò che ti serve. L'esempio che segue funziona quando i dettagli dei file (mono o stereo, frame rate, ecc) sono gli stessi:

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

Sono il manutentore di pydub, che è stato progettato per rendere questo genere di cose facili.

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 è un involucro leggero intorno a audioop. Così dietro le quinte, che sta facendo essenzialmente ciò che Tom10 menzionato

+0

Questo è impressionante! Grazie. – mondieki

2

solo per costruire sulla risposta di @ 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())) 

Invece di memorizzare tutti i dati poi scriverlo alla fine in un colpo solo, si scrive si morse per bit. Inoltre usa contextlib.close in modo da non dover chiudere i file.

0

Vorrei utilizzare librosa.load e librosa.write_wav. Controlla la doc here