Librosa降采样后如何获取与RMS矩阵匹配的正确时间矩阵?
解决Librosa降采样后times_like时间序列异常的问题
核心原因
librosa.times_like() 默认使用Librosa全局默认的 hop_length=512 计算时间序列,而你自定义了 hop_length1 用于计算RMS,却没有将这个参数传入 times_like(),导致时间步长计算错误,最终时间终点远小于实际音频时长。
解决方案
调用 times_like() 时必须显式传入你计算RMS时使用的 hop_length 和采样率 sr,同时建议避免硬编码 desired_rms_length,而是根据需求的时间分辨率动态计算参数。
修正后的完整代码
import librosa # 加载音频并降采样至1000Hz y_8k, sr2 = librosa.load('104.mp4', sr=1000) time104 = librosa.get_duration(y=y_8k, sr=sr2) print(time104) # 输出93.972s,正确时长 # 按时间分辨率计算参数(示例:1ms分辨率) time_resolution = 0.001 # 每个RMS帧对应1毫秒 hop_length1 = int(sr2 * time_resolution) frame_length1 = 2 * hop_length1 # 帧长设为步长的2倍,可根据需求调整 # 计算RMS rms104 = librosa.feature.rms(y=y_8k, frame_length=frame_length1, hop_length=hop_length1) # 生成正确的时间序列:传入自定义的hop_length和sr timematrix = librosa.times_like(rms104, hop_length=hop_length1, sr=sr2) # 验证时间终点 print(timematrix[-1]) # 输出接近93.972s,符合预期
补充说明
- 如果坚持使用硬编码的
desired_rms_length,确保计算hop_length1后,times_like()必须传入该参数,否则仍然会用默认值512导致错误。 librosa.feature.rms()的输出帧数公式为:n_frames = 1 + (len(y) - frame_length) // hop_length,你可以根据这个公式验证RMS矩阵长度是否符合预期。
内容的提问来源于stack exchange,提问作者Natalie
相关产品推荐
相关产品推荐

