Tutorial
Birds by sound
Name the birds in five minutes of a real Amazon dawn chorus with BirdNET, check every name against an expert and against GBIF, and share an honest species list
(Received 9 October 2026)
Using five minutes of a public, expert-labelled soundscape recorded at dawn in lowland rainforest in Madre de Dios, Peru, we run the BirdNET classifier with a location and week filter, compare its 18 species with the 14 the expert heard, see what goes wrong without the filter, and check every name against GBIF before writing a species list that says how sure we are.
Contents


Run it yourself. Everything below comes from a real run on a public, expert-labelled rainforest recording. Download the notebook and open it in Jupyter, or in Google Colab with File → Upload notebook. The first run downloads about 230 MB, the recording and BirdNET's model; after that it runs in under a minute.
I.What BirdNET does
BirdNET is a neural network that names birds from their sounds.[1][1] Kahl, S., Wood, C. M., Eibl, M. and Klinck, H. (2021). BirdNET: A deep learning solution for avian diversity monitoring. Ecological Informatics, 101236. doi.org It comes from the K. Lisa Yang Center for Conservation Bioacoustics at the Cornell Lab of Ornithology and from Chemnitz University of Technology.[2][2] BirdNET (2026). BirdNET home page: K. Lisa Yang Center for Conservation Bioacoustics, Cornell Lab of Ornithology, and Chemnitz University of Technology; the species range model is based on eBird data. Accessed 10 October 2026. birdnet.cornell.edu Its model V2.4, the one we use, can name 6,522 species.[3][3] BirdNET team (2025). BirdNET Model V2.4. Zenodo, CC BY-NC 4.0. The model covers 6,522 species. doi.org You give it a recording; it cuts the sound into 3-second segments and gives every species a score in every segment.
The scores are not probabilities. BirdNET's own documentation says they are "a measure of the algorithm's prediction reliability" and asks you to listen to the detected segments, starting with the highest scores.[4][4] BirdNET team (2026). Segment Review. BirdNET-Analyzer documentation, accessed 10 October 2026. birdnet-team.github.io That is the habit this tutorial builds: BirdNET suggests, you check.
The birdnet Python package is open source under the MIT licence. The model weights are for non-commercial use only: the package README gives CC BY-NC-SA 4.0,[5][5] BirdNET team (2026). birdnet: a Python library for identifying bird species by their sounds. README, section License: source code MIT, models CC BY-NC-SA 4.0. github.com while the Zenodo record that hosts the model gives CC BY-NC 4.0.[3] Both forbid commercial use, so if you build something to sell, ask the BirdNET team first.
II.The recording
We need a recording where we already know the answer. W. Alexander Hopping, Stefan Kahl and Holger Klinck published 21 hour-long soundscapes from the Inkaterra Reserva Amazonica, a 2 km² lowland rainforest reserve on the Madre de Dios river about 20 km east of Puerto Maldonado in Peru.[6][6] Hopping, W. A., Kahl, S. and Klinck, H. (2022). A collection of fully-annotated soundscape recordings from the Southwestern Amazon Basin. Zenodo, CC BY 4.0. doi.org They recorded them between 14 January and 2 February 2019, in the rainy season, and an expert drew 14,798 boxes around the calls of 132 bird species. The collection is licensed CC BY 4.0, so you can use and share it with credit.[6]
We take one file, PER_001_S01_20190116_100007Z.flac: one hour from site S01, which the collection's notes describe as "edge habitat, relatively thick and viny, near a creek", with forest cleared nearby on several sides.[6] It starts at 05:00:07 local time on 16 January 2019 and is sampled at 32 kHz in mono. All 21 files sit in a single 2.4 GB zip on Zenodo. The notebook uses HTTP range requests to download only this file, 108 MB, and cuts out minutes 30 to 35, from 05:30 to 05:35, the middle of the dawn chorus.
The collection gives the site's coordinates to a hundredth of a second of arc. We round them to 0.1 degree, about 10 km, before using them anywhere. That is the standard way to share where a sensitive species lives,[7][7] Chapman, A. D. (2020). Current Best Practices for Generalizing Sensitive Species Occurrence Data. GBIF Secretariat, Copenhagen. Coordinates of sensitive records are rounded to 0.1 degree. doi.org and BirdNET does not need more.
III.Looking at the sound
A spectrogram shows time from left to right and pitch from bottom to top; darker means louder. A dense band of sound between 5 and 7 kHz runs through the whole excerpt, but the birds are elsewhere: 82 of the expert's 84 boxes lie below 5 kHz, and the median box tops out at 2.1 kHz. Look for the shorter shapes: dots, slurs and repeated notes.
The notebook has a listen(t0, t1) function that plays any stretch. Try listen(105, 111) with headphones before you read on. Even if you know no birds of the Amazon, you will hear several different voices.
IV.Asking BirdNET
BirdNET first needs to know where and when the recording was made. Its range model, built on eBird data, lists the species it expects at a place in a given week of the year.[2] BirdNET divides every month into four weeks, so a year has 48,[8][8] BirdNET team (2026). Command line usage. BirdNET-Analyzer documentation, accessed 10 October 2026: week values from 1 to 48, four weeks per month; location filter threshold default 0.03; minimum confidence default 0.25. birdnet-team.github.io and 16 January is week 3. With our rounded position, 12.5° S and 69.1° W, and the default occurrence threshold of 0.03,[8] the range model expects 1,058 species.
Then the sound model scores every one of those species in each of the 100 three-second segments of the excerpt. We keep every score of at least 0.1. That gives 299 detections of 18 species, in 95 of the 100 segments; one segment holds seven species at once. Two species dominate: the White-winged Becard in 73 segments, with a best score of 0.98, and the Undulated Tinamou in 72, best 0.97. Most of the others score below 0.4.
A list of 18 species from five minutes is not a result yet. It is a list of suggestions, and the rest of this tutorial checks them.
V.What the location filter does
Run BirdNET again, this time without the species list, so it can choose from all 6,522 species it knows. It now reports 23 species from 306 detections. The five new ones are a Northern Cardinal, a Black-throated Green Warbler, a Black-and-white Warbler, a Black-throated Blue Warbler and a Golden-crowned Kinglet: all birds of North America. GBIF holds 27,243,293 records of the Northern Cardinal, and 99.9 percent of them come from the United States, Canada and Mexico; none come from Peru.
The cardinal's best score, 0.51, falls between 117 and 120 seconds. It is higher than the best score of 16 of the 18 species on the filtered list. In that same stretch the expert labelled a Blue-gray Saltator, a Gray-fronted Dove and a White-winged Becard, and with the filter on, BirdNET reports nothing at all in that segment.
The lesson is not that BirdNET is bad. It is that a score says how strongly a sound resembles what the model learned, not whether the bird is there. The filter keeps impossible species out, and it is why you must give BirdNET a place and a date, or check the place yourself.
VI.Checking against the expert
The expert drew 84 boxes in these five minutes: 77 around the calls of 14 species, and 7 around calls left as unknown. Comparing species lists gives two numbers. Precision is the share of BirdNET's species that the expert also heard; recall is the share of the expert's species that BirdNET found:
At a threshold of 0.1, BirdNET names 18 species and 9 of them agree with the expert: a precision of 50 percent and a recall of 64 percent (9 of 14). Raise the threshold and the list gets shorter and more often right, but it misses more birds. At 0.25 it names 9 species and 4 agree: 44 percent precision, 29 percent recall. At 0.5 only 2 species remain, the becard and the tinamou, and both are right: 100 percent precision, 14 percent recall. BirdNET-Analyzer's own default threshold is 0.25.[8] These numbers show why no threshold is right for every purpose: a short, reliable list and a complete one pull in opposite directions. Wood and Kahl have written guidelines for using BirdNET's scores well, and they are worth reading before you choose.[9][9] Wood, C. M. and Kahl, S. (2024). Guidelines for appropriate use of BirdNET scores and other detector outputs. Journal of Ornithology 165, 777 to 782. doi.org
Five species the expert heard never appear, at any threshold: the Amazonian Motmot, Bluish-fronted Jacamar, Chestnut-winged Foliage-gleaner, Elegant Woodcreeper and Screaming Piha. And the nine names the expert did not give are not all mistakes. Three of them, the Black-throated Antbird, Great Antshrike and Thrush-like Wren, are labelled elsewhere in the same hour, so they may well have called faintly in our five minutes too. The other six are not labelled anywhere in the hour, and one, the Amazonian Antpitta, is not labelled anywhere in all 21 hours of the collection. Those six are the ones to listen to first.
VII.Checking against GBIF
The expert tells us what was heard. GBIF tells us what has been recorded nearby. For each name, the notebook asks GBIF's species match which taxon it is, and its occurrence search how many records of that taxon lie within 50 km of the site.[10][10] GBIF (2026). Occurrence API, including the geoDistance search used here. GBIF technical documentation, accessed 10 October 2026. techdocs.gbif.org
All 18 names match a species in the GBIF backbone exactly, and all 18 have records within 50 km, from 303 for the Amazonian Antpitta to 5,445 for the Russet-backed Oropendola. None is new for the area. GBIF's copy of the IUCN Red List gives 16 of them as Least Concern and has no entry under the names used for the other two. The five North American species from the unfiltered run have no records within 50 km at all.
Where do the nearby records come from? GBIF holds 493,139 bird records within 50 km of the site, and 97 percent of them come from the eBird Observation Dataset,[11][11] Imani, J., et al. (2025). EOD: eBird Observation Dataset. Cornell Lab of Ornithology, occurrence dataset published through GBIF, CC BY 4.0. doi.org the checklists that birders submit through eBird. BirdNET's range model is built on eBird data too,[2] so the filter and this check are not fully independent. That is worth saying in your write-up.
A species with no records nearby would be a candidate for a new local record, not a discovery. Before you share one, listen to every segment it was detected in and look at the spectrogram. Compare the call with reference recordings on Xeno-canto, rule out look-alikes (other birds, frogs, insects), and check the score: a single segment at 0.12 is weak evidence. Then share it as a candidate and ask others to listen.
VIII.Sharing the species list
The notebook's last cell writes species-list.csv: one row per species, with its best score, the number of segments, the GBIF count and a status. Nine species are "confirmed by the expert" and nine are "unconfirmed". That is an honest list, and an honest list is worth sharing.
On Public Frontier, start a project for your recordings and upload the notebook and the CSV. Then share a discovery note with the category "Species list for a site" and the status "Needs checking", which it keeps until someone else has listened. In the note, say for each species whether the expert confirmed it and how many GBIF records lie nearby; here every species is already recorded there. Leave out the names you ruled out, such as the Northern Cardinal, or list them as misidentified. In the Evidence field, paste links to the recordings or observations the list rests on. Anyone can then press "Check this result" and write a check in their own repository: an independent identification, an evidence review or a catalogue crossmatch. Each check is pinned to the exact version of your note, and one check that fails to reproduce it marks the note as contested.
IX.Your own recordings
The same notebook runs on any recording you are allowed to share. GainForest keeps field recordings from acoustic recorders such as the AudioMoth as public records in each recorder's own repository: 50,892 of them were in its index on 9 October 2026. Check a recording's licence before you publish results from it. Three habits carry over from this tutorial. Give BirdNET a rounded place and the week. Check what it finds against someone who knows the birds, or against GBIF and Xeno-canto. And before you publish anything about a threatened species, round its location to 0.1 degree or coarser, as GBIF recommends.[7]
Acknowledgments
The recording and the expert labels come from W. Alexander Hopping, Stefan Kahl and Holger Klinck (2022), CC BY 4.0.[6] BirdNET is by the BirdNET team at the Cornell Lab of Ornithology and Chemnitz University of Technology. Occurrence records come from GBIF and the datasets it publishes, chiefly the eBird Observation Dataset. Every number above comes from our run on 9 October 2026 with birdnet 1.1.1 and Python 3.12, saved in the notebook.
References
- [1]Kahl, S., Wood, C. M., Eibl, M. and Klinck, H. (2021). BirdNET: A deep learning solution for avian diversity monitoring. Ecological Informatics, 101236. https://doi.org/10.1016/j.ecoinf.2021.101236
- [2]BirdNET (2026). BirdNET home page: K. Lisa Yang Center for Conservation Bioacoustics, Cornell Lab of Ornithology, and Chemnitz University of Technology; the species range model is based on eBird data. Accessed 10 October 2026. https://birdnet.cornell.edu/
- [3]BirdNET team (2025). BirdNET Model V2.4. Zenodo, CC BY-NC 4.0. The model covers 6,522 species. https://doi.org/10.5281/zenodo.15050749
- [4]BirdNET team (2026). Segment Review. BirdNET-Analyzer documentation, accessed 10 October 2026. https://birdnet-team.github.io/BirdNET-Analyzer/stable/best-practices/segment-review.html
- [5]BirdNET team (2026). birdnet: a Python library for identifying bird species by their sounds. README, section License: source code MIT, models CC BY-NC-SA 4.0. https://github.com/birdnet-team/birdnet
- [6]Hopping, W. A., Kahl, S. and Klinck, H. (2022). A collection of fully-annotated soundscape recordings from the Southwestern Amazon Basin. Zenodo, CC BY 4.0. https://doi.org/10.5281/zenodo.7079124
- [7]Chapman, A. D. (2020). Current Best Practices for Generalizing Sensitive Species Occurrence Data. GBIF Secretariat, Copenhagen. Coordinates of sensitive records are rounded to 0.1 degree. https://doi.org/10.15468/doc-5jp4-5g10
- [8]BirdNET team (2026). Command line usage. BirdNET-Analyzer documentation, accessed 10 October 2026: week values from 1 to 48, four weeks per month; location filter threshold default 0.03; minimum confidence default 0.25. https://birdnet-team.github.io/BirdNET-Analyzer/stable/usage/cli.html
- [9]Wood, C. M. and Kahl, S. (2024). Guidelines for appropriate use of BirdNET scores and other detector outputs. Journal of Ornithology 165, 777 to 782. https://doi.org/10.1007/s10336-024-02144-5
- [10]GBIF (2026). Occurrence API, including the geoDistance search used here. GBIF technical documentation, accessed 10 October 2026. https://techdocs.gbif.org/en/openapi/v1/occurrence
- [11]Imani, J., et al. (2025). EOD: eBird Observation Dataset. Cornell Lab of Ornithology, occurrence dataset published through GBIF, CC BY 4.0. https://doi.org/10.15468/aomfnb
Finished? Start a project for your recordings and share your species list as a discovery note, so others can listen and check it: new project or share a discovery.

