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

093gszye  于 2023-06-04  发布在  Python
关注(0)|答案(3)|浏览(508)

如何使用PyDub删除wave文件开头和结尾的静音?
我想我应该一段一段地访问它,检查它是否静默(但我做不到):/
例如,我有一个wave文件,在开始,结束或两者(如下图)都有静音,我想删除文件开始和结束时的静音:

我想导入它

sound = AudioSegment.from_wav(inputfile)

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

newsound = sound[marker1:marker2]

newsound.export(outputfile, format="wav")
brccelvz

brccelvz1#

我建议你以至少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]
gupuwyp2

gupuwyp22#

pydub可能在第一次提出这个问题后已经更新了,但下面是我用来修剪尾随和前导静音的代码:

from pydub import AudioSegment
from pydub.silence import detect_leading_silence

trim_leading_silence = lambda x: x[detect_leading_silence(x) :]
trim_trailing_silence = lambda x: trim_leading_silence(x.reverse()).reverse()
strip_silence = lambda x: trim_trailing_silence(trim_leading_silence(x))

sound: AudioSegment = AudioSegment.from_file("path/to/file.wav")
stripped: AudioSegment = strip_silence(sound)

detect_leading_silence from pydub.silence为您提供了可以用于对加载的AudioSegment进行切片的索引。基本上,您可以反转AudioSegment,修剪它,然后再次反转它以修剪拖尾静音。从两端剥离沉默就等于修剪前导沉默和尾随沉默。
请注意,如果加载的AudioSegment是静默的或在修剪操作后变为静默,则strip_silence应引发IndexError
上次我查看时,默认块大小为10 ms,默认静默阈值为-50 dBFS。
我的pydub版本是0.25.1,我的ffmpeg版本是4.3.1。

oxcyiej7

oxcyiej73#

你可以这样写代码:

from pydub.silence import detect_nonsilent

def remove_sil(path_in, path_out, format="wav"):
    sound = AudioSegment.from_file(path_in, format=format)
    non_sil_times = detect_nonsilent(sound, min_silence_len=50, silence_thresh=sound.dBFS * 1.5)
    if len(non_sil_times) > 0:
        non_sil_times_concat = [non_sil_times[0]]
        if len(non_sil_times) > 1:
            for t in non_sil_times[1:]:
                if t[0] - non_sil_times_concat[-1][-1] < 200:
                    non_sil_times_concat[-1][-1] = t[1]
                else:
                    non_sil_times_concat.append(t)
        non_sil_times = [t for t in non_sil_times_concat if t[1] - t[0] > 350]
        sound[non_sil_times[0][0]: non_sil_times[-1][1]].export(path_out, format='wav')

相关问题