如何从pydub的split_on_silence获取音频片段的起止时间?
获取split_on_silence分割后音频片段的原始起止时间
可以获取每个音频片段在原文件中的原始起止时间,以下是两种实现方式:
方法一:基于分割结果反向计算时间
利用split_on_silence返回的音频片段顺序和长度,累计计算每个片段的原始时间区间:
from pydub import AudioSegment from pydub.silence import split_on_silence TEST_FILE = "你的音频文件.mp3" sound = AudioSegment.from_mp3(TEST_FILE) audio_chunks = split_on_silence( sound, min_silence_len=300, keep_silence=50, silence_thresh=-40 ) # 计算并存储每个片段的起止时间(单位:毫秒) chunk_timestamps = [] current_start = 0 for chunk in audio_chunks: chunk_duration = len(chunk) current_end = current_start + chunk_duration chunk_timestamps.append((current_start, current_end)) current_start = current_end # 打印时间信息(转成秒更直观) for idx, (start_ms, end_ms) in enumerate(chunk_timestamps, 1): print(f"片段{idx}: 起始 {start_ms/1000:.2f}s,结束 {end_ms/1000:.2f}s")
原理:split_on_silence按原音频顺序输出片段,每个片段的长度包含了你设置的keep_silence静音时长,通过累计长度即可回溯到原始时间位置。
方法二:手动检测静音区间并记录时间
直接调用detect_silence获取静音位置,据此计算非静音片段的原始起止时间,这种方式更灵活可控:
from pydub import AudioSegment from pydub.silence import detect_silence TEST_FILE = "你的音频文件.mp3" sound = AudioSegment.from_mp3(TEST_FILE) min_silence_len = 300 keep_silence = 50 silence_thresh = -40 # 检测所有符合条件的静音区间 silence_ranges = detect_silence( sound, min_silence_len=min_silence_len, silence_thresh=silence_thresh ) # 推导非静音片段的起止时间 chunk_timestamps = [] prev_silence_end = 0 for sil_start, sil_end in silence_ranges: # 片段起始:上一段静音结束后保留指定静音时长 chunk_start = max(0, prev_silence_end - keep_silence) # 片段结束:当前静音开始前保留指定静音时长 chunk_end = min(len(sound), sil_start + keep_silence) if chunk_end > chunk_start: chunk_timestamps.append((chunk_start, chunk_end)) prev_silence_end = sil_end # 处理最后一段非静音内容 final_start = max(0, prev_silence_end - keep_silence) final_end = len(sound) if final_end > final_start: chunk_timestamps.append((final_start, final_end)) # 根据时间提取音频片段 audio_chunks = [sound[start:end] for start, end in chunk_timestamps] # 打印时间信息 for idx, (start_ms, end_ms) in enumerate(chunk_timestamps, 1): print(f"片段{idx}: 起始 {start_ms/1000:.2f}s,结束 {end_ms/1000:.2f}s")
优势:可以直接控制是否包含keep_silence的静音时长,也能更精准地对应原音频中的实际位置。
内容的提问来源于stack exchange,提问作者user3668129
相关产品推荐
相关产品推荐

