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

如何用Seewave生成不同起始时间的功率谱?遇下标越界错误求助

解决Seewave库meanspec下标越界问题

错误原因很明确:你的音频总时长是3599秒,但当前生成的序列n中,最后一个起始时间是3584秒,对应的结束时间是3584+32=3616秒,已经超出了音频的实际时长(3599秒)。meanspec在尝试访问超出音频范围的样本时,自然会触发subscript out of bounds错误。之前设0或8时能正常运行,应该是当时序列的最后一段结束时间刚好没超过3599秒。

修复方案

调整序列n的生成逻辑,确保每一段的结束时间(x+32)都不超过音频总时长3599秒:

# 先正确加载音频文件(补充readWave的文件路径参数)
sound1 <- readWave("你的音频文件路径.wav")

# 计算最大允许的起始时间:总时长减去分段时长
max_valid_start <- 3599 - 32
# 生成符合要求的起始时间序列
n <- seq(from=16, to=max_valid_start, by=32)

# 后续处理代码不变
result <- do.call(cbind, lapply(n, function(x)
  meanspec(sound1, from=x, to=(x+32), wl=1024, plot=FALSE, ovlp=50, norm=FALSE)))

如果允许最后一段可以是不足32秒的片段,也可以在lapply的匿名函数中动态调整结束时间:

result <- do.call(cbind, lapply(n, function(x) {
  end_time <- min(x+32, 3599)
  meanspec(sound1, from=x, to=end_time, wl=1024, plot=FALSE, ovlp=50, norm=FALSE)
}))

这种方式会保留所有起始时间,但自动将超出时长的片段截断到音频末尾,不过要注意:最后一段的功率谱维度可能和其他完整段不一致,可能会导致cbind报错。如果需要所有功率谱维度一致,优先采用第一种方案,只保留完整的32秒片段。

内容的提问来源于stack exchange,提问作者Juan Almeira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:10:27