使用PyDub删除wave文件开头和结尾处的静音

问题描述 投票:5回答:1

如何使用PyDub从wav文件的开头和结尾删除静音?

我想我应该逐段访问并检查它是否静音(但我无法做到):/

例如我有一个在开头,结尾或两者都有静音的波形文件(如下所示),我想删除文件开头和结尾处的静音:

例如我想导入它

sound = AudioSegment.from_wav(inputfile)

为每个声音样本循环以检查它是否静音并标记自波开始后的最后一个静音样本(marker1),然后到达波结束之前的最后一个样本(marker2)并且我可以从两个声音中导出新的声音文件标记

newsound = sound[marker1:marker2]

newsound.export(outputfile, format="wav")
python wave pydub
1个回答
17
投票

我建议你循环至少10毫秒的块,以便更快一点(更少的迭代),并且因为个别样本实际上没有“响度”。

声音是振动,所以至少需要2个样本来检测是否有任何声音,(但这只会告诉你高频率)。

无论如何...像这样的东西可以工作:

from pydub import AudioSegment

def detect_leading_silence(sound, silence_threshold=-50.0, chunk_size=10):
    '''
    sound is a pydub.AudioSegment
    silence_threshold in dB
    chunk_size in ms

    iterate over chunks until you find the first one with sound
    '''
    trim_ms = 0 # ms

    assert chunk_size > 0 # to avoid infinite loop
    while sound[trim_ms:trim_ms+chunk_size].dBFS < silence_threshold and trim_ms < len(sound):
        trim_ms += chunk_size

    return trim_ms

sound = AudioSegment.from_file("/path/to/file.wav", format="wav")

start_trim = detect_leading_silence(sound)
end_trim = detect_leading_silence(sound.reverse())

duration = len(sound)    
trimmed_sound = sound[start_trim:duration-end_trim]
© www.soinside.com 2019 - 2024. All rights reserved.