El paquete warbleR pretende facilitar el análisis de la estructura de la señal acústica animal en R. Los usuarios pueden recopilar grabaciones aviares de acceso abierto o ingresar sus propios datos en un flujo de trabajo que facilita la visualización espectrográfica y la medición de parámetros acústicos. warbleR hace uso de las herramientas fundamentales de análisis de sonido del paquete seewave , y ofrece nuevas herramientas para análisis de estructura acústica. Estas herramientas están disponibles para el análisis por lotes (“batch processing”) de señales acústicas.

 

Las principales características del paquete son:

  • El uso de bucles (loops) para aplicar tareas a traves de señales acústicas referenciadas en un cuadro de selección
  • La producción de imágenes en la carpeta de trabajo con espectrogramas que permiten organizar datos y verificar los análisis acústicos

El paquete ofrece funciones para:

  • Explorar y descargar grabaciones de Xeno‐Canto
  • Explorar, organizar y manipular múltiples archivos de sonido
  • Detectar señales automáticamente (en frecuencia y tiempo)
  • Crear espectrogramas de grabaciones completas o señales individuales
  • Correr diferentes medidas de estructura de las señales acústicas
  • Evaluar el rendimiento de los métodos de medición
  • Catalogar señales
  • Caracterizar diferentes niveles estructurales en las señales acústicas
  • Análisis estadístico de coordinación de duetos
  • Consolidar bases de datos y cuadros de anotación

La mayoría de las funciones permiten la paralelización de tareas, que distribuye las tareas entre varios procesadores para mejorar la eficiencia computacional. Las herramientas para evaluar el desempeño del análisis en cada paso también están disponibles. Todas estas herramientas se proporcionan en un flujo de trabajo estandarizado para el análisis de la estructura de la señal (Fig. 1), haciéndolas accesibles a una amplia gama de usuarios, incluidos aquellos sin mucho conocimiento de R. Además, warbleR satisface la necesidad de análisis bioacústicos de fuente abierta rigurosos, lo que facilita las oportunidades para su uso en investigación y la innovación de análisis personalizados adicionales.

warbleR es un paquete joven (publicado oficialmente en 2017) y se encuentra en una etapa de maduración:

ciclo de vida

 

Cuadros de selección

Estos objetos se crean con la función selection_table(). La función toma cuadros de datos que contienen datos de selección (nombre del archivo de sonido, selección, inicio, final …), verifica si la información es consistente (consulte la función checksels() para obtener detalles) y guarda los metadatos de ‘diagnóstico’ como un atributo. Los cuadros de selección son básicamente cuadros de datos (data frames) donde se ha corroborado que la informacíón contenida y que esta puede ser leida por las funciones en warbleR. Los cuadros de datos deben contener (al menos) las siguientes columnas:

  1. archivos de sonido (sound.files)
  2. selección (selec)
  3. inicio (start)
  4. fin (end)

Los datos de ejemplo “lbh_selec_table” contienen estas columnas:

data("lbh_selec_table")

lbh_selec_table
sound.files channel selec start end bottom.freq top.freq sel.comment rec.comment
Phae.long1.wav 1 1 1.1693549 1.3423884 2.220105 8.604378 c24 NA
Phae.long1.wav 1 2 2.1584085 2.3214565 2.169437 8.807053 c25 NA
Phae.long1.wav 1 3 0.3433366 0.5182553 2.218294 8.756604 c26 NA
Phae.long2.wav 1 1 0.1595983 0.2921692 2.316862 8.822316 c27 NA
Phae.long2.wav 1 2 1.4570585 1.5832087 2.284006 8.888027 c28 NA
Phae.long3.wav 1 1 0.6265520 0.7577715 3.006834 8.822316 c29 NA
Phae.long3.wav 1 2 1.9742132 2.1043921 2.776843 8.888027 c30 NA
Phae.long3.wav 1 3 0.1233643 0.2545812 2.316862 9.315153 c31 NA
Phae.long4.wav 1 1 1.5168116 1.6622365 2.513997 9.216586 c32 NA
Phae.long4.wav 1 2 2.9326920 3.0768784 2.579708 10.235116 c33 NA
Phae.long4.wav 1 3 0.1453977 0.2904966 2.579708 9.742279 c34 NA

 

… y pueden ser convertidos al formato selection_table así:

# parametros globales
warbleR_options(wav.path = "PONER RUTA A 'ejemplos' AQUI")

st <- selection_table(X = lbh_selec_table, pb = FALSE)

st
all selections are OK 
object of class 'selection_table' 
 contains a selection table data frame with 11 rows and 9 columns: 
     sound.files channel selec     start       end bottom.freq top.freq sel.comment rec.comment
1 Phae.long1.wav       1     1 1.1693549 1.3423884    2.220105 8.604378         c24          NA
2 Phae.long1.wav       1     2 2.1584085 2.3214565    2.169437 8.807053         c25          NA
3 Phae.long1.wav       1     3 0.3433366 0.5182553    2.218294 8.756604         c26          NA
4 Phae.long2.wav       1     1 0.1595983 0.2921692    2.316862 8.822316         c27          NA
5 Phae.long2.wav       1     2 1.4570585 1.5832087    2.284006 8.888027         c28          NA
6 Phae.long3.wav       1     1 0.6265520 0.7577715    3.006834 8.822316         c29          NA
... and 5 more rows 
and a data frame (check.results) generated by checkres() (as attribute)

Nótese que se ha brindado la dirección a los archivos de sonido. Esto es necesario para verificar que los datos brindados se ajustan a las caracteristicas de los archivos de audio.

Los cuadros de selección tienen su propia clase en R:

class(st)
[1] "selection_table" "data.frame"     

 

Cuadros de selección extendidos

Cuando el argumento extended = TRUE la función genera un objeto de la clase extended_selection_table que también contiene una lista de objetos ‘wave’ correspondientes a cada una de las selecciones en el cuadro de datos. Por lo tanto, la función transforma las cuadros de selección en objetos autocontenidos ya que ya no necesitan los archivos de sonido originales para ejecutar la mayoría del análisis acústico en warbleR. Esto puede facilitar mucho el almacenamiento y el intercambio de datos (bio) acústicos. Además, también acelera los procesos, ya que no es necesario leer los archivos de sonido cada vez que se analizan los datos.

Ahora, como se mencionó anteriormente, necesita la función selection_table(() para crear un cuadro de selección extendido. También debe establecer el argumento extended = TRUE (de lo contrario, la clase sería un cuadro de selección). El siguiente código convierte los datos de ejemplo en un cuadro de selección extendido:

# parametros globales
warbleR_options(wav.path = "PONER RUTA A 'ejemplos' AQUI")


ext_st <- selection_table(X = lbh_selec_table, pb = FALSE, 
          extended = TRUE, confirm.extended = FALSE)
all selections are OK 

 

Y eso es. Ahora los datos acústicos y los datos de selección (así como los metadatos adicionales) están todos juntos en un solo objeto R.

& nbsp;

Manipulación de cuadros de selección extendidos

Se pueden usar varias funciones para tratar con objetos de esta clase. Puede probar si el objeto pertenece a la extended_selection_table:

is_extended_selection_table(ext_st)
[1] TRUE

 

Puede subcontratar la selección de la misma manera que cualquier otro cuadro de datos en ella mantendrá sus atributos:

ext_st2 <- ext_st[1:2, ]

is_extended_selection_table(ext_st2)
[1] TRUE

También hay una versión genérica de print() para esta clase de objetos:

## print
print(ext_st)
object of class 'extended_selection_table' 
 contains a selection table data frame with 11 rows and 9 columns: 
       sound.files channel selec start       end bottom.freq top.freq sel.comment rec.comment
1 Phae.long1.wav_1       1     1   0.1 0.2730334    2.220105 8.604378         c24          NA
2 Phae.long1.wav_2       1     1   0.1 0.2630480    2.169437 8.807053         c25          NA
3 Phae.long1.wav_3       1     1   0.1 0.2749187    2.218294 8.756604         c26          NA
4 Phae.long2.wav_1       1     1   0.1 0.2325709    2.316862 8.822316         c27          NA
5 Phae.long2.wav_2       1     1   0.1 0.2261502    2.284006 8.888027         c28          NA
6 Phae.long3.wav_1       1     1   0.1 0.2312195    3.006834 8.822316         c29          NA
... and 5 more rows 
11 wave objects (as attributes): 
[1] "Phae.long1.wav_1" "Phae.long1.wav_2" "Phae.long1.wav_3" "Phae.long2.wav_1" "Phae.long2.wav_2"
[6] "Phae.long3.wav_1"
... and 5 more 
and a data frame (check.results) generated by checkres() (as attribute) 
the selection table was created by element (see 'class_extended_selection_table')

… lo cual es equivalente a:

ext_st
object of class 'extended_selection_table' 
 contains a selection table data frame with 11 rows and 9 columns: 
       sound.files channel selec start       end bottom.freq top.freq sel.comment rec.comment
1 Phae.long1.wav_1       1     1   0.1 0.2730334    2.220105 8.604378         c24          NA
2 Phae.long1.wav_2       1     1   0.1 0.2630480    2.169437 8.807053         c25          NA
3 Phae.long1.wav_3       1     1   0.1 0.2749187    2.218294 8.756604         c26          NA
4 Phae.long2.wav_1       1     1   0.1 0.2325709    2.316862 8.822316         c27          NA
5 Phae.long2.wav_2       1     1   0.1 0.2261502    2.284006 8.888027         c28          NA
6 Phae.long3.wav_1       1     1   0.1 0.2312195    3.006834 8.822316         c29          NA
... and 5 more rows 
11 wave objects (as attributes): 
[1] "Phae.long1.wav_1" "Phae.long1.wav_2" "Phae.long1.wav_3" "Phae.long2.wav_1" "Phae.long2.wav_2"
[6] "Phae.long3.wav_1"
... and 5 more 
and a data frame (check.results) generated by checkres() (as attribute) 
the selection table was created by element (see 'class_extended_selection_table')

 

También puedes unirlos en filas. Aquí el extended_selection_table original se divide en 2 y se enlaza nuevamente usando rbind():

ext_st3 <- ext_st[1:5, ]

ext_st4 <- ext_st[6:11, ]

ext_st5 <- rbind(ext_st3, ext_st4)

#print
ext_st5
object of class 'extended_selection_table' 
 contains a selection table data frame with 11 rows and 9 columns: 
       sound.files channel selec start       end bottom.freq top.freq sel.comment rec.comment
1 Phae.long1.wav_1       1     1   0.1 0.2730334    2.220105 8.604378         c24          NA
2 Phae.long1.wav_2       1     1   0.1 0.2630480    2.169437 8.807053         c25          NA
3 Phae.long1.wav_3       1     1   0.1 0.2749187    2.218294 8.756604         c26          NA
4 Phae.long2.wav_1       1     1   0.1 0.2325709    2.316862 8.822316         c27          NA
5 Phae.long2.wav_2       1     1   0.1 0.2261502    2.284006 8.888027         c28          NA
6 Phae.long3.wav_1       1     1   0.1 0.2312195    3.006834 8.822316         c29          NA
... and 5 more rows 
11 wave objects (as attributes): 
[1] "Phae.long1.wav_1" "Phae.long1.wav_2" "Phae.long1.wav_3" "Phae.long2.wav_1" "Phae.long2.wav_2"
[6] "Phae.long3.wav_1"
... and 5 more 
and a data frame (check.results) generated by checkres() (as attribute) 
the selection table was created by element (see 'class_extended_selection_table')
# igual q el original
all.equal(ext_st, ext_st5)
[1] TRUE

 

Los objetos ‘wave’ se pueden leer individualmente usando read_wave(), un contenedor en la función readWave() de tuneR, que puede tomar cuadros de selección extendidos:

wv1 <- read_wave(X = ext_st, index = 3, from = 0, to = 0.37)

 

Estos son objetos ‘wave’ regulares:

class(wv1)
[1] "Wave"
attr(,"package")
[1] "tuneR"
wv1

Wave Object
    Number of Samples:      8325
    Duration (seconds):     0.37
    Samplingrate (Hertz):   22500
    Channels (Mono/Stereo): Mono
    PCM (integer format):   TRUE
    Bit (8/16/24/32/64):    16 
spectro(wv1, wl = 150, grid = FALSE, scale = FALSE, ovlp = 90)

 

par(mfrow = c(3, 2), mar = rep(0, 4))

for(i in 1:6){
  
  wv <- read_wave(X = ext_st, index = i, from = 0.05, to = 0.32)

  spectro(wv, wl = 150, grid = FALSE, scale = FALSE, axisX = FALSE,
          axisY = FALSE, ovlp = 90)

}

 

La función read_wave() require el cuadro de selección, así como el índice de la selección (por ejemplo, el número de fila) para poder leer los objetos ‘wave’.

Tenga en cuenta que es probable que otras funciones que modifican marcos de datos eliminen los atributos en los que se almacenan los objetos ‘wave’ y los metadatos. Por ejemplo, la fusión y el cuadro de selección extendido eliminarán sus atributos:

# crear nueva base de datos
Y <- data.frame(sound.files = ext_st$sound.files, site = "La Selva", lek = c(rep("SUR", 5), rep("CCL", 6)))

# combinar
mrg_ext_st <- merge(ext_st, Y, by = "sound.files")

# revisar clase
is_extended_selection_table(mrg_ext_st)
[1] FALSE

 

En este caso, podemos utilizar la función fix_extended_selection_table () para transferir los atributos del cuadro de selección extendido original:

# arreglar
mrg_ext_st <- fix_extended_selection_table(X = mrg_ext_st, Y = ext_st)

# revisar clase
is_extended_selection_table(mrg_ext_st)
[1] TRUE

 

Esto funciona siempre que se conserven algunos de los archivos de sonido originales y no se agreguen otras selecciones.

& nbsp;

Tamaño del cuadro de selección

El tamaño del cuadro de selección extendido dependerá del número de selecciones, la tasa de muestreo, la duración de la selección y la duración del margen (el margen es la cantidad de tiempo adicional que desea conservar a cada lado de la selección). En este ejemplo, se crea un cuadro de datos con 1000 selecciones simplemente repitiendo el cuadro de datos de ejemplo varias veces y luego se convierte en un cuadro de selección extendido:

lng.selec.table <- do.call(rbind, replicate(100, lbh_selec_table, 
                        simplify = FALSE))[1:1000,]

lng.selec.table$selec <- 1:nrow(lng.selec.table)

nrow(lng.selec.table)

lng_ext_st <- selection_table(X = lng.selec.table, pb = FALSE, 
                        extended = TRUE, confirm.extended = FALSE)

lng_ext_st
all selections are OK 
object of class 'extended_selection_table' 
 contains a selection table data frame with 1000 rows and 9 columns: 
       sound.files channel selec start       end bottom.freq top.freq sel.comment rec.comment
1 Phae.long1.wav_1       1     1   0.1 0.2730334    2.220105 8.604378         c24          NA
2 Phae.long1.wav_2       1     1   0.1 0.2630480    2.169437 8.807053         c25          NA
3 Phae.long1.wav_3       1     1   0.1 0.2749187    2.218294 8.756604         c26          NA
4 Phae.long2.wav_4       1     1   0.1 0.2325709    2.316862 8.822316         c27          NA
5 Phae.long2.wav_5       1     1   0.1 0.2261502    2.284006 8.888027         c28          NA
6 Phae.long3.wav_6       1     1   0.1 0.2312195    3.006834 8.822316         c29          NA
... and 994 more rows 
1000 wave objects (as attributes): 
[1] "Phae.long1.wav_1" "Phae.long1.wav_2" "Phae.long1.wav_3" "Phae.long2.wav_4" "Phae.long2.wav_5"
[6] "Phae.long3.wav_6"
... and 994 more 
and a data frame (check.results) generated by checkres() (as attribute) 
the selection table was created by element (see 'class_extended_selection_table')
format(object.size(lng_ext_st), units = "auto")
[1] "31.4 Mb"

 

Como se puede ver, el tamaño del objeto es de solo ~ 31 MB. Entonces, como guía, un cuadro de selección con 1000 selecciones similares a las de ‘lbh_selec_table’ (duración media de ~ 0.15 segundos) a una tasa de muestreo de 22.5 kHz y el margen predeterminado (mar = 0.1) generará un cuadro de selección extendido de ~ 31 MB o ~ 310 MB para un cuadro de selección de 10000 filas.

 

Análisis usando cuadros de selección extendidos

Estos objetos se pueden usar como entrada para la mayoría de las funciones warbleR. Aquí hay algunos ejemplos de funciones de warbleR usando extended_selection_table:

Parámetros espectrales

#  parametros espectrales
sp <- specan(ext_st)

sp
sound.files selec top.freq bottom.freq duration meanfreq sd freq.median freq.Q25 freq.Q75 freq.IQR time.median time.Q25 time.Q75 time.IQR skew kurt sp.ent time.ent entropy sfm meandom mindom maxdom dfrange modindx startdom enddom dfslope meanpeakf
Phae.long1.wav_1 1 8.604378 2.220105 0.1730334 5.982409 1.399784 6.331716 5.296584 6.869521 1.572937 0.0798769 0.0532513 0.1198154 0.0665641 1.997847 7.021611 0.9434481 0.9493305 0.8956441 0.6510917 6.663993 5.251465 7.360840 2.109375 2.895833 7.316895 7.185059 -0.7619101 7.108806
Phae.long1.wav_2 1 8.807053 2.169437 0.1630480 5.996627 1.424418 6.212125 5.328746 6.880795 1.552049 0.0815556 0.0407778 0.1223333 0.0815556 1.922889 7.349165 0.9467605 0.9536171 0.9028469 0.6693779 6.830116 5.295410 8.283691 2.988281 2.661765 7.185059 7.229004 0.2695238 6.931635
Phae.long1.wav_3 1 8.756604 2.218294 0.1749187 6.020840 1.516065 6.428439 5.152811 6.983309 1.830498 0.0942188 0.0538393 0.1345983 0.0807590 2.488671 11.088694 0.9448412 0.9516042 0.8991149 0.6688752 6.770717 4.899902 8.371582 3.471680 3.240506 7.185059 7.185059 0.0000000 6.798757
Phae.long2.wav_1 1 8.822316 2.316862 0.1325709 6.400285 1.340337 6.595971 5.607323 7.380852 1.773529 0.0736790 0.0589432 0.1031506 0.0442074 1.576807 6.067438 0.9429749 0.9433199 0.8895270 0.6113456 6.341309 5.075684 7.404785 2.329102 2.830189 5.075684 6.657715 11.9334722 7.463147
Phae.long2.wav_2 1 8.888027 2.284006 0.1261502 6.312574 1.370680 6.602020 5.609829 7.213209 1.603380 0.0841185 0.0560790 0.0981383 0.0420593 2.471692 10.897781 0.9361034 0.9436550 0.8833586 0.6202855 6.411621 5.075684 7.580566 2.504883 2.087719 5.075684 7.580566 19.8563528 6.710171
Phae.long3.wav_1 1 8.822316 3.006834 0.1312195 6.612029 1.093231 6.670130 6.067212 7.349366 1.282153 0.0583309 0.0437481 0.1020790 0.0583309 1.773862 6.626284 0.9302604 0.9460368 0.8800605 0.5703286 6.481934 4.899902 7.009277 2.109375 1.520833 4.899902 6.965332 15.7402610 6.710171
Phae.long3.wav_2 1 8.888027 2.776843 0.1301789 6.641352 1.117488 6.674164 6.105325 7.419806 1.314481 0.0723457 0.0434074 0.1012840 0.0578765 1.552445 5.072432 0.9234823 0.9490107 0.8763946 0.5323566 6.244629 5.031738 6.701660 1.669922 1.368421 5.031738 6.613770 12.1527447 6.665879
Phae.long3.wav_3 1 9.315153 2.316862 0.1312170 6.587994 1.253397 6.654583 6.037086 7.394054 1.356967 0.0583309 0.0437481 0.1020790 0.0583309 1.804727 5.989106 0.9198633 0.9533711 0.8769711 0.5311599 6.231445 5.427246 6.833496 1.406250 1.656250 5.471191 6.657715 9.0424551 6.710171
Phae.long4.wav_1 1 9.216586 2.513997 0.1454249 6.223265 1.478895 6.236892 5.459282 7.310408 1.851126 0.0872800 0.0436400 0.1163733 0.0727333 1.250661 4.286583 0.9641781 0.9520208 0.9179176 0.7580285 6.270197 5.119629 7.844238 2.724609 2.709677 5.383301 6.262207 6.0437118 6.222951
Phae.long4.wav_2 1 10.235116 2.579708 0.1441864 6.469164 1.592056 6.334537 5.633543 7.583833 1.950290 0.0865333 0.0432667 0.1153778 0.0721111 1.697660 6.403873 0.9583776 0.9526137 0.9129636 0.7212134 6.294167 4.108887 8.151855 4.042969 2.478261 5.427246 4.108887 -9.1434347 6.222951
Phae.long4.wav_3 1 9.742279 2.579708 0.1450989 6.123725 1.543169 6.081716 5.178639 7.246754 2.068115 0.0870933 0.0435467 0.1161244 0.0725778 1.090784 4.106009 0.9643391 0.9536831 0.9196739 0.7370873 6.150346 4.943848 7.888184 2.944336 3.149254 5.339355 5.031738 -2.1200514 5.912903

 

Proporción señal-ruido

snr <- sig2noise(ext_st, mar = 0.05)

snr
sound.files channel selec start end bottom.freq top.freq sel.comment rec.comment SNR
Phae.long1.wav_1 1 1 0.1 0.2730334 2.220105 8.604378 c24 NA 21.18244
Phae.long1.wav_2 1 1 0.1 0.2630480 2.169437 8.807053 c25 NA 20.35483
Phae.long1.wav_3 1 1 0.1 0.2749187 2.218294 8.756604 c26 NA 19.16430
Phae.long2.wav_1 1 1 0.1 0.2325709 2.316862 8.822316 c27 NA 23.27315
Phae.long2.wav_2 1 1 0.1 0.2261502 2.284006 8.888027 c28 NA 26.20566
Phae.long3.wav_1 1 1 0.1 0.2312195 3.006834 8.822316 c29 NA 25.32589
Phae.long3.wav_2 1 1 0.1 0.2301789 2.776843 8.888027 c30 NA 25.50842
Phae.long3.wav_3 1 1 0.1 0.2312170 2.316862 9.315153 c31 NA 24.66928
Phae.long4.wav_1 1 1 0.1 0.2454249 2.513997 9.216586 c32 NA 27.62022
Phae.long4.wav_2 1 1 0.1 0.2441864 2.579708 10.235116 c33 NA 28.85208
Phae.long4.wav_3 1 1 0.1 0.2450989 2.579708 9.742279 c34 NA 24.29024

 

Distorsión dinámica de tiempo (DTW)

dtw.dist <- dfDTW(ext_st, img = FALSE)

dtw.dist
measuring dominant frequency contours (step 1 of 2):
measuring dominant frequency:calculating DTW distances (step 2 of 2, no progress bar):
Phae.long1.wav_1-1 Phae.long1.wav_2-1 Phae.long1.wav_3-1 Phae.long2.wav_1-1 Phae.long2.wav_2-1 Phae.long3.wav_1-1 Phae.long3.wav_2-1 Phae.long3.wav_3-1 Phae.long4.wav_1-1 Phae.long4.wav_2-1 Phae.long4.wav_3-1
Phae.long1.wav_1-1 0.000 8.631 4.343 16.633 16.611 13.813 15.675 15.516 18.661 20.886 21.527
Phae.long1.wav_2-1 8.631 0.000 6.981 22.115 29.123 16.735 22.374 23.024 15.824 16.635 19.549
Phae.long1.wav_3-1 4.343 6.981 0.000 18.252 20.535 15.206 18.451 16.468 17.262 19.147 21.057
Phae.long2.wav_1-1 16.633 22.115 18.252 0.000 12.159 10.369 11.213 12.043 12.446 13.535 15.345
Phae.long2.wav_2-1 16.611 29.123 20.535 12.159 0.000 6.762 5.341 8.698 17.521 20.599 19.272
Phae.long3.wav_1-1 13.813 16.735 15.206 10.369 6.762 0.000 3.639 4.422 13.252 15.629 15.818
Phae.long3.wav_2-1 15.675 22.374 18.451 11.213 5.341 3.639 0.000 3.644 13.655 15.946 14.627
Phae.long3.wav_3-1 15.516 23.024 16.468 12.043 8.698 4.422 3.644 0.000 11.029 13.718 12.458
Phae.long4.wav_1-1 18.661 15.824 17.262 12.446 17.521 13.252 13.655 11.029 0.000 5.381 5.686
Phae.long4.wav_2-1 20.886 16.635 19.147 13.535 20.599 15.629 15.946 13.718 5.381 0.000 6.102
Phae.long4.wav_3-1 21.527 19.549 21.057 15.345 19.272 15.818 14.627 12.458 5.686 6.102 0.000

 

Desempeño

El uso de objetos extended_selection_table puede mejorar el rendimiento (en nuestro caso, medido como tiempo). Aquí usamos microbenchmark para comparar el rendimiento de sig2noise() y ggplot2 para trazar los resultados:

# cragar paquetes
library(microbenchmark)
library(ggplot2)

# usar las primeras 100 selecciones
mbmrk.snr <- microbenchmark(extended = sig2noise(lng_ext_st[1:100, ], 
      mar = 0.05), regular = sig2noise(lng.selec.table[1:100, ], 
                    mar = 0.05), times = 50)

autoplot(mbmrk.snr) + ggtitle("sig2noise")
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

 

La función se ejecuta mucho más rápido en los cuadros de selección extendidos. Es probable que la ganancia en el rendimiento mejore cuando se utilizan grabaciones y conjuntos de datos más largos (es decir, compensar la sobrecarga informática).

Crear selecciones ‘por canto’

Los de selección ampliadas de arriba fueron hechas por elemento (by.element). Esto es, cada archivo de sonido dentro del objeto contiene una sola selección (es decir, una correspondencia 1: 1 entre las selecciones y los objetos ‘wave’). Sin embargo, los cuadros de selección extendidos también se pueden crear utilizando un nivel jerárquico superior con el argumento by.song. En este caso, “canción” representa un nivel superior que contiene una o más selecciones y que el usuario puede querer mantener juntos para algún análisis en particular (por ejemplo, la duración de los intervalos). El argumento by.song toma el nombre de la columna de caracteres o factores con los ID de las diferentes “cantos” dentro de un archivo de sonido (tenga en cuenta que la función supone que un canto determinado solo se puede encontrar en un solo archivo de sonido, por lo que las selecciones con el mismo ID de canto, pero de diferentes archivos de sonido se toma como ‘cantos’ diferentes).

Para crear un cuadro de selección por canto, agreguemos una columna de canto artificial a nuestros datos de ejemplo en el que cada uno de los archivos de sonido tiene 2 cantos:

# add column
lbh_selec_table$song <- c(1, 1, 2, 1, 2, 1, 1, 2, 1, 2, 2)

 

El cuadro de datos se ve así:

sound.files channel selec start end bottom.freq top.freq sel.comment rec.comment song
Phae.long1.wav 1 1 1.16935 1.34239 2.2201 8.6044 c24 NA 1
Phae.long1.wav 1 2 2.15841 2.32146 2.1694 8.8071 c25 NA 1
Phae.long1.wav 1 3 0.34334 0.51826 2.2183 8.7566 c26 NA 2
Phae.long2.wav 1 1 0.15960 0.29217 2.3169 8.8223 c27 NA 1
Phae.long2.wav 1 2 1.45706 1.58321 2.2840 8.8880 c28 NA 2
Phae.long3.wav 1 1 0.62655 0.75777 3.0068 8.8223 c29 NA 1
Phae.long3.wav 1 2 1.97421 2.10439 2.7768 8.8880 c30 NA 1
Phae.long3.wav 1 3 0.12336 0.25458 2.3169 9.3151 c31 NA 2
Phae.long4.wav 1 1 1.51681 1.66224 2.5140 9.2166 c32 NA 1
Phae.long4.wav 1 2 2.93269 3.07688 2.5797 10.2351 c33 NA 2
Phae.long4.wav 1 3 0.14540 0.29050 2.5797 9.7423 c34 NA 2

 

Ahora podemos crear un cuadro de selección extendido ‘por canto’ usando el nombre de la columna ‘canto’ (que en este ejemplo simple también es ‘canto’) como entrada para el argumento by.song:

bs_ext_st <- selection_table(X = lbh_selec_table, extended = TRUE,
                              confirm.extended = FALSE, by.song = "song")
checking selections (step 1 of 2):
all selections are OK 
saving wave objects into extended selection table (step 2 of 2):

En este caso, solo deberíamos tener 8 objetos ‘wave’ en lugar de 11 como cuando el objeto fue creado ‘por selección’:

# by element
length(attr(ext_st, "wave.objects"))
[1] 11
# by song
length(attr(bs_ext_st, "wave.objects"))
[1] 8

Nuevamente, estos objetos también pueden usarse en los análisis:

# proporcion señal ruido
bs_snr <- sig2noise(bs_ext_st, mar = 0.05)
sound.files channel selec start end bottom.freq top.freq sel.comment rec.comment song SNR
Phae.long1.wav-song_1 1 1 0.1000 0.27303 2.2201 8.6044 c24 NA 1 21.182
Phae.long1.wav-song_1 1 2 1.0891 1.25210 2.1694 8.8071 c25 NA 1 20.357
Phae.long1.wav-song_2 1 1 0.1000 0.27492 2.2183 8.7566 c26 NA 2 19.164
Phae.long2.wav-song_1 1 1 0.1000 0.23257 2.3169 8.8223 c27 NA 1 23.273
Phae.long2.wav-song_2 1 1 0.1000 0.22615 2.2840 8.8880 c28 NA 2 26.206
Phae.long3.wav-song_1 1 1 0.1000 0.23122 3.0068 8.8223 c29 NA 1 25.326
Phae.long3.wav-song_1 1 2 1.4477 1.57784 2.7768 8.8880 c30 NA 1 25.512
Phae.long3.wav-song_2 1 1 0.1000 0.23122 2.3169 9.3151 c31 NA 2 24.669
Phae.long4.wav-song_1 1 1 0.1000 0.24542 2.5140 9.2166 c32 NA 1 27.620
Phae.long4.wav-song_2 1 1 2.8873 3.03148 2.5797 10.2351 c33 NA 2 28.841
Phae.long4.wav-song_2 1 2 0.1000 0.24510 2.5797 9.7423 c34 NA 2 24.290

 

  • Compare el tamaño de un cuadro extendido creado por elemento al de uno creado por canto usando los datos de ejemplo

  • Cree un cuadro de selección extendido con los datos de su proyecto

 

Compartir datos acústicos

La nueva clase de objetos permite compartir conjuntos de datos completos, incluidos los datos acústicos. Por ejemplo, con el siguiente código puede descargar un subconjunto de los datos utilizados en Araya-Salas et al (2017) (también se puede descargar aquí):

URL <- "https://marceloarayasalas.weebly.com/uploads/2/5/5/2/25524573/extended.selection.table.araya-salas.et.al.2017.bioacoustics.100.sels.rds"

dat <- readRDS(gzcon(url(URL)))

nrow(dat)
[1] 100
format(object.size(dat), units = "auto")
[1] "10.1 Mb"

El tamaño total de los 100 archivos de sonido de los que se tomaron estas selecciones suma hasta 1.1 GB. El tamaño del cuadro de selección extendido es de solo 10.1 MB.

Estos datos están listos para ser utilizados:

sp <- specan(dat, bp = c(2, 10))

head(sp)
sound.files selec duration meanfreq sd freq.median freq.Q25 freq.Q75 freq.IQR time.median time.Q25 time.Q75 time.IQR skew kurt sp.ent time.ent entropy sfm meandom mindom maxdom dfrange modindx startdom enddom dfslope meanpeakf
Pyrrhura rupicola Macaulay Library 132 .wav_2 1 0.15048 4.6570 1.7692 4.2876 3.4364 5.6243 2.1879 0.06543 0.03926 0.10469 0.06543 2.6003 11.8598 0.92349 0.95082 0.87807 0.54127 3.7540 2.0241 6.8476 4.8234 5.3750 4.5220 2.0241 -16.5996 4.0208
0.CCE.1971.4.4.ITM70863A-23.wav_1 1 0.16556 6.2556 1.6484 6.3505 5.6072 7.2024 1.5952 0.08279 0.03821 0.12100 0.08279 2.3775 10.1358 0.93975 0.94103 0.88434 0.63367 6.6434 3.5745 8.2257 4.6512 3.2037 8.2257 6.9337 -7.8036 6.0961
0.SAT.1989.6.2.ITM70866A-32.wav_5 1 0.15425 6.0960 1.6472 5.8475 4.9067 7.3982 2.4915 0.08356 0.04499 0.11570 0.07070 1.9681 7.2878 0.93913 0.94322 0.88581 0.60968 6.3652 3.3161 8.1395 4.8234 3.1071 6.4169 3.3161 -20.1021 7.0473
23.CCE.2011.7.21.7.42.wav_6 1 0.15496 5.4239 1.4632 5.1832 4.4278 6.4358 2.0081 0.06458 0.03875 0.10333 0.06458 2.1063 8.0438 0.92290 0.94473 0.87189 0.50696 5.0284 2.3687 7.7950 5.4264 2.1587 7.3644 2.3687 -32.2397 4.3667
Cyanoliseus patagonus Macaulay Library 79 .wav_5 1 0.15989 3.1546 1.2261 2.5692 2.2439 3.6575 1.4136 0.06396 0.03838 0.09595 0.05757 4.5462 29.4729 0.82325 0.93564 0.77027 0.12652 2.5906 2.0241 4.4358 2.4117 3.0714 2.4548 2.2825 -1.0774 2.2913
0.HC1.2011.8.7.9.20.wav_4 1 0.15380 6.0302 1.7597 6.4163 4.9203 7.1837 2.2634 0.07692 0.04487 0.10896 0.06410 4.1566 27.8331 0.92869 0.94595 0.87849 0.60299 6.1447 4.9526 8.5702 3.6176 4.0714 5.3833 4.9526 -2.8002 4.9720

Y los espectrogramas se pueden visualizar:

par(mfrow = c(3, 2), mar = rep(0, 4))

for(i in 1:6){
  
  wv <- read_wave(X = dat, index = i, from = 0.17, to = 0.4)

  spectro(wv, wl = 250, grid = FALSE, scale = FALSE, axisX = FALSE,
          axisY = FALSE, ovlp = 90, flim = c(0, 12), 
          palette = reverse.gray.colors.1)
}

el paquete NatureSounds contiene un cuadro de selección extendido con cantos de Phaethornis longirotris de 10 tipos de canto diferentes:

data("Phae.long.est")

Phae.long.est
object of class 'extended_selection_table' 
 contains a selection table data frame with 100 rows and 8 columns: 
                    sound.files selec start     end bottom.freq top.freq lek lek.song.type
31 0.BR1.2012.7.27.5.55.wav_3-4     1   0.1 0.25771      2.3227   11.673 BR1        BR1-D1
32   0.BR1.2012.7.27.5.55.wav_1     1   0.1 0.25480      2.3680   11.718 BR1        BR1-D1
33 0.BR1.2012.7.27.5.55.wav_3-3     1   0.1 0.25556      2.5492   11.900 BR1        BR1-D1
34   0.BR1.2012.7.27.5.55.wav_4     1   0.1 0.26021      2.6398   11.990 BR1        BR1-D1
35 0.BR1.2012.7.27.5.55.wav_2-2     1   0.1 0.26156      2.2774   11.628 BR1        BR1-D1
36   0.BR1.2012.7.27.5.55.wav_3     1   0.1 0.25803      2.6398   11.990 BR1        BR1-D1
... and 94 more rows 
100 wave objects (as attributes): 
[1] "0.BR1.2012.7.27.5.55.wav_3-4" "0.BR1.2012.7.27.5.55.wav_1"   "0.BR1.2012.7.27.5.55.wav_3-3"
[4] "0.BR1.2012.7.27.5.55.wav_4"   "0.BR1.2012.7.27.5.55.wav_2-2" "0.BR1.2012.7.27.5.55.wav_3"  
... and 94 more 
and a data frame (check.results) generated by checkres() (as attribute) 
the selection table was created by element (see 'class_extended_selection_table')
table(Phae.long.est$lek.song.type)

BR1-D1 CCL-G1 CCL-K2 DAR-A1 HC2-E1 HC2-F2 SAT-G2 SJA-C3 SUR-E4 TR1-E1 
    10     10     10     10     10     10     10     10     10     10 

La capacidad de comprimir grandes conjuntos de datos y la facilidad de realizar análisis que requieren un único objeto R puede simplificar el intercambio de datos y la reproducibilidad de los análisis bioacústicos.

 

Funciones de warbleR y el flujo de análisis en bioacústica

Los análisis bioacústicos generalmente siguen una secuencia de procesamiento y análisis específica. Esta secuencia se puede representar en forma esquemática así:

flujo de analisis

 

Podemos agrupar las funciones en warbleR deacuerdo con las etapas de ánalisis bioacústico.

 

Obtener y preparar grabaciones

La función querxc() permite hacer busquedas y descargar sonidos de la base de datos de acceso libre Xeno-Canto. Además se pueden convertir archivos .mp3 a .wav, cambiar la tasa de muestreo de los archivos y corregir archivos corruptos, entre otras funciones.

Función Descripción Trabaja sobre Producto
check_wavs verifica archivos de audio pueden ser leidos múltiples archivos wave cuadro de datos
consolidate consolida archivos de audio en una sola carpeta múltiples archivos wave cuadro de datos y archivos wave
fix_wavs corrige archivos wave con errores de lectura múltiples archivos wave archivos wave
mp32wav convertir múltiples archivos mp3 a wave múltiples archivos mp3 archivos wave
quer_xc busca y descarga archivos mp3 de Xeno-Canto nombres taxonómicos/cuadros de datos archivos mp3
resample_est remuestrea objetos wave cuadro de selección ext cuadro de selección extendidas
rm_channels remueve canales múltiples archivos wave archivos wave
rm_sil remueve silencios múltiples archivos wave archivos wave
wav_dur mide la duracion de archivos wave múltiples archivos wave cuadro de datos
wav_info registra información de parámetros de grabación múltiples archivos wave cuadro de datos

 

Anotar

Se recomienda hacer anotaciones en otros programas e importarlas luego a R (por ejemplo en Raven e importarlas con el paquete Rraven). Sin embargo, warbleR ofrece algunas funciones para facilitar la anotación manual o automática de archivos de sonido, asi como la posterior manipulación:

Función Descripción Trabaja sobre Producto
manual_loc anotación manual de archivos de audio múltiples archivos wave cuadro de datos, archivo .csv
auto_detec anotación automatica de archivos de audio múltiples archivos wave cuadro de datos, imágenes
freq_range detecta rango de frecuencia múltiples archivos wave cuadro de datos
sel_tailor reajusta selecciones de forma interactiva cuadros de selección cuadros de selección

 

Organizar anotaciones

Las anotaciones (o cuadros de selección) pueden ser manipulados y refinados con una variedad de funciones. Los cuadros de selección también sepueden convertir en el formato compacto de cuadros extendidos:

Función Descripción Trabaja sobre Producto
sel_tailor reajusta selecciones de forma interactiva cuadros de selección cuadros de selección
sort_colms ordenar columnas en orden intuitivo cuadros de selección cuadros de selección
cut_sels guarda selecciones como archivos wave individuales cuadros de selección archivos wave
filter_sels filtra cuadros de selección con base en archivos de imagen cuadros de selección, cuadros de selección ext., imágenes cuadros de selección, cuadros de selección ext.
fix_extended_selection_table añade objetos wave a cuadros de seleccion cuadros de selección cuadro de selección ext.
selection_table crea cuadros de selección y cuadros de selección ext. cuadros de selección cuadros de selección, cuadros de selección ext.
song_param mide parámetros a otros niveles estructurales de las vocalizaciones cuadros de selección, cuadros de selección ext. cuadros de datos, cuadros de selección

 

Medir la estructura de señales acústicas

La mayoría de las funciones de warbleR están dedicadas a ćuantificar la estructura de señales acústicas enlistadas en cuadros de seleccion utilizando procesamiento en lotes (“batch processing”). Para esto se ofrecen 5 métodos principales de medición:

  1. Parametros espectrográficos
  2. Correlación cruzada
  3. Distorsión dinámica de tiempo (DTW)
  4. Descriptores estadísticos de los coeficientes cepstrales

La mayoria de fuciones giran alrededor de estos métodos, o variaciones de estos:

Función Descripción Trabaja sobre Producto
freq_range detecta rango de frecuencia múltiples archivos wave cuadro de datos
song_param mide parámetros a otros niveles estructurales de las vocalizaciones cuadros de selección, cuadros de selección ext. cuadros de datos, cuadros de selección
compare_methods compara desempeño de metodos para medir estructura acústica cuadros de selección, cuadros de selección ext. imágenes
dfDTW mide distorsión dinámica de tiempo (DTW) sobre contornos de frec dominante cuadros de selección, cuadros de selección ext. matriz de (di)similitud, imágenes
dfts mide contornos de frecuencia dominante cuadros de selección, cuadros de selección ext. cuadro de datos con contornos de frecuenica
ffDTW mide distorsión dinámica de tiempo (DTW) sobre contornos de frec fundamental cuadros de selección, cuadros de selección ext. matriz de (di)similitud, imágenes
ffts mide contornos de frecuencia fundamental cuadros de selección, cuadros de selección ext. cuadro de datos con contornos de frecuenica
inflections mide inflecciones en contornos de frecuencia cuadro de datos con contornos de frecuenica cuadros de datos
mfcc_stats mide descriptores estadísticos de los coeficientes cepstrales cuadros de selección, cuadros de selección ext. cuadros de datos
multi_DTW mide distorsión dinámica de tiempo (DTW) sobre múltiples contornos cuadros de selección, cuadros de selección ext. matriz de (di)similitud
sig2noise mide proporción señal-ruido cuadros de selección, cuadros de selección ext. cuadros de selección, cuadros de selección ext.
se_ts mide contornos de entropia espectral cuadros de selección, cuadros de selección ext. cuadro de datos con contornos de frecuenica
spec_an mide parámetros spectrográficos cuadros de selección, cuadros de selección ext. cuadros de datos
x_corr mide correlación-cruzada pareada cuadros de selección, cuadros de selección ext. matriz de (di)similitud

 

Verificar anotaciones

Se proveen funciones para detectar inconsistencias en los cuadros de selección o modificar cuadros de selección. El paquete también ofrece varias funciones para generar espectrogramas mostrando las anotaciones, o organizar que son organizados por las categorías de anotación. Esto permite verificar si las anotaciones coinciden con las categorias previamente definidas. Esto es particularmente importante si las anotaciones fueron generas automáticamente.

Función Descripción Trabaja sobre Producto
check_sels verifica cuadros de selecciones cuadros de selección cuadros de selección
ovlp_sels determinan selecciones que traslapan en tiempo cuadros de selección, cuadros de selección ext. cuadros de selección, cuadros de selección ext.
catalog crea catálogos de espectrogramas cuadros de selección, cuadros de selección ext. imágenes
catalog2pdf consolida catálogos en archivos .pdf imágenes imágenes
spectrograms crea imágenes de espectrogramas cuadros de selección, cuadros de selección ext. imágenes
full_spec crea imágenes de espectrogramas completos de archivos de audio múltiples archivos wave, cuadros de selección, cuadros de selección ext. imágenes
full_spec2pdf consolida espectrogramas completos en archivos .pdf imágenes imágenes

 

Inspeccionar visualmente anotaciones y mediciones

Función Descripción Trabaja sobre Producto
snr_specs crea imágenes de espectrogramas con areas dondese mide proporción señal-ruido cuadros de selección, cuadros de selección ext. imágenes
spectrograms crea imágenes de espectrogramas cuadros de selección, cuadros de selección ext. imágenes
track_freqs crea imágenes con contornos de frecuencia graficados sobre espectrogramas cuadros de selección, cuadros de selección ext. imágenes
coor_graph gráfica duetos esquemáticamente cuadros de datos imágenes
full_spec crea imágenes de espectrogramas completos de archivos de audio múltiples archivos wave, cuadros de selección, cuadros de selección ext. imágenes
xcorr_graph gráfica resultados de correlación-cruzada pareada resultado de x_corr imágenes

 

Funciones adicionales

Por último, warbleR ofrece funciones para simplificar el uso de cuadros de selección extendidos, para organizar gran cantidad de imagenes con espectrogramas y generar visualizaciones complejas con espectrogramas:

Función Descripción Trabaja sobre Producto
is_extended_selection_table revisa si objeto es un cuadro de selección ext. cuadros de datos TRUE/FALSE
is_selection_table revisa si objeto es un cuadro de selección cuadros de datos TRUE/FALSE
catalog2pdf consolida catálogos en archivos .pdf imágenes imágenes
move_imgs mueve archivos de imágenes entre carpetas imágenes imágenes
track_harm mide contornos de frecuencia de armónico con mayor energía objeto wave cuadro de datos con contornos de frecuenica
xc_maps produce mapas con localidad de grabaciones de Xeno-Canto cuadros de datos imágenes
coor_test prueba la significancia estadística de el patrón de coordinación en duetos cuadros de datos cuadros de datos
full_spec2pdf consolida espectrogramas completos en archivos .pdf imágenes imágenes
color_spectro colorea señales en un espectrograma objeto wave imagen en R
freq_range_detec detecta rango de frecuencia objeto wave cuadro de datos, imagen en R
open_wd abre carpeta de trabajo
phylo_spectro crea arboles filogenéticos con imágenes de espectrogramas cuadros de selección imagen en R
read_wave lee archivos u objetos wave cuadros de selección, cuadros de selección ext. objeto wave
sim_songs simula cantos objeto wave, archivo wave y cuadro de selección
spec_param produce mosaico de espetrogramas con diferentes parámetros de visualización cuadros de selección, cuadros de selección ext. imágenes
warbleR_options define parámetros globales para funciones de warbleR

 

  • Corra los ejemplos de las funciones phylo_spectro() y color_spectro()

  • Utilice las funciones querxc() y xcmaps() para explorar la distribución geográfica de las grabaciones en Xeno-Canto de una especie (de ave) de su interés

 


Referencias

  1. Araya-Salas M, G Smith-vidaurre & M Webster. 2017. Assessing the effect of sound file compression and background noise on measures of acoustic signal structure. Bioacoustics 4622, 1–17
  2. Araya-Salas M, Smith-Vidaurre G (2017) warbleR: An R package to streamline analysis of animal acoustic signals. Methods Ecol Evol 8:184–191.

 


Información de la sesión

R version 3.5.3 (2019-03-11)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.2 LTS

Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=es_CR.UTF-8       
 [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=es_CR.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=es_CR.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=es_CR.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ggplot2_3.1.1        microbenchmark_1.4-6 kableExtra_1.1.0     knitr_1.22          
[5] warbleR_1.1.16       NatureSounds_1.0.1   seewave_2.1.3        tuneR_1.3.3         
[9] maps_3.3.0          

loaded via a namespace (and not attached):
 [1] tidyselect_0.2.5  xfun_0.6          purrr_0.3.2       pbapply_1.4-0     colorspace_1.4-1 
 [6] htmltools_0.3.6   viridisLite_0.3.0 yaml_2.2.0        rlang_0.3.4       pracma_2.2.5     
[11] pillar_1.3.1      withr_2.1.2       glue_1.3.1        jpeg_0.1-8        plyr_1.8.4       
[16] stringr_1.4.0     munsell_0.5.0     gtable_0.3.0      rvest_0.3.3       evaluate_0.13    
[21] fftw_1.0-5        parallel_3.5.3    highr_0.8         Rcpp_1.0.1        readr_1.3.1      
[26] scales_1.0.0      webshot_0.5.1     soundgen_1.4.0    Sim.DiffProc_4.3  Deriv_3.8.5      
[31] rjson_0.2.20      hms_0.4.2         digest_0.6.18     stringi_1.4.3     dplyr_0.8.0.1    
[36] dtw_1.20-1        grid_3.5.3        tools_3.5.3       bitops_1.0-6      magrittr_1.5     
[41] RCurl_1.95-4.12   lazyeval_0.2.2    proxy_0.4-23      tibble_2.1.1      crayon_1.3.4     
[46] pkgconfig_2.0.2   MASS_7.3-51.1     xml2_1.2.0        assertthat_0.2.1  rmarkdown_1.12   
[51] httr_1.4.0        rstudioapi_0.10   iterators_1.0.10  R6_2.4.0          signal_0.7-6     
[56] compiler_3.5.3