This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
What I Built
Bird Walk is a bird identifier that runs entirely on a laptop with the Wi-Fi switched off. You press Enter, put the screen down, and listen to the birds around you for 15 seconds. Then it tells you which bird it heard, how sure it is, and a short field note about that bird.
I live near Attock, Pakistan. Most bird tools assume US or European species lists, so I made location part of the pipeline: the tool only considers birds that are plausible for my area in the current week. It is for anyone who wants to learn the birds around them without needing signal, an account or a subscription.
The part I care about most is that it is willing to say "Not sure". A bird tool that always gives an answer is a tool that lies a lot.
Honest note: I built and tested this indoors, playing bird calls from a phone speaker next to the laptop microphone. I did not get to take it on a proper outdoor walk before the deadline. The design is meant for the outdoors (offline, microphone first, short answers), but I have not field-tested it yet.
Demo
https://drive.google.com/file/d/1f2F4F3O4l1yL_EzWlx2Z1Uzzwbxdqumf/view?usp=sharing
Code
https://github.com/sundanaeem-systems/bird_walk
How I Built It
Everything runs locally:
-
Record 15 seconds from the laptop microphone (
sounddevice). - Where am I? BirdNET's geo model (v2.4) takes my latitude, longitude and the week of the year, and returns how likely each species is here right now. I keep species above 0.3, which leaves about 470 of the 6,000+ in the model.
- What do I hear? BirdNET's acoustic model (v2.4, running on LiteRT, so no TensorFlow install) scores the recording. For every candidate I multiply audio confidence by local likelihood, so a common local bird beats a rare bird that merely sounds similar. Below 0.4 audio confidence the tool answers "Not sure".
-
Field note. Gemma 3 1B (open-weight, Q4_K_M GGUF, about 800 MB) runs on CPU through
llama-cpp-pythonand writes two sentences about the bird.
What went wrong, and what I changed
Gemma made things up. My first version just told Gemma the bird's name and asked for a description. For one identification it confidently described the bird as "dark-blue" with a "slightly curved beak". That was simply wrong. A 1B model does not know birds, it guesses.
So I changed the design. I wrote a small table of local facts for common birds of the area, and Gemma is only allowed to rephrase those facts, at temperature 0. If a bird is not in the table, the tool prints no note at all instead of inventing one. This is the part I like most: the small model does what it is good at (turning facts into friendly words) and not what it is bad at (knowing things).
It is still not perfect. The House Crow note above has a second sentence ("Please observe this fascinating bird closely.") that is not in my facts. Even with a strict prompt, a 1B model adds filler. A simple fix would be to keep only the first sentence, which I would do next.
Thresholds needed tuning. My first offline run reported a Tree Pipit at 26 percent, barely above my 0.25 cutoff, so I raised the cutoff to 0.4. Earlier, with a loose local filter, the tool also reported a Song Thrush at 77 percent, a bird I would not expect near Attock in autumn. Multiplying by local likelihood and tightening the filter made these cases rarer.
What I Tested
All tests were indoors, with Wi-Fi switched off, using calls played from a phone speaker.
| Run | What I played | What Bird Walk said | Audio confidence |
|---|---|---|---|
| 1 | A recording with no clear bird | Not sure | below threshold |
| 2 | House Sparrow call | House Sparrow | 81 to 95 percent (several runs) |
| 3 | [fill in] | House Crow | 61% |
| 4 | [fill in] | Not sure (closest guess Common Myna) | 16% |
| 5 | [fill in] | Not sure (nothing above threshold) | n/a |
| 6 | [fill in] | Tree Pipit | 74% |
What this tells me: it recognised a clean House Sparrow call reliably, it stayed quiet when it was not sure, and it can still give a confident answer I would want to double check, such as run 6. Confidence is not the same as being right, and playback through a speaker is much cleaner than a real outdoor soundscape, so real-world accuracy will probably be lower than this table suggests.
Limitations: the facts table covers only about a dozen common birds; BirdNET can be confidently wrong in noisy places; Gemma 1B sometimes adds filler; voice output is not done; the week number is an approximation; and I have not tested it on a real walk yet.
Why Does Open Innovation Matter?
- It works with no signal. After a one-time model download, everything runs offline. A trail, a field or a village rooftop does not need a connection. I tested this with the Wi-Fi off, and the whole pipeline ran.
- My location stays on my machine. The tool uses exact coordinates and a microphone recording. With a closed API, both would leave my device. Here nothing does.
- It costs nothing to run. No keys, no usage fees, no rate limits.
- I could change the system, not just call it. Because the models are open, I filtered BirdNET's species list myself, fed Gemma only verified facts, and tuned the thresholds. A closed bird-ID service would hand me a name and a score, and nothing to fix when it is wrong for my region.
My Agent Session
I built this step by step in a chat with an AI assistant, testing each piece in the terminal as I went.
Prize Categories
- Best Use of Gemma: Gemma 3 1B (GGUF, via llama.cpp) writes the field notes. It is constrained to a local facts table, so a small open model stays truthful, and it stays quiet when it has no facts.
Top comments (1)
Official Platform Update
Security protocols have been updated for all developer accounts.