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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:30:30