如何在Librosa中读取指定时间范围的音频数据?
提取音频特定时间区间的RMS数据
当然可以读取音频特定时间区间的数据,针对你的需求,有两种简洁的实现方式:
方法一:先截取目标时间的音频波形,再计算RMS
直接从原始音频波形中切出1.8秒到2.4秒的片段,再对这段片段计算RMS,步骤清晰高效:
- 根据采样率
sr将目标时间转换为对应的采样点索引 - 截取音频波形的对应片段
- 对截取后的片段计算RMS并生成匹配的时间轴
修改后的代码示例:
import librosa import matplotlib.pyplot as plt # 加载音频 y, sr = librosa.load(librosa.ex('trumpet')) # 定义目标时间区间 start_time = 1.8 end_time = 2.4 # 转换为采样点索引 start_sample = int(start_time * sr) end_sample = int(end_time * sr) # 截取音频片段 y_slice = y[start_sample:end_sample] # 计算该片段的RMS rms_slice = librosa.feature.rms(y=y_slice) times_slice = librosa.times_like(rms_slice, sr=sr) # 加上起始时间偏移,让时间轴对应原始音频的实际时间 times_slice += start_time # 绘图展示结果 plt.semilogy(times_slice, rms_slice[0], label='RMS Energy (1.8-2.4s)') plt.legend() plt.show()
方法二:从已计算的全局RMS结果中筛选目标区间
如果你已经完成了整个音频的RMS计算,也可以直接通过布尔索引从全局结果中筛选出1.8-2.4秒的数据:
import librosa import matplotlib.pyplot as plt # 加载音频并计算全局RMS y, sr = librosa.load(librosa.ex('trumpet')) S, phase = librosa.magphase(librosa.stft(y)) rms = librosa.feature.rms(S=S) times = librosa.times_like(rms) # 定义目标时间区间并生成筛选掩码 start_time = 1.8 end_time = 2.4 time_mask = (times >= start_time) & (times <= end_time) # 筛选对应的数据 selected_rms = rms[0][time_mask] selected_times = times[time_mask] # 绘图展示结果 plt.semilogy(selected_times, selected_rms, label='RMS Energy (1.8-2.4s)') plt.legend() plt.show()
两种方法都能精准获取目标时间区间的RMS数据:方法一更适合只关注局部区间的场景,计算开销更小;方法二则适合需要保留全局计算结果,同时提取局部数据的情况。
内容的提问来源于stack exchange,提问作者Megan
相关产品推荐
相关产品推荐

