如何按秒计算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
相关产品推荐
相关产品推荐

