Monitoreo acústico de aves

Al final de la pandemia en 2023, y como parte de mi entusiasmo del proceso de aprendizaje en métodos de monitoreo acústico que surgió con el proyecto Monitoreo de Biodiversidad en destinos de turismo de naturaleza de Awake Travel, me embarque en el proyecto de construir mi propio sistema de monitoreo acústico de aves con un BirdNET-Pi, siguiendo el tutorial de Core Electronics.

El aparato

Aprovechando una de las promociones de sigma electronica, adquiri un Raspberry Pi 3 Modelo A+ a muy buen precio, junto con un microfono USB.

Siguiendo el tutorial, el montaje y la instalación del BirdNET-Pi fue muy sencilla!

image

En un comienzo lo instale en la ventana de mi apartamento, pero muy pronto me di cuenta que solo estaba registrando a la gente, los perros y los carros, ya que la ventana daba a la parte interna y el parqueadero de los edificios. Así que decidí moverlo a la ventana del apartamento de mis suegros, que da hacia la parte exterior de los mismos edificios en Cajica, donde hay algunos potreros con vacas y cercas de pinos. Con esta nueva localización el dispositivo quedo registrado como la estación 754 en birdweather. Luego de un poco más de un año funcionando continuamente decidí recoger el aparato para reutilizar el Raspberry pi en otro proyecto.

Junto con la instalación del BirdNET-Pi me di a la tarea de crear una cuenta en twitter llamada BirdNET Pi Cajica, para registrar las detecciones de forma automática, pero desafortunadamente, con la compra de twitter y su conversión a X, las políticas de las API para crear cuentas automatizadas cambiaron y la cuenta quedo desactivada luego de unos pocos meses de creada.

Teniendo en cuenta que los datos habían sido almacenados por birdweather me di a la tarea de recuperarlos usando las API de birdweather. Con esto he aprendido sobre APIs y he logrado recuper los registros más comunes con un código muy sencillo. Acá se muestran los registros de las 15 especies más comunes con su nombre en español.

### R API to birdweather
library(httr)
library(jsonlite)
library(tidyverse)
library(kableExtra)

# 1st request. Ask who is
res = GET("https://app.birdweather.com/api/v1/stations/{API-KEYword-del-dispositivo}/species?period=all&locale=es")
res # to see 200 is success 

# from Jsaon convert to list
data = fromJSON(rawToChar(res$content))
names(data)

View(data$species)
names (data$species)

# make table with thumb
tbl_img <- data.frame(
  Common_name =c(data$species$commonName[1:15]),
  Scientific_name = c(data$species$scientificName[1:15]),
  Image = ""
)

# make a table
tbl_img  %>% kbl(booktabs = T) %>%
  kable_paper(full_width = F) %>%
  column_spec(1, color = "white",bold=T,
              background = c(data$species$color[1:15])) %>% 
  column_spec(2, #color = "white",
              italic =T,
              link=data$species$imageUrl[1:15]) %>% 
  column_spec(3, image = spec_image(
    c(data$species$thumbnailUrl[1:15]), 100, 100)) 


Extrayendo mas detalles de una especie

Para obtener más datos de una especie se puede usar el Get detections que acoplado a los paquetes de R httr y jsonlite, hacen que el manejo de la API dsde R sea muy fácil.

Para este ejemplo extraeremos las detecciones del mes de Marzo del 2023 y usando la magia del paquete camtrapR vamos a obtener una gráfica del patrón de actividad de ese mes.

library(httr)
library(jsonlite)
library(tidyverse)
library(camtrapR)

#  get turdus detections and select a few columns
turdus_mar <- GET("https://app.birdweather.com/api/v1/stations/{API-KEYword-del-dispositivo}/detections?from=2023-03-01&to=2023-03-31&speciesId=422&locale=es")
turdus_mar_data = fromJSON(rawToChar(turdus_mar$content))
turdus_mar_detections <- as.data.frame(turdus_mar_data$detections)|> 
  dplyr::select(c(id, timestamp, confidence, probability, score, certainty)) |> 
   mutate(Species="Turdus fuscater")

# fix datetime stamp
turdus_mar_detections$DateTime <- str_replace(turdus_mar_detections$timestamp, "T", " ") |> 
  str_sub(start=1,end=19) |> strptime ("%Y-%m-%d %H:%M:%S")

########### Activity Plot
activityDensity (recordTable = turdus_mar_detections,
                 species     = "Turdus fuscater",
                 recordDateTimeCol="DateTime") 
rect(0, 0, 6, 0.9, col= rgb(0.211,0.211,0.211, alpha=0.2), border = "transparent")
rect(18, 0, 24, 0.9, col= rgb(0.211,0.211,0.211, alpha=0.2), border = "transparent")

Patrón de Actividad de Turdus fuscater

Es una lástima que las detecciones tengan un límite de 100 registros. Tal vez para hacerlo más detallado habría que bajar los datos diariamente.

El entusiasmo con el monitoreo acústico no ha parado. Recientemente instale un dispositivo igualito en la casa de mis padres en Cúcuta. Pero esta vez usando el nuevo código de BirdNet implementado en GO. Si bien tiene menos “features” y no viene con apraise, me parece que funciona bastante bien, siendo ligero y eficiente.

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Leave a comment