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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:05:03