Quality checks for recordings and annotations

Published

October 9, 2025

 

Objetive

  • Provide tools for double-checking the quality of the acoustic data and measures

 

 

When working with sound files obtained from various sources it is common to have variation in recording formats and parameters or even find corrupt files. Similarly, when a large number of annotations are used, it is normal to find errors in some of them. These problems may prevent the use of acoustic analysis in warbleR. Luckily, the package also offers functions to facilitate the detection and correction of errors in sound files and annotations.

1 Organize acoustic data

1.1 Consolidate files

The consolidate() function allows you to copy all the sound files in a specified format (e.g. ‘.wav’) from subdirectories into a single directory. This is useful when you have sound files in different folders and want to analyze them together using warbleR. The function creates a new folder called ‘consolidated_files’ in the working directory and copies all the files with the specified extension into it. Let’s see how it works with the example files in the ‘./examples’ folder:

Code
# load warbleR
library(warbleR)

# consolidate .wav files
consolidated_files <- consolidate(file.ext = ".wav")

# print output data frame
head(consolidated_files)
original_dir old_name new_name file_size_bytes duplicate
/home/marce/Dropbox/courses_and_workshops/Bioacoustics/PRSTATS_BR_2025/examples/inquiry 1_ch1-1.wav 1_ch1-1.wav 8530218 NA
/home/marce/Dropbox/courses_and_workshops/Bioacoustics/PRSTATS_BR_2025/examples/inquiry 1_ch1.wav 1_ch1.wav 8800218 NA
/home/marce/Dropbox/courses_and_workshops/Bioacoustics/PRSTATS_BR_2025/examples/inquiry 1_ch2-1.wav 1_ch2-1.wav 8530218 NA
/home/marce/Dropbox/courses_and_workshops/Bioacoustics/PRSTATS_BR_2025/examples/inquiry 1_ch2.wav 1_ch2.wav 8800218 NA
/home/marce/Dropbox/courses_and_workshops/Bioacoustics/PRSTATS_BR_2025/examples/inquiry 1_ch3-1.wav 1_ch3-1.wav 8530218 NA
/home/marce/Dropbox/courses_and_workshops/Bioacoustics/PRSTATS_BR_2025/examples/inquiry 1_ch3.wav 1_ch3.wav 8800218 NA

The output is a data frame with the original paths and the original and new file names. Note that if there are files with the same name in different folders, the function adds a number to the end of the file name to avoid overwriting. It also labels possible duplicates in the output data frame.

2 Homogenize recording format

2.1 Convert .mp3 to .wav

The mp32wav() function allows you to convert files in ‘.mp3’ format to ‘.wav’ format. This function converts all the ‘mp3’ files in the working directory. Let’s use the files in the ‘./examples/mp3’ folder as an example. This are the ‘mp3’ files in that folder:

Code
list.files(path = "./examples/mp3", pattern = "mp3$")
[1] "BlackCappedVireo.mp3" "BowheadWhaleSong.mp3" "CanyonWren.mp3"      

We can convert them to ‘.wav’ format like this:

Code
mp32wav(path = "./examples/mp3", dest.path = "./examples/mp3")

list.files(path = "./examples/mp3", pattern = "mp3$|wav$")
[1] "BlackCappedVireo.mp3" "BlackCappedVireo.wav" "BowheadWhaleSong.mp3"
[4] "BowheadWhaleSong.wav" "CanyonWren.mp3"       "CanyonWren.wav"      

 

We can also modify the sampling rate and/or dynamic range with mp32wav():

Code
mp32wav(
  path = "./examples/mp3",
  samp.rate = 48,
  bit.depth = 24,
  overwrite = TRUE,
  dest.path = "./examples/mp3"
)

list.files(path = "./examples/mp3")

 

We can check the properties of the sound files using the info_sound_files() function:

Code
info_sound_files(path = "./examples/mp3")
sound.files duration sample.rate channels bits wav.size samples
BlackCappedVireo.mp3 5.459592 22.05 1 16 0.087770 120384
BlackCappedVireo.wav 5.459592 22.05 1 16 0.240812 120384
BowheadWhaleSong.mp3 86.648163 22.05 1 16 1.386787 1910592
BowheadWhaleSong.wav 86.648163 22.05 1 16 3.821228 1910592
CanyonWren.mp3 5.433469 44.10 1 16 0.087352 239616
CanyonWren.wav 5.433469 44.10 1 16 0.479276 239616

2.2 Homogenize .wav files

Alternatively, we can use the fix_wavs() function to homogenize the sampling rate, the dynamic interval and the number of channels. It is adviced that all sound files should have the same recording format settings before any acoustic analysis. In the example ‘.mp3’ files, not all of them have been recorded with the same settings:

Code
info_sound_files(path = "./examples/mp3")
sound.files duration sample.rate channels bits wav.size samples
BlackCappedVireo.mp3 5.459592 22.05 1 16 0.087770 120384
BlackCappedVireo.wav 5.459592 22.05 1 16 0.240812 120384
BowheadWhaleSong.mp3 86.648163 22.05 1 16 1.386787 1910592
BowheadWhaleSong.wav 86.648163 22.05 1 16 3.821228 1910592
CanyonWren.mp3 5.433469 44.10 1 16 0.087352 239616
CanyonWren.wav 5.433469 44.10 1 16 0.479276 239616

 

The fix_wavs() function will convert all files to the same sampling rate and dynamic range:

Code
fix_wavs(path = "./examples/mp3",
         samp.rate = 44.1,
         bit.depth = 24)

info_sound_files(path = "./examples/mp3/converted_sound_files")
sound.files duration sample.rate channels bits wav.size samples
BlackCappedVireo.wav 5.459592 44.1 1 24 0.722348 240768
BowheadWhaleSong.wav 86.648163 44.1 1 24 11.463596 3821184
CanyonWren.wav 5.433469 44.1 1 24 0.718892 239616

Another useful function to check file properties is duration_sound_files(). This function returns the duration in seconds of each ‘.wav’ file.

Code
duration_sound_files(path = "./examples/mp3/converted_sound_files/")
sound.files duration
BlackCappedVireo.wav 5.459592
BowheadWhaleSong.wav 86.648163
CanyonWren.wav 5.433469

2.3 Homogenize extended selection tables

The resample_est()` function allows you to homogenize sampling rate and dynamic range of an extended selection table. This is useful when the selection table contains selections from recordings with different sampling rates or dynamic ranges. Let’s see how it works with the example ‘lbh.ext’ selection table. First check the sampling rates and bit depths of the acoustic data in the selection table:

Code
data("lbh.est")

# check sampling rates and bit depths
unique(attributes(lbh.est)$check.res$sample.rate)
[1] 22.05
Code
unique(attributes(lbh.est)$check.res$bits)
[1] "8"

Now let’s resample the recordings to a sampling rate of 11.025 kHz and a bit depth of 24:

Code
lbh.est_resamp <- resample_est(
  X = lbh.est,
  samp.rate = 11.025,
  bit.depth = 24
)

# check sampling rates and bit depths again
unique(attributes(lbh.est_resamp)$check.res$sample.rate)
[1] 11.025
Code
unique(attributes(lbh.est_resamp)$check.res$bits)
[1] "24"

3 Check recordings

check_sound_files() should be the first function that should be used before running any warbleR analysis. The function simply checks if the sound files in ‘.wav’ format in the working directory can be read in R. For example, the following code checks all the files in the ‘examples’ folder, which should detect the ‘corrupted_file.wav’:

Code
check_sound_files(path = "./examples")
All files can be read
Not all sound files have the same sampling rate (potentially problematic, particularly for cross_correlation())

Let’s see how it works when we simulate a corrupted file:

Code
# save text file as wave file
writeLines("This is not a wave file", con = "./examples/corrupted_file.wav")

# check again
checks <- check_sound_files(path = "./examples")

checks
sound.files samp.rate result
bit24.wav 44100 can be read
bit64.wav 44100 can be read
bit8.wav 44100 can be read
corrupted_file.wav NA cannot be read
downsmp.wav 11250 can be read
LBH.374.SUR.wav 44100 can be read
Phae.long1.flac 22050 can be read
Phae.long1.mp3 22050 can be read
Phae.long1.wav 22500 can be read
Phae.long2.wav 22500 can be read
Phae.long3.wav 22500 can be read
Phae.long4.wav 22500 can be read
Phaethornis-eurynome-15607.wav 44100 can be read
Phaethornis-squalidus-555876.mp3 48000 can be read
Phaethornis-striigularis-154074.mp3 44100 can be read
Phaethornis-striigularis-518510.mp3 48000 can be read
Phaethornis-striigularis-537364.mp3 44100 can be read
recording_20170716_230503.wac 384000 can be read
song.dynrang.wav 44100 can be read
song.dynrang24.wav 44100 can be read
test.wav 11025 can be read

 

4 Optimizing spectrograms

The parameters that determine the appearance of spectrograms (and power spectra and periodgrams) also have an effect on the measurements taken on them. Therefore it is necessary to use the same parameters to analyze all the signals in a project (except with some exceptions) so that the measurements are comparable. The visualization of spectrograms generated with different spectrographic parameters is a useful way of defining the combination of parameters with which the structure of the signals is distinguished in more detail. The function tweak_spectro() aims to simplify the selection of parameters through the display of spectrograms. The function plots, for a single selection, a mosaic of spectrograms with different display parameters. For numerical arguments, the upper and lower limits of a range can be provided. The following parameters may have variable values:

  • wl: window length (numerical range)
  • ovlp: overlap (numerical range)
  • collev.min: minimum amplitude value for color levels (numerical range)
  • wn: window function name (character)
  • pal: palette (character)

The following code generates an image with spectrograms that vary in window size and window function (the rest of the parameters are passed to the catalog () function internally to create the mosaic):

Code
tweak_spectro(
  X = lbh_selec_table,
  wl = c(100, 1000),
  wn = c("hanning", "hamming", "rectangle"),
  length.out = 16,
  nrow = 8,
  ncol = 6,
  width = 15,
  height = 20,
  rm.axes = TRUE,
  cex = 1,
  box = F
)

viewSpec

 

Note that the length.out argument defines the number of values to interpolate within the numerical ranges. wl = 220 seems to produce clearer spectrograms.

We can add a color palette to differentiate the levels of one of the parameters, for example ‘wn’:

Code
#install.packages("RColorBrewer")

library(RColorBrewer)

# create palette
cmc <- function(n)
  if (n > 5)
    rep(adjustcolor(brewer.pal(5, "Spectral"), 
                    alpha.f = 0.6), ceiling(n /4))[1:n]
else
  adjustcolor(brewer.pal(n, "Spectral"), alpha.f = 0.6)

tweak_spectro(
  X = lbh_selec_table,
  wl = c(100, 1000),
  wn = c("hanning", "hamming", "rectangle"),
  length.out = 16,
  nrow = 8,
  ncol = 6,
  width = 15,
  height = 20,
  rm.axes = TRUE,
  cex = 1,
  box = F,
  group.tag = "wn",
  tag.pal = list(cmc)
)

viewSpec

 

We can also use it to choose the color palette and the minimum amplitude for plotting (‘collev.min’):

Code
tweak_spectro(
  X = lbh_selec_table,
  wl = 220,
  collev.min = c(-20, -100),
  pal = c(
    "reverse.gray.colors.2",
    "reverse.topo.colors",
    "reverse.terrain.colors"
  ),
  length.out = 16,
  nrow = 8,
  ncol = 6,
  width = 15,
  height = 20,
  rm.axes = TRUE,
  cex = 1,
  box = F,
  group.tag = "pal",
  tag.pal = list(cmc)
)

viewSpec

Exercise

The file iniquiry_calls.RDS (in ./examples) contains an extended selection table of inquiry calls of Spix’s disc-winged bats (Thyroptera tricolor). This is a Neotropical species that uses a specific call type to locate social mates in their roosts. We can read this file like this:

Code
inq <- readRDS(file = "./examples/iniquiry_calls.RDS")
  • Using the ‘inq’ data, find the best window length (‘wl’) to visualize the inquiry calls using tweak_spectro() (keep in mind this are ultrasonic signals)

  • Try 3 color palettes from the package ‘viridis’ to visualize the spectrograms (you will need to install and load the package) while also testing different collev.min values.

5 Double-check selections

The main function to double-check selection tables is check_sels(). This function checks a large number of possible errors in the selection information:

  • ‘X’ is an object of the class ‘data.frame’ or ‘selection_table’ (see selection_table) and contains the columns required to be used in any warbleR function (‘sound.files’, ‘selec’, ‘start’ , ‘end’, if it does not return an error)
  • ‘sound.files’ in ‘X’ corresponds to the .wav files in the working directory or in the provided ‘path’ (if no file is found it returns an error, if some files are not found it returns error information in the output data frame)
  • the time (‘start’, ‘end’) and frequency limits (‘bottom.freq’, ‘top.freq’, if provided) are numeric and do not contain NA (if they do not return an error)
  • There are no duplicate selection tags (‘selec’) within a sound file (if it does not return an error)
  • The start and end time of the selections is within the duration of the sound files (error information in the output data frame)
  • Sound files can be read (error information in the output data frame)
  • The header of the sound files is not damaged (only if the header = TRUE, error information in the selection table with results)
  • ‘top.freq’ is less than half of the sampling frequency (nyquist frequency, error information in the data table with results)
  • Negative values are not found in the time or frequency limits (error information in the data table with results)
  • ‘start’ higher than ‘end’ or ‘bottom.freq’ higher than ‘top.freq’ (error information in the output data frame)
  • The value of ‘channel’ is not greater than the number of channels in the sound files (error information in the output data frame)
Code
cs <- check_sels(lbh_selec_table)

 

The function returns a data frame that includes the information in ‘X’ plus additional columns about the format of the sound files, as well as the result of the checks (column ‘check.res’):

Code
cs
sound.files channel selec start end bottom.freq top.freq check.res duration min.n.samples sample.rate channels bits sound.file.samples
Phae.long1.wav 1 1 1.1693549 1.3423884 2.220105 8.604378 OK 0.1730334 3893 22.5 1 16 56251
Phae.long1.wav 1 2 2.1584085 2.3214565 2.169437 8.807053 OK 0.1630480 3668 22.5 1 16 56251
Phae.long1.wav 1 3 0.3433366 0.5182553 2.218294 8.756604 OK 0.1749187 3935 22.5 1 16 56251
Phae.long2.wav 1 1 0.1595983 0.2921692 2.316862 8.822316 OK 0.1325709 2982 22.5 1 16 38251
Phae.long2.wav 1 2 1.4570585 1.5832087 2.284006 8.888027 OK 0.1261502 2838 22.5 1 16 38251
Phae.long3.wav 1 1 0.6265520 0.7577715 3.006834 8.822316 OK 0.1312195 2952 22.5 1 16 49500
Phae.long3.wav 1 2 1.9742132 2.1043921 2.776843 8.888027 OK 0.1301789 2929 22.5 1 16 49500
Phae.long3.wav 1 3 0.1233643 0.2545812 2.316862 9.315153 OK 0.1312170 2952 22.5 1 16 49500
Phae.long4.wav 1 1 1.5168116 1.6622365 2.513997 9.216586 OK 0.1454249 3272 22.5 1 16 72000
Phae.long4.wav 1 2 2.9326920 3.0768784 2.579708 10.235116 OK 0.1441864 3244 22.5 1 16 72000
Phae.long4.wav 1 3 0.1453977 0.2904966 2.579708 9.742279 OK 0.1450989 3264 22.5 1 16 72000

Let’s modified a selection table to see how the function works:

Code
# copiar las primeras 6 filas
st2 <- lbh_selec_table[1:6, ]

# hacer caracter 
st2$sound.files <- as.character(st2$sound.files)

# cambiar nombre de archivo de sonido en sel 1
st2$sound.files[1] <- "aaa.wav"

# modificar fin en sel 3
st2$end[3] <- 100

# hacer top.freq igual q bottom freq en sel 3
st2$top.freq[3] <- st2$bottom.freq[3]

# modificar top freq en sel 5
st2$top.freq[5] <- 200

# modificar channes en sel 6
st2$channel[6] <- 3

#revisar
cs <- check_sels(st2)

cs[, c(1:7, 10)]
sound.files channel selec start end bottom.freq top.freq min.n.samples
aaa.wav 1 1 1.1693549 1.3423884 2.220105 8.604378 NA
Phae.long1.wav 1 2 2.1584085 2.3214565 2.169437 8.807053 3668
Phae.long1.wav 1 3 0.3433366 100.0000000 2.218294 2.218294 2242274
Phae.long2.wav 1 1 0.1595983 0.2921692 2.316862 8.822316 2982
Phae.long2.wav 1 2 1.4570585 1.5832087 2.284006 200.000000 2838
Phae.long3.wav 1 1 0.6265520 0.7577715 3.006834 8.822316 2952

 

check_sels() is used internally when creating selection tables and extended selection tables.

 

5.0.1 Visual inspection of spectrograms

Once the information in the selections has been verified, the next step is to ensure that the selections contain accurate information about the location of the signals of interest. This can be done by creating spectrograms of all selections. For this we have several options. The first is spectrograms() (previously called specreator()) which generates (by default) a spectrogram for each selection. We can run it on the sample data like this:

Code
# using default parameters tweak_spectro()
warbleR_options(
  wav.path = "./examples",
  wl = 220,
  wn = "hanning",
  ovlp = 90,
  pal = reverse.topo.colors
)

spectrograms(lbh_selec_table, collevels = seq(-100, 0, 5))

The images it produces are saved in the working directory and look like this:

viewSpec

 

Exercise

 

  • Have the label shown on the selection display the data in the ‘sel.comment’ column of the sample selection box using the sel.labels argument

 

5.0.2 Full spectrograms

We can create spectrograms for the whole sound files using full_spectrograms(). If the X argument is not given, the function will create the spectrograms for all the files in the working directory. Otherwise, the function generates spectrograms for sound files in X and highlights selections with transparent rectangles similar to those ofspectrograms(). In this example we download a recording from a striped-throated hermit (Phaethornis striigularis) from Xeno-Canto:

Code
# load package with color palettes
library(viridis)

# create directory
dir.create("./examples/hermit")

# download sound file
phae.stri <- query_xc(qword = "nr:154074",
                      download = TRUE,
                      path = "./examples/hermit")

# Convert mp3 to wav format
mp32wav(path = "./examples/hermit/", pb = FALSE)

# plot full spec
full_spectrograms(
  sxrow = 1,
  rows = 10,
  pal = magma,
  wl = 200,
  flim = c(3, 10),
  collevels = seq(-140, 0, 5),
  path = "./examples/hermit/"
)

hermit

 

5.1 Catalogs

Catalogs allow you to inspect selections of many recordings in the same image and group them by categories. This makes it easier to verify the consistency of the categories. Many of the arguments are shared with tweak_spectro() (catalog() is used internally in tweak_spectro()). We can generate a catalog with color tags to identify selections from the same sound file as follows:

Code
# read bat inquiry data
inq <- readRDS(file = "iniquiry_calls.RDS")

catalog(
  X = inq[1:100, ],
  flim = c(10, 50),
  nrow = 10,
  ncol = 10,
  same.time.scale = T,
  mar = 0.01,
  gr = FALSE,
  img.suffix = "inquiry",
  labels = c("sound.files", "selec"),
  legend = 0,
  rm.axes = TRUE,
  box = F,
  group.tag = "sound.files",
  tag.pal = list(magma),
  width = 20,
  height = 20,
  pal = viridis,
  collevels = seq(-100, 0, 5)
)

viewSpec

 

Exercise

  - Modify the previous code of catalog() to create a catalog with 5 rows and 20 columns, using the ‘wl’ value and color palette that you considered best when using tweak_spectro() with the ‘inq’ data.

  • Using the ‘lbh_selec_table’ data, create a catalog with selections color-tagged by song type

 

5.2 Tailoring selections

The position of the selections in the sound file (i.e. its ‘coordinates’ of time and frequency) can be modified interactively from R using the sel_tailor() function. This function produces a graphic window showing spectrograms and a series of ‘buttons’ that allow you to modify the view and move forward in the selection table:

Code
tailor_sels(X = lbh_selec_table[1:4, ], auto.next = TRUE)

seltailor autonext

 

The function returns the corrected data as a data frame in R and also saves a ‘.csv’ file in the directory where the sound files are located.

sel_tailor() can also be used to modify frequency contours such as those produced by the dfDTW() or ffDTW() function:

Code
cntours <- freq_ts(X = lbh_selec_table[1:5, ])

tail.cntours <- tailor_sels(X = lbh_selec_table[1:5, ],
                            ts.df = cntours,
                            auto.contour = TRUE)

seltailor autonext

 


5.3 References

  1. Araya-Salas M, Smith-Vidaurre G (2017) warbleR: An R package to streamline analysis of animal acoustic signals. Methods Ecol Evol 8:184–191.

 


Session information

Click to see
─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.3.2 (2023-10-31)
 os       Ubuntu 22.04.2 LTS
 system   x86_64, linux-gnu
 ui       X11
 language es_ES:en
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       America/Costa_Rica
 date     2025-10-09
 pandoc   3.1.11 @ /usr/lib/rstudio/resources/app/bin/quarto/bin/tools/x86_64/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 package      * version   date (UTC) lib source
 bioacoustics   0.2.8     2022-02-08 [1] CRAN (R 4.3.2)
 bitops         1.0-9     2024-10-03 [1] CRAN (R 4.3.2)
 brio           1.1.5     2024-04-24 [1] CRAN (R 4.3.2)
 cachem         1.1.0     2024-05-16 [1] CRAN (R 4.3.2)
 cli            3.6.5     2025-04-23 [1] CRAN (R 4.3.2)
 curl           7.0.0     2025-08-19 [1] CRAN (R 4.3.2)
 devtools       2.4.5     2022-10-11 [1] CRAN (R 4.3.2)
 digest         0.6.37    2024-08-19 [1] CRAN (R 4.3.2)
 dtw            1.23-1    2022-09-19 [1] CRAN (R 4.3.2)
 ellipsis       0.3.2     2021-04-29 [3] CRAN (R 4.1.1)
 evaluate       1.0.5     2025-08-27 [1] CRAN (R 4.3.2)
 farver         2.1.2     2024-05-13 [1] CRAN (R 4.3.2)
 fastmap        1.2.0     2024-05-15 [1] CRAN (R 4.3.2)
 fftw           1.0-9     2024-09-20 [1] CRAN (R 4.3.2)
 fs             1.6.6     2025-04-12 [1] CRAN (R 4.3.2)
 glue           1.8.0     2024-09-30 [1] CRAN (R 4.3.2)
 htmltools      0.5.8.1   2024-04-04 [1] CRAN (R 4.3.2)
 htmlwidgets    1.6.4     2023-12-06 [1] CRAN (R 4.3.2)
 httpuv         1.6.13    2023-12-06 [1] CRAN (R 4.3.2)
 httr           1.4.7     2023-08-15 [1] CRAN (R 4.3.2)
 jsonlite       2.0.0     2025-03-27 [1] CRAN (R 4.3.2)
 kableExtra   * 1.4.0     2024-01-24 [1] CRAN (R 4.3.2)
 knitr        * 1.50      2025-03-16 [1] CRAN (R 4.3.2)
 later          1.3.2     2023-12-06 [1] CRAN (R 4.3.2)
 lifecycle      1.0.4     2023-11-07 [1] CRAN (R 4.3.2)
 magrittr       2.0.4     2025-09-12 [1] CRAN (R 4.3.2)
 MASS           7.3-55    2022-01-13 [4] CRAN (R 4.1.2)
 memoise        2.0.1     2021-11-26 [3] CRAN (R 4.1.2)
 mime           0.13      2025-03-17 [1] CRAN (R 4.3.2)
 miniUI         0.1.1.1   2018-05-18 [3] CRAN (R 4.0.1)
 moments        0.14.1    2022-05-02 [1] CRAN (R 4.3.2)
 NatureSounds * 1.0.5     2025-01-17 [1] CRAN (R 4.3.2)
 pbapply        1.7-4     2025-07-20 [1] CRAN (R 4.3.2)
 pkgbuild       1.4.8     2025-05-26 [1] CRAN (R 4.3.2)
 pkgload        1.4.0     2024-06-28 [1] CRAN (R 4.3.2)
 profvis        0.3.8     2023-05-02 [1] CRAN (R 4.3.2)
 promises       1.2.1     2023-08-10 [1] CRAN (R 4.3.2)
 proxy          0.4-27    2022-06-09 [1] CRAN (R 4.3.2)
 purrr          1.1.0     2025-07-10 [1] CRAN (R 4.3.2)
 R6             2.6.1     2025-02-15 [1] CRAN (R 4.3.2)
 RColorBrewer   1.1-3     2022-04-03 [1] CRAN (R 4.3.2)
 Rcpp           1.1.0     2025-07-02 [1] CRAN (R 4.3.2)
 RCurl          1.98-1.17 2025-03-22 [1] CRAN (R 4.3.2)
 remotes        2.5.0     2024-03-17 [1] CRAN (R 4.3.2)
 rjson          0.2.23    2024-09-16 [1] CRAN (R 4.3.2)
 rlang          1.1.6     2025-04-11 [1] CRAN (R 4.3.2)
 rmarkdown      2.30      2025-09-28 [1] CRAN (R 4.3.2)
 rstudioapi     0.17.1    2024-10-22 [1] CRAN (R 4.3.2)
 scales         1.4.0     2025-04-24 [1] CRAN (R 4.3.2)
 seewave      * 2.2.3     2023-10-19 [1] CRAN (R 4.3.2)
 sessioninfo    1.2.2     2021-12-06 [1] CRAN (R 4.3.2)
 shiny          1.8.0     2023-11-17 [1] CRAN (R 4.3.2)
 signal         1.8-1     2024-06-26 [1] CRAN (R 4.3.2)
 stringi        1.8.7     2025-03-27 [1] CRAN (R 4.3.2)
 stringr        1.5.2     2025-09-08 [1] CRAN (R 4.3.2)
 svglite        2.2.1     2025-05-12 [1] CRAN (R 4.3.2)
 systemfonts    1.3.1     2025-10-01 [1] CRAN (R 4.3.2)
 testthat       3.2.3     2025-01-13 [1] CRAN (R 4.3.2)
 textshaping    1.0.3     2025-09-02 [1] CRAN (R 4.3.2)
 tuneR        * 1.4.7     2024-04-17 [1] CRAN (R 4.3.2)
 urlchecker     1.0.1     2021-11-30 [1] CRAN (R 4.3.2)
 usethis        3.1.0     2024-11-26 [1] CRAN (R 4.3.2)
 vctrs          0.6.5     2023-12-01 [1] CRAN (R 4.3.2)
 viridisLite    0.4.2     2023-05-02 [1] CRAN (R 4.3.2)
 warbleR      * 1.1.36    2016-04-19 [1] Github (maRce10/warbleR@a938839)
 withr          3.0.2     2024-10-28 [1] CRAN (R 4.3.2)
 xfun           0.53      2025-08-19 [1] CRAN (R 4.3.2)
 xml2           1.4.0     2025-08-20 [1] CRAN (R 4.3.2)
 xtable         1.8-4     2019-04-21 [3] CRAN (R 4.0.1)
 yaml           2.3.10    2024-07-26 [1] CRAN (R 4.3.2)

 [1] /home/marce/R/x86_64-pc-linux-gnu-library/4.3
 [2] /usr/local/lib/R/site-library
 [3] /usr/lib/R/site-library
 [4] /usr/lib/R/library

──────────────────────────────────────────────────────────────────────────────