将音频分割为5秒片段时遭遇IndexError问题求助
解决音频分割时的IndexError问题
错误根源
- 变量混淆:你把存储音频采样数据的
y和存储文件路径的字符串filename搞混了:- 循环范围用
len(filename)计算的是文件路径的字符数,不是音频的采样点总数,应该用len(y)。 - 切片时错误截取
filename的片段,得到的是字符串,而soundfile.write需要的是数值型音频数组,这直接导致了IndexError。
- 循环范围用
- 索引逻辑错误:原代码用
5*sr*i作为起始索引,会快速超出音频数据的长度范围,正确的做法是用循环变量i直接作为起始点,每次步进5秒对应的采样数。
修正后的代码
import librosa import soundfile as sf filename= "/content/drive/MyDrive/Colab Notebooks/22__19_07_13_adventure_maniobra.wav" y, sr = librosa.load(filename, sr=None) segment_seconds = 5 segment_samples = segment_seconds * sr # 5秒对应的采样点数量 # 遍历音频数据,按5秒分割 for idx, i in enumerate(range(0, len(y), segment_samples)): audio_segment = y[i:i+segment_samples] sf.write(f"dest_audio_{idx}.wav", audio_segment, sr)
关键修改说明
- 用
len(y)作为循环终止条件,确保覆盖完整的音频数据。 - 直接通过
y[i:i+segment_samples]截取当前5秒片段,最后一段如果不足5秒会自动取到音频末尾。 - 用
enumerate生成连续的文件名序号(0、1、2...),比原代码的序号更直观易读。
内容的提问来源于stack exchange,提问作者Maryam Qureshi
相关产品推荐
相关产品推荐

