You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现结合静音检测的音频按1分钟左右智能分段切割

静音顺延切割音频实现方案

你可以通过先预定位基准切割点、再匹配后续最近静音区间的逻辑实现需求,修改后的可运行代码如下:

from pydub import AudioSegment
from pydub.silence import detect_silence

# 音量归一化函数 复用你原来的逻辑
def match_target_amplitude(aChunk, target_dBFS):
    change_in_dBFS = target_dBFS - aChunk.dBFS
    return aChunk.apply_gain(change_in_dBFS)

# 加载音频
song = AudioSegment.from_file(r"C:\Users\Snur\Pycharm Projects\Gitlab\v\ubuntu.wav")
audio_len = len(song) # 音频总时长 单位ms

# 可配置参数
base_chunk_len = 60 * 1000 # 基础切片长度 1分钟
min_silence_len = 1000 # 判定静音的最小长度 1秒
silence_thresh = -16 # 静音音量阈值
max_shift_len = 30 * 1000 # 最大顺延时长 避免无静音导致切片过长
padding_silence_len = 500 # 首尾填充的静音长度
target_dBFS = -20.0 # 归一化目标音量

# 先提取全音频所有符合要求的静音区间
all_silences = detect_silence(song, min_silence_len=min_silence_len, silence_thresh=silence_thresh)

current_start = 0
chunk_index = 0
while current_start < audio_len:
    # 计算基准切割点
    base_cut_point = current_start + base_chunk_len
    # 如果已经到音频末尾 直接收尾
    if base_cut_point >= audio_len:
        cut_point = audio_len
    else:
        # 找基准切割点之后的第一个符合要求的静音区间
        cut_point = None
        for (sil_start, sil_end) in all_silences:
            # 静音区间在基准切割点之后 且不超过最大顺延时长
            if sil_start >= base_cut_point and sil_start <= base_cut_point + max_shift_len:
                # 选静音区间的中间点切割 避免切到静音边缘
                cut_point = (sil_start + sil_end) // 2
                break
        # 没找到符合要求的静音 就用基准切割点+最大顺延时长的位置切
        if cut_point is None:
            cut_point = min(base_cut_point + max_shift_len, audio_len)
    # 切出当前片段
    chunk = song[current_start:cut_point]
    # 加首尾静音填充 归一化
    silence_chunk = AudioSegment.silent(duration=padding_silence_len)
    audio_chunk = silence_chunk + chunk + silence_chunk
    normalized_chunk = match_target_amplitude(audio_chunk, target_dBFS)
    # 导出
    print(f"导出chunk{chunk_index}.wav")
    normalized_chunk.export(f"chunk{chunk_index}.wav", bitrate="192k", format="wav")
    # 更新起始位置
    current_start = cut_point
    chunk_index += 1

注意事项

  • 如果你不想设置最大顺延限制,把max_shift_len的值改成音频总时长即可
  • 静音阈值suggest_thresh建议根据你的音频实际情况调整,人声为主的音频可以设到-20到-25之间,背景噪音大的话可以适当调高
  • 代码里选择静音区间中间点切割,是为了避免切割点刚好落在静音开头/结尾,出现片段首尾带半个音的问题,如果不需要可以直接把cut_point设为sil_start或者sil_end

内容的提问来源于stack exchange,提问作者newprogrammer23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:24:03