如何实现结合静音检测的音频按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
相关产品推荐
相关产品推荐

