Presentación del paquete OHUN

Author

Ana M Avila-García -Jose Gabriel Tinajero

ohun: Un paquete de R para diagnosticar y optimizar la detección automática de eventos de sonido

Autores: Marcelo Araya Salas, Grace Smith-Vidaurre, Gloriana Chaverri, Juan C. Brenes, Fabiola Chirino, Jorge Elizondo-Calvo, Alejandro Rico Guevara

Fecha de publicación: Julio 2023

Enlaces de interés

INTRODUCCIÓN

  • Las señales acústicas animales son ampliamente utilizadas en diversas áreas de investigación debido a la facilidad con la que se pueden registrar en una gran variedad de grupos taxonómicos y escenarios de investigación. Sin embargo, la investigación bioacústica puede generar grandes conjuntos de datos que pueden ser difíciles de analizar manualmente. Por eso, hay muchas herramientas disponibles para la detección automática de sonidos, pero elegir el método adecuado puede ser difícil y solo algunas herramientas proporcionan un marco para evaluar el rendimiento de la detección. Cabe aclarar que el uso de las herramientas de deteccion automatica van a depender de los objetivos y la pregunta de investigación.

  • ohun es un paquete de R que facilita la detección automática de eventos sonoros en bioacústica. Ofrece funciones para diagnosticar y optimizar las rutinas de detección, comparar el rendimiento entre diferentes enfoques y evaluar la precisión en la localización temporal de los eventos.

  • Análisis de detección: El paquete usa anotaciones de referencia que contienen la posición temporal de los sonidos objetivo en un conjunto de datos de entrenamiento para evaluar el rendimiento de las rutinas de detección usando índices comunes de la teoría de detección de señales. Esto se puede hacer tanto con las salidas de rutina importadas de otro software como con las detecciones realizadas dentro del paquete.

  • Métodos de detección: El paquete también incluye métodos de detección basados en la energía y en plantillas, dos enfoques automáticos comúnmente utilizados en la investigación bioacústica. En el articulo del paqute muestran ejemplos de cómo usar ohun para detectar automáticamente señales vocales con estudios de caso de canciones de machos adultos de pinzón cebra Taenopygia gutata y llamadas sociales ultrasónicas del murciélago de disco de Spix Thyroptera tricolor, principalmente llamados de consulta. Nosotros evaluaremos el desempeño del paquete para llamados de consulta de Thyroptera tricolor.

APLICACIONES A OTROS CAMPOS DE LA BIOLOGÍA

  • Neurobiologia y comportamiento: se puede utilizar para responder preguntas sobre el comportamiento vocal en distintos contextos. Como por ejemplo en el aprendizaje vocal de los pericos Melopsittacus undulatus en donde se utilizó la función optimize_energy_detector para generar umbrales basados en la amplitud, rango de frecuencia y parámetros de duración y mejorar la detección de las vocalizaciones requeridas para este estudio. Con eso lograron determinar que los individuos viejos mantienen niveles de aprendizaje equivalentes a los de los adultos jóvenes (Moussaoui et al., 2023).

  • Ecología de comnidades: se podrían usar las funciones de detección por plantillas (template detection) para detectar las vocalizaciones de las especies que se encuentran en un sitio específico. Para esto se debe de tener primero referencias acústicas de las especies que podrían encontrarse en el sitio y luego compararlas con las obtenidas.

  • Ecoacústica y Conservación: la Ecoacústica estudia la relación que tienen los sonidos, los seres vivos y su entorno. Y se puede emplear el paquete de las misma forma que la Ecologia de Comunidades y terminar complementando con otros programas o paquetes de índices de diversidad acústica. Además, en conservación podria usarse la función optimize_energy_detector para detectar sonidos fuera de los patrones normales de la naturaleza como el sonido de una motosierra, disparos de armas, maquinaria, etc., para monitoreo y manejo de áras protegidas.

#Paquetes necesarios 
library(ohun)

Please cite 'ohun' as: 
 Araya-Salas, M., Smith-Vidaurre, G., Chaverri, G., Brenes, J. C., Chirino, F., Elizondo-Calvo, J., & Rico-Guevara, A. 2023. ohun: an R package for diagnosing and optimizing automatic sound event detection. Methods in Ecology and Evolution. https://doi.org/10.1111/2041-210X.14170
library(warbleR)
Loading required package: tuneR
Loading required package: seewave
Loading required package: NatureSounds
Loading required package: knitr
library(Rraven)
library(tuneR)

Ejemplo Detección basada en energía

wd <- "H:/Mi unidad/UCR/2023-2/pRogramación/OHUN/OHUN/data_ohun"
setwd(wd)

ref <-
  readWave("./Inquiry_alt_16s.wav")

label_spectro(wave = ref,
              env = TRUE,
              fastdisp = TRUE)

detection <-
  energy_detector(
    files = "Inquiry_alt_16s.wav",
    bp = c(12, 65),
    hold.time = 0,
    path = wd,
  )

detection
Object of class 'selection_table'
* The output of the following call:
energy_detector(files = "Inquiry_alt_16s.wav", path = wd, bp = c(12, 65), hold.time = 0)

Contains: *  A selection table data frame with 47 rows and 5 columns:
|sound.files         | duration| selec|  start|    end|
|:-------------------|--------:|-----:|------:|------:|
|Inquiry_alt_16s.wav |   0.0474|     1| 0.6547| 0.7020|
|Inquiry_alt_16s.wav |   0.0499|     2| 1.6576| 1.7074|
|Inquiry_alt_16s.wav |   0.0001|     3| 1.7079| 1.7081|
|Inquiry_alt_16s.wav |   0.0001|     4| 1.7081| 1.7082|
|Inquiry_alt_16s.wav |   0.0501|     5| 2.6098| 2.6599|
|Inquiry_alt_16s.wav |   0.0000|     6| 3.6535| 3.6535|
... and 41 more row(s)

 * A data frame (check.results) generated by check_sels() (as attribute) 
created by warbleR 1.1.29
# plot spectrogram and envelope
label_spectro(
  wave = ref,
  envelope = TRUE,
  detection = detection,
  threshold = 50,
  fastdisp = TRUE
)

# Optimizando con energy-based detection

selec_ref <-
  imp_raven(path = wd,
            warbler.format = TRUE,
            all.data = TRUE)


# Optimize energy detection
optim_detection <-
  optimize_energy_detector(
    reference = selec_ref,
    files = "Inquiry_alt_16s.wav",
    threshold = c(5, 50),
    bp = c(11, 45),
    hold.time = c(0, 60),
    path = wd,
  )
4 combinations will be evaluated:
summarize_diagnostic(optim_detection)
  threshold peak.amplitude smooth hold.time min.duration max.duration thinning
1         5              0      5         0         -Inf          Inf        1
2        50              0      5         0         -Inf          Inf        1
3         5              0      5        60         -Inf          Inf        1
4        50              0      5        60         -Inf          Inf        1
  detections true.positives false.positives false.negatives splits merges
1         46             24              22              38      0      0
2         13              0              13              62      0      0
3         25             24               1              38      0      0
4          5              0               5              62      0      0
   overlap   recall precision  f.score
1 0.846807 0.387097  0.521739 0.444444
2       NA 0.000000  0.000000       NA
3 0.850356 0.387097  0.960000 0.551724
4       NA 0.000000  0.000000       NA

Ejemplo Detección basada en plantilla

Primero se deben descargar los datos proporcionados por el ejemplo del paquete, que viene con una tabla de referencia de ejemplo que contiene anotaciones de cantos de colibríes ermitaños de pico largo de dos archivos de sonido. Los datos de ejemplo se pueden cargar y explorar de la siguiente manera:

# Cargar los datos de ejemplo del paquete
data("lbh1", "lbh2", "lbh_reference")

# descargar los archivos de audio
tuneR::writeWave(lbh1, file.path(tempdir(), "lbh1.wav"))
tuneR::writeWave(lbh2, file.path(tempdir(), "lbh2.wav"))

# seleccionar un subset de los datos
lbh2_reference <-
  lbh_reference[lbh_reference$sound.files == "lbh2.wav",]

lbh2_reference
Object of class 'selection_table'
* The output of the following call:
`[.selection_table`(X = lbh_reference, i = lbh_reference$sound.files == "lbh2.wav")

Contains: *  A selection table data frame with 9 rows and 6 columns:
|sound.files | selec|  start|    end| bottom.freq| top.freq|
|:-----------|-----:|------:|------:|-----------:|--------:|
|lbh2.wav    |     1| 0.1092| 0.2482|      2.2954|   8.9382|
|lbh2.wav    |     2| 0.6549| 0.7887|      2.2954|   9.0426|
|lbh2.wav    |     3| 1.2658| 1.3856|      2.2606|   9.0774|
|lbh2.wav    |     4| 1.8697| 2.0053|      2.1911|   8.9035|
|lbh2.wav    |     5| 2.4418| 2.5809|      2.1563|   8.6600|
|lbh2.wav    |     6| 3.0368| 3.1689|      2.2259|   8.9382|
... and 3 more row(s)

 * A data frame (check.results) generated by check_sels() (as attribute) 
created by warbleR < 1.1.21

Luego se puede graficar el espectrocrama con las seleciones de referencia, otros paquetes que se pueden usar para graficar espectrogramas son seewave tuneR o dynaSpec

# Imprimir el espectrograma 
label_spectro(wave = lbh2, reference = lbh2_reference, hop.size = 10, ovlp = 50, flim = c(1, 10))

La función get_templates() sirve para encontrar una plantilla más cercana a la estructura acústica promedio de los eventos sonoros en una tabla de referencia. Esto se hace encontrando los eventos sonoros más cercanos al centroide del espacio acústico. El fundamento de esto es que un evento sonoro más cercano a la estructura acústica promedio tiene más probabilidades de compartir características estructurales con la mayoría de los sonidos en el espacio acústico que un evento sonoro en la periferia del espacio. Estas plantillas de “estructura media” se pueden obtener de la siguiente manera:

# get mean structure template
template <-
  get_templates(reference = lbh2_reference, path = tempdir())
The first 2 principal components explained 0.58 of the variance

Luego se va a ejecutar una detección en los datos de ejemplo ‘lbh1’

# primero se optienen las correlaciones
correlations <-
  template_correlator(templates = template,
                      files = "lbh2.wav",
                      path = tempdir())

correlations
Object of class 'template_correlations' 
* The output of the following template_correlator() call: 
template_correlator(templates = template, files = "lbh2.wav", 
path = tempdir())
* Contains 1 correlation score vector(s) from 1 template(s):
 lbh2.wav-6 

... and 1 sound files(s):
 lbh2.wav 

 * Created by ohun 1.0.0
# A Partir de correlations se pueden detectar eventos de sonidos 
detection <-
  template_detector(template.correlations = correlations, threshold = 0.7)

detection
Object of class 'selection_table'
* The output of the following call:
template_detector(template.correlations = correlations, threshold = 0.7)

Contains: *  A selection table data frame with 7 rows and 6 columns:
|sound.files | selec|  start|    end|template   | scores|
|:-----------|-----:|------:|------:|:----------|------:|
|lbh2.wav    |     1| 1.2694| 1.4014|lbh2.wav-6 | 0.7214|
|lbh2.wav    |     2| 1.8750| 2.0070|lbh2.wav-6 | 0.7929|
|lbh2.wav    |     3| 2.4573| 2.5893|lbh2.wav-6 | 0.7456|
|lbh2.wav    |     4| 3.0512| 3.1832|lbh2.wav-6 | 0.7833|
|lbh2.wav    |     5| 3.6451| 3.7772|lbh2.wav-6 | 0.7716|
|lbh2.wav    |     6| 4.1692| 4.3012|lbh2.wav-6 | 0.8003|
... and 1 more row(s)

 * A data frame (check.results) generated by check_sels() (as attribute) 
created by warbleR 1.1.29
# Imprimir el espectograma con las detecciones 
label_spectro(
  wave = lbh2,
  detection = detection,
  template.correlation = correlations[[1]],
  flim = c(0, 10),
  threshold = 0.4,
  hop.size = 10, ovlp = 50)

El rendimiento se puede evaluar mediante:diagnose_detection()

#diagnose 
diagnose_detection(reference = lbh2_reference, detection = detection)
  detections true.positives false.positives false.negatives splits merges
1          7              7               0               2      0      0
   overlap   recall precision f.score
1 0.815395 0.777778         1   0.875