In the third installment of the FrankenServer saga, I document my experience with BirdNet-Go, a free open-source birdcall identification program.
The last time we checked in on FrankenServer, I had just troubleshot my wired LAN and set up a Jellyfin media server. My next project was a bit out of left field but still a fun and rewarding pursuit!
As of this writing, I have had
BirdNet-Go running for about three weeks. It is a free, open-source program that takes live audio—say, from a USB microphone in a windowsill—and analyzes it using AI models developed and trained by Cornell University's Lab of Ornithology. What this means is that FrankenServer can record, identify, and log birdcalls outside my house 24/7.
BirdNet-Go has been a lovely addition to my amateur birding routine, especially since it requires little effort to maintain once it is properly set up. With that said, it did take some time to install and configure due to the relatively sparse Windows documentation. Those interested in jumping in headfirst without following my narrative rambling can read my guide
here, but if you're here for the whole adventure, then buckle up!
 |
| The BirdNet-Go dashboard |
Our story begins in late spring of 2026, when I started getting into photography and birding. My wife and I had been taking frequent walks in our local park, and we couldn't help but marvel at the diverse array of feathered fauna all around us. I decided to reinstall the
Merlin app to make our walks a bit more interesting and educational.
For those who haven't tried it, Merlin is one of the many free services and apps offered by Cornell University's Lab of Ornithology to help laypeople like you and me identify nearby birds. For the first few years, users could upload pictures that they had taken, and Merlin's machine-learning model would handle the rest. Then, several years after the app's initial release, Cornell released the feature that made Merlin feel borderline miraculous: Sound ID.
Every bird species has its own distinct calls that in turn have their own unique spectrographic signatures. The Lab of Ornithology trained an AI model to recognize these different sounds by their spectrograms. It sounds very simple, but in practice, the speed with which the Merlin app can identify birdsongs is truly something to behold. You can even record sessions, complete with ID labels and timestamps, for future review.
 |
| A spectrogram from BirdNet-Go featuring a catbird's feline hiss (the vertical columns) against a backdrop of evening traffic, insects, and frogs. |
I had used Merlin a handful of times in the past out of curiosity, but now that I was becoming a birder, I could check the app as I walked through the park or sat in my backyard and marvel at the ornithological orchestra all around me. Our local (manmade) lake was home to blue herons, great egrets, fishing crows, and double-crested cormorants. The woods behind our house was full of blue jays, northern cardinals, American goldfinches, and no fewer than three species of woodpecker. While Merlin couldn't tell me exactly where the birds were currently perched, it definitely helped me get a sense of what to look for when I scanned the treeline with my camera.
 |
| A northern flicker above our house |
It was through Merlin Bird ID that I became aware of the constellation of projects created using Merlin's older sibling
BirdNet, also created and maintained by Cornell University. There are two official apps:
Birdnet Analyzer, which is more for analyzing uploaded sound files, and
BirdNet-Live, which combined Analyzer's file processing capabilities with a "Live Mode" that operated similar to Merlin's Sound ID feature. These sounded neat, but there were also third-party programs that could be left on for days or weeks at a time, passively listening and logging birdcalls without the need for user input. For example, the appropriately named
BirdNet-Pi was specifically developed to run on those diminutive yet extremely flexible Raspberry Pi micro PCs that people use for everything from ad-blocking to retro game emulation to...well, bird identification! I first learned about BirdNet-Pi when I watched Benn Jordan's highly entertaining
video on birdcalls a few months ago. At the end of the video, Jordan explains how a basic BirdNet-Pi setup could be assembled for under $50, but while there was definitely an appeal to running an entire birdsong detecting station on a palm-sized box, I wondered if there was a better option for a desktop PC.
Installation and Set Up
Ironically, BirdNet-Go is
also capable of running on a Raspberry Pi, but what made it appealing to me was the fact that it was also available for Linux (beyond PiOs), Mac, and Windows. Like a lot of projects on GitHub, the
installation instructions aren't exactly aimed at casual users. As of this writing, there is a single section about installing BirdNet-Go using the pre-compiled binaries, and it's a catch-all set of instructions for Linux, Mac, and Windows. It appeared that I would have to stumble my way through the set up process.
My first hurdle involved installing
SoX (Sound eXchange) so that BirdNet could render spectrograms of detected birdcalls. The only problem was that the instructions only specified how to do so on Linux and MacOS. SoX seemed easy enough to Google and download, but installing it was another matter entirely. I didn't just need to run the installer itself. No, I apparently had to add sox-14-14-2.exe to a list of
"environmental variables" in Windows. I'm still not sure as to why, but after another 15 minutes of Googling, I managed to find the required menu and point Windows to the right folder.
Up next was running BirdNet-Go itself, which also had some delightful (read: baffling) quirks. For one, BirdNet-Go didn't even have an installer. The unzipped archive contained a few subfolders and a birdnet-go.exe, but the server itself was not started by double-clicking the executable. That would be ridiculous. As per the instructions, I opened up a terminal in the install directory and entered ./birdnet-go.exe, and I was greeted by a list of compatible commands. Then, according to the output, BirdNet-Go abruptly stopped.
 |
| Is a double-clickable .exe file too much to ask for? |
Now don't get me wrong: the developer of BirdNet-Go is doing amazing work, and there is plenty of documentation. But it's worth asking how the average non-tech-savvy birder will likely react to the image above. Sure, those of us whose eyes don't immediately glaze over will skim through the output and determine that the proper course of action is to append the command serve to the end, i.e. .\birdnet-go.exe serve. Why not just say that in the instructions, though? Well, then the user wouldn't see this list of available commands and flags! OK, so why not include both the proper command for starting the server and all of these useful modifiers in the instructions?
In any case, the server process was running, so I could now access the dashboard by entering the computer's local IP and port 8080 in any web browser, e.g. 192.168.x.x:8080. This brought up a slick UI that would eventually display a daily activity log as well as shortcuts to recent detections and recordings. But before I could start capturing birdcalls, I needed the right kind of microphone. I didn't happen to have any small mics handy, and I definitely wasn't going to stick my AT2005 or AT2020 out a window, so it was time to do some shopping.
Mic Check
I tried two lavalier mics, each under $20, as inexpensive starter options. The
first one, the
Saramonic SR-M1W, was the cheapest that I found with decent-to-good reviews. I tried putting it in the window that faced our backyard—after all, this is where I did most of my birdwatching. However, there were a few issues with this. This put the mic about 15 feet away from our air conditioning unit, which added a ton of unwanted background noise whenever the AC kicked on. Then it dawned on me, and I'm not sure why I didn't think of this sooner: the window facing our side yard was only six feet away, and it was both around the corner from the AC unit and much further away. Some preliminary testing in Audacity confirmed that the AC wasn't contributing a noticeable amount of noise.
The next step was to weatherproof the mic. Even though I would be placing it between the windowpane and the outside screen, recent storms often sent rain down at an angle, splattering our windows with water. A few Youtube videos and Reddit threads recommended snipping a finger off a latex glove and inserting the mic into that. I gave this a shot, and it seemed like a reasonable enough solution. The mic would never be submerged with water; I just needed something to protect the capsule from the occasional stray raindrop.
 |
| Not the most elegant solution, but if it works... |
It had been a while since I'd used a mic with a 3.5mm plug, and this Saramonic mic was a great reminder as to why. Regardless of whether it was plugged into the PC's front or rear mic jacks, there was an incessant buzz in the background due to electrical interference from the rest of the PC's components. This is a well-known issue with many cheap headsets and clip-on mics, which is why USB and XLR microphones are preferred by more serious users. XLR mics require separate audio interfaces in order to work with PCs, so unless I felt like spending another $50 to $100, a USB lav or miniature shotgun mic would be my best bet.
This brought me to the
Movo M1, which actually had a handful of Amazon reviews that specifically mentioned BirdNet-Pi. One customer reported that it might even be
too sensitive out of the box, joking that the mic picked up "the heartbeats of every creature within 500 ft". Well, it turned out that the latter review was not entirely untrue, because as soon as I plugged in the mic and went to adjust its settings in Control Panel, I noticed that the green volume meter was almost maxed out. I hadn't even moved the mic outside onto the windowsill yet! Dropping the input down to about 60% seemed to tame the constant peaking and provide some headroom in case some loud birds landed nearby.
The difference between the two mics was immediately noticeable when I started comparing recordings and spectrograms. Whereas the first mic was awash in noise and sine-wave buzz, the second carved two nice, mostly noise-free channels in the spectrogram where most birdcalls could be comfortably detected. Below are the two loudest robins that I picked up on either microphone:
Note how bright and distinct the call appears in that 3-4kHz band! There's also the matter of all that extra hiss beyond 8kHz on the first mic. I saw an even more dramatic difference when I compared blue jay recordings from both mics:
Blue jays have very complex calls, often hitting over a dozen pitches at the same time. The multiple frequencies were clearly visible in both, but the USB mic detected three additional pitches in that 6-10kHz range for a total of 10, and with much more clarity—not bad for a $20 mic!
False Positives and Fine Tuning
After a few days, it became clear that I needed to dial in some settings to a) filter out the low-end ambient hum of local traffic, b) address potential false-positives when the AI model got confused, and c) avoid racking up hundreds of robin recordings every day (there are SO MANY robins around my house).
Up first was using BirdNet-Go's built-in high pass filter to duck the frequencies around 100hz by 12db. Anything higher than 200hz would start to affect the server's ability to detect lower-pitched calls. I went for 150hz just to be safe, and this seemed to cut out most of the distant truck rumble that occasionally cluttered up the bottom of the spectrogram.
Completely eliminating false positives would be impossible, but I could at least limit them to a few edge cases every once in a while. This was much trickier to configure than the high-pass filter, as most BirdNet-Go setups are unique. I doubt that anyone else is using this particular mic on this particular hardware on Windows 11. There were two primary settings to tune in the
Analysis section: the
confidence threshold, which represented the AI model's certainty percentage, and the
filter level, which specified how many times the call needed to be detected in a short time frame before the bird was officially logged. The developer of BirdNet-Go
recommended starting with a confidence of 0.8 and "moderate" filter to start, but since I was using a $20 lav mic and noticed a lot of correct detections in the 60% range, I opted to drop these values to 0.6 and "lenient", respectively.
This cleaned things up for the most part, though there were still some false positives that I won't be able to avoid until the back-end BirdNet model updates. For some reason, the higher-pitched traffic sounds that remained fell into the exact same frequency range as certain owls, which was unfortunate because I had definitely logged some Eastern Screech-Owls. The problem is that the false positives quickly began to outnumber the correct detections.
The final customization was a set of custom species filters that would limit how often certain detections were saved. While this would artificially skew the results, I didn't need a Cornell University machine learning model to tell me that my backyard was full of robins. I also didn't want gigabytes of WAV files from these common species. Still, it would be nice to have a general sense of when even these common birds were active.
Setting up a filter was pretty simple. Under Species > Custom, I could add a custom configuration for each bird I wanted to filter. I kept the threshold low, at the default 0.5, since the birds I was filtering had very loud and distinct calls. The intervals varied depending on the specific bird. Robins I set to 300 seconds, blue jays, catbirds, and goldfinches were set to 120 seconds, and cardinals, which are much quieter, were set to 60s. This kept the maximum number of detections to around 10 per hour on average, which was perfect. Whenever a species started getting particularly boisterous, I added a custom filter to avoid filling up my SSD with hundreds of similar recordings.
The last step I took to keep BirdNet-Go running smoothly with minimal maintenance was to set it to run on Windows startup. This was actually my first time using Windows' built-in Task Scheduler, and while this process was just as awkward as installing SoX, I could at least understand the rhyme and reason behind the various options. Task Scheduler allowed me to automatically launch BirdNet-Go when the PC powered on, all without even having to log into Windows or deal with a pesky Powershell window. I should be able to manage most of the server settings from the web UI from now on.
Concluding Thoughts (For Now)
BirdNet-Go is still clearly a work in progress, as most open-source software is, but despite the rough edges here and there, I've enjoyed checking in on my birdcall server every day to see which frequent flyers and new species pop up. It's tracked roughly 60 species to date, and I can't wait to see what things look (and sound) like once fall rolls around!
I'll likely check back in as BirdNet-Go and the BirdNet model receive updates. Stay tuned!