簡體   English   中英

使用 PyDub 去除波形文件開頭和結尾的靜音

[英]remove silence at the beginning and at the end of wave files with PyDub

如何使用 PyDub 去除波形文件開頭和結尾的靜音?

我想我應該逐段訪問並檢查它是否靜音(但我做不到):/

例如,我有一個在開頭、結尾或兩者都有靜音的 wave 文件(如下所示),我想刪除文件開頭和結尾的靜音:

無聲的波形文件

例如我想導入它

sound = AudioSegment.from_wav(inputfile)

循環每個聲音樣本以檢查它是否無聲並標記自波開始時的最后一個無聲樣本(標記 1),然后在波結束前到達最后一個樣本(標記 2),我可以從這兩個樣本中導出新的聲音文件標記

newsound = sound[marker1:marker2]

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

我建議您以至少 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]

您可以使用以下代碼:

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

pydub可能已經更新,因為這個問題是第一次被問到,但這里是我用來修剪尾隨和前導沉默的代碼:

from pydub import AudioSegment
from pydub.silence import detect_leading_silence

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

sound = AudioSegment.from_file(file_path_here)
stripped = strip_silence(sound)

detect_leading_silence中的pydub.silence為您提供了可用於對加載的AudioSegment進行切片的索引。 基本上,您可以反轉AudioSegment ,修剪它,然后再次反轉以修剪拖尾的靜音。 從兩端剝離沉默等同於修剪前導和尾隨的沉默。

請注意,如果加載的AudioSegment是無聲的或在修剪操作后變得無聲,則strip_silence應該引發IndexError

我上次查看時,默認塊大小為 10 毫秒,默認靜音閾值為 -50 dBFS。

我的pydub版本是0.25.1,我的ffmpeg版本是4.3.1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM