2014-05-19 21 views
5

Vorrei usare pyDub per prendere un file WAV lungo di singole parole (e silenzio in mezzo) come input, quindi rimuovere tutto il silenzio e emettere i restanti blocchi. singoli file WAV. I nomi di file possono essere solo numeri sequenziali, come 001.wav, 002.wav, 003.wav, ecc.Uso di pyDub per tagliare un file audio lungo

L'esempio "Yet another Example?" nella pagina Github fa qualcosa di molto simile, ma piuttosto che emettere file separati, combina i segmenti di silenzio-spogliato di nuovo insieme in un unico file:

from pydub import AudioSegment 
from pydub.utils import db_to_float 

# Let's load up the audio we need... 
podcast = AudioSegment.from_mp3("podcast.mp3") 
intro = AudioSegment.from_wav("intro.wav") 
outro = AudioSegment.from_wav("outro.wav") 

# Let's consider anything that is 30 decibels quieter than 
# the average volume of the podcast to be silence 
average_loudness = podcast.rms 
silence_threshold = average_loudness * db_to_float(-30) 

# filter out the silence 
podcast_parts = (ms for ms in podcast if ms.rms > silence_threshold) 

# combine all the chunks back together 
podcast = reduce(lambda a, b: a + b, podcast_parts) 

# add on the bumpers 
podcast = intro + podcast + outro 

# save the result 
podcast.export("podcast_processed.mp3", format="mp3") 

è possibile uscita quei frammenti podcast_parts come file WAV individuali? Se é cosi, come?

Grazie!

risposta

7

Il codice di esempio è piuttosto semplificata, probabilmente si vorrà guardare la funzione strip_silence:

https://github.com/jiaaro/pydub/blob/master/pydub/effects.py#L76

E poi basta esportare ogni blocco, invece di combinarli.

La differenza principale tra l'esempio e la funzione strip_silence è che l'esempio esamina fette di un millisecondo, che non contano molto bene il suono a bassa frequenza poiché una forma d'onda di un suono a 40 Hz, ad esempio, è lunga 25 millisecondi.

La risposta alla tua domanda iniziale, però, è che tutte quelle fette di segmento audio originale sono anche i segmenti audio, così si può chiamare il metodo di esportazione su di loro :)

aggiornamento: si consiglia per dare un'occhiata allo silence utilities ho appena spinto verso l'alto nel ramo principale; soprattutto split_on_silence() che potrebbe fare questo (supponendo che gli argomenti specifici destra) in questo modo:

from pydub import AudioSegment 
from pydub.silence import split_on_silence 

sound = AudioSegment.from_mp3("my_file.mp3") 
chunks = split_on_silence(sound, 
    # must be silent for at least half a second 
    min_silence_len=500, 

    # consider it silent if quieter than -16 dBFS 
    silence_thresh=-16 
) 

si potevano esportare tutti i singoli pezzi come file WAV in questo modo:

for i, chunk in enumerate(chunks): 
    chunk.export("/path/to/ouput/dir/chunk{0}.wav".format(i), format="wav") 

che renderebbe uscita ognuno di nome "chunk0.wav", "chunk1.wav", "chunk2.wav", e così via

+0

Grazie per la risposta, ma sono un po 'un principiante, e ancora non capisco come gestire il passaggio i frammenti audio al metodo di esportazione. – user3643227