11

我想使用 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 文件?如果是这样,怎么做?

谢谢!

4

1 回答 1

14

示例代码非常简化,您可能需要查看该strip_silence函数:

https://github.com/jiaaro/pydub/blob/2644289067aa05dbb832974ac75cdc91c3ea6911/pydub/effects.py#L98

然后只导出每个块而不是组合它们。

该示例与 strip_silence 函数之间的主要区别在于该示例查看一毫秒的切片,它不能很好地计算低频声音,因为例如 40hz 声音的一个波形是 25 毫秒长。

不过,您最初问题的答案是原始音频片段的所有这些片段也是音频片段,因此您可以在它们上调用导出方法:)

更新:你可能想看看我刚刚推送到主分支的静默实用程序;特别是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”等

于 2014-05-19T21:18:46.880 回答