如何使用Librosa将WAV音频文件分割为15秒区间?
音频分割为指定时长片段的解决方案
以下是修改后的完整代码,可直接实现将音频分割为15秒(或任意自定义时长)的片段:
import os import numpy as np import librosa import soundfile as sf # 补充缺失的库导入 audio_dir = r'data\acoustics\recordings' out_dir = r'data\acoustics\splits' os.makedirs(out_dir, exist_ok=True) audio_file = os.path.join(audio_dir, 'rec_20220729T160547Z.wav') wave, sr = librosa.load(audio_file, sr=None) # 自定义分割时长(单位:秒),改这个数就能切换成5秒、10秒等任意时长 segment_duration = 15 # 计算单片段对应的采样点数量:采样率sr = 每秒采样点数,所以时长*sr就是片段总采样点 segment_samples = segment_duration * sr # 计算总片段数(向上取整,确保最后一段不足时长的片段也被保留) num_sections = int(np.ceil(len(wave) / segment_samples)) split = [] for i in range(num_sections): start_idx = i * segment_samples end_idx = start_idx + segment_samples # 按采样点范围截取音频片段 audio_segment = wave[start_idx:end_idx] split.append(audio_segment) # 保存分割后的片段 recording_name = os.path.basename(audio_file[:-4]) for idx, segment in enumerate(split): out_file = f"{recording_name}_{idx}.wav" sf.write(os.path.join(out_dir, out_file), segment, sr)
关键改动说明
- 新增自定义时长参数:
segment_duration = 15是核心控制变量,直接修改数值就能调整分割片段的时长,无需改动其他逻辑。 - 替换片段长度计算逻辑:原代码用
sr(1秒的采样点数)作为片段长度,现在改成segment_duration * sr,即指定时长对应的总采样点数,这是实现任意时长分割的关键。 - 修正语法错误:原代码中
num_sections行缺少右括号,同时将分母从sr换成segment_samples,才能正确计算总片段数。 - 补充依赖库:添加
import soundfile as sf,否则sf.write会报错。 - 优化循环逻辑:调整音频片段的截取范围,确保每次截取
segment_samples个采样点,对应设置的时长。
额外提示
如果不需要保留最后一段不足指定时长的片段,只需将np.ceil换成np.floor,这样总片段数会向下取整,丢弃末尾的短片段。
内容的提问来源于stack exchange,提问作者andrewr
相关产品推荐
相关产品推荐

