首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用PyDub消除wave文件开头和结尾的静音

使用PyDub消除wave文件开头和结尾的静音
EN

Stack Overflow用户
提问于 2015-04-10 03:25:46
回答 3查看 17.8K关注 0票数 9

如何使用PyDub消除wave文件开头和结尾的静音?

我想我应该逐段访问并检查它是否处于静默状态(但我不能这样做) :/

例如,我有一个wave文件,在开头和/或结尾都是无声的(如下所示),我想要删除文件开头和结尾的无声:

例如,我想导入它

代码语言:javascript
运行
复制
sound = AudioSegment.from_wav(inputfile)

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

代码语言:javascript
运行
复制
newsound = sound[marker1:marker2]

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-10 06:31:21

我建议你至少以10毫秒为单位进行循环,这样做的速度会更快(迭代次数更少),也是因为单个样本并没有真正的“响度”。

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

不管怎样,…像这样的东西可能会起作用:

代码语言:javascript
运行
复制
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]
票数 36
EN

Stack Overflow用户

发布于 2020-02-14 00:32:17

您可以使用以下代码:

代码语言:javascript
运行
复制
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')
票数 3
EN

Stack Overflow用户

发布于 2021-09-26 03:17:03

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

代码语言:javascript
运行
复制
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)

来自pydub.silencedetect_leading_silence为您提供了可用于对加载的AudioSegment进行切片的索引。基本上,您可以反转AudioSegment,修剪它,然后再次反转它以修剪尾随静默。去除两端的静默相当于修剪前导静默和尾随静默。

请注意,如果加载的IndexError处于静默状态或在修剪操作后变为静默状态,则strip_silence应引发AudioSegment

最后一次查看时,默认块大小为10ms,默认静默阈值为-50 dBFS。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29547218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档