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

如何按秒计算ACI等声学指标并输出对应时间序列数据框?

按秒计算声学指标并输出时间序列数据框

以下是针对需求的可复现代码,以soundecology包的20秒tropicalsound数据为例,实现按每秒计算ACI、NDSI、声学均匀度等指标,并输出对应时间序列数据框。

步骤1:加载所需工具包

首先安装并加载处理音频和计算声学指标所需的R包:

# 首次运行需安装包
install.packages(c("soundecology", "tuneR", "dplyr", "purrr", "seewave"))

# 加载包
library(soundecology)
library(tuneR)
library(dplyr)
library(purrr)
library(seewave)

步骤2:获取示例音频数据

加载内置的20秒热带环境音频:

data(tropicalsound)
# 查看音频基本信息(采样率44100Hz,时长20秒)
tropicalsound

步骤3:按秒分割音频片段

根据采样率将完整音频分割为每秒一个的独立片段:

samp_rate <- tropicalsound@samp.rate
# 生成1到20秒的时间点序列
time_points <- 1:20

# 分割音频为每秒片段
audio_segments <- map(time_points, function(t) {
  start_sample <- (t - 1) * samp_rate + 1
  end_sample <- t * samp_rate
  extractWave(tropicalsound, from = start_sample, to = end_sample, xunit = "samples")
})

步骤4:定义批量计算声学指标的函数

封装函数,对单个音频片段计算所需的声学指标:

calculate_metrics <- function(audio_segment, time_sec) {
  # 计算ACI(seewave包)
  aci <- seewave::ACI(audio_segment, f = samp_rate, plot = FALSE)
  
  # 计算NDSI(soundecology包)
  ndsi <- ndsi(audio_segment, f = samp_rate)$ndsi
  
  # 计算声学均匀度(soundecology包)
  acoustic_evenness <- acoustic_evenness(audio_segment, f = samp_rate)$ae
  
  # 返回单条结果的 tibble
  tibble(
    time_second = time_sec,
    aci = aci,
    ndsi = ndsi,
    acoustic_evenness = acoustic_evenness
  )
}

步骤5:批量计算并合并结果

对所有音频片段应用函数,合并为完整的时间序列数据框:

# 批量计算并合并
metrics_df <- map2_dfr(audio_segments, time_points, calculate_metrics)

# 查看前6行结果
head(metrics_df)

结果说明

最终生成的metrics_df包含20行数据,每行对应1秒的时间点及对应的ACI、NDSI、声学均匀度数值。你可以根据需求扩展函数,添加更多声学指标(如soundecology::acoustic_diversity()等),只需在calculate_metrics函数中增加对应计算逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:15:35