Использование pyDub для измельчения длинного аудиофайла

Я хотел бы использовать pyDub, чтобы взять длинный файл WAV отдельных слов (и тишину между ними) в качестве входных данных, затем отключить все молчание и вывести оставшиеся куски – это отдельные файлы WAV. Имена файлов могут быть просто порядковыми номерами, такими как 001.wav, 002.wav, 003.wav и т. Д.

Пример « Еще один пример? » На странице Github делает что-то очень похожее, но вместо вывода отдельных файлов он объединяет сегменты, разделенные молчанием, в один файл:

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

Можно ли выводить эти фрагменты podcast_parts как отдельные WAV-файлы? Если да, то как?

Благодаря!

Пример кода довольно упрощен, вы, вероятно, захотите посмотреть на функцию strip_silence :

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

А затем просто экспортируйте каждый кусок, а не объединяйте их.

Основное отличие между примером и функцией strip_silence заключается в том, что пример показывает один миллисекундный срез, который не учитывает низкочастотный звук очень хорошо, так как одна волновая форма звука 40 Гц, например, составляет 25 миллисекунд.

Однако ответ на ваш оригинальный вопрос заключается в том, что все эти фрагменты исходного сегмента аудио также являются сегментами аудио, поэтому вы можете просто вызвать метод экспорта на них 🙂

update : вы можете взглянуть на утилиты молчания, которые я только что нажал на главную ветку; особенно split_on_silence() который мог бы сделать это (предполагая правильные конкретные аргументы) следующим образом:

 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 ) 

вы можете экспортировать все отдельные фрагменты в виде wav-файлов следующим образом:

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

который будет выводить каждый из них под названием «chunk0.wav», «chunk1.wav», «chunk2.wav» и т. д.