This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass

What I Built

birdjournal is an offline bird-call field journal. You record birds on a walk with your phone, put the phone away, and listen. Later it names the species from sound and writes a short journal entry about the walk.

The screen is the shortest part of the experience: record, go outside, look up, and check the journal afterwards. It's for beginner birdwatchers and anyone who hears a bird and wants to know what it is, with or without a signal. It can write the journal in English, Hindi or Punjabi.

Demo

I tested it on a 46-second recording of a Coppersmith Barbet from Sikar, Rajasthan, taken from Xeno-canto (recordist: Dipendra Maharshi, XC123456, licensed CC BY-NC-SA 4.0; used unmodified as a test input, not redistributed). Real output:

Species heard: 1 Coppersmith Barbet x16 best 100% first at 0s 

BirdNET detected the barbet at 100% confidence in all 16 of its 3-second windows, with the location filter set to Sikar.

Outdoor test: I haven't done a full field walk yet. The next step is a sunrise recording near Patiala to see how it handles real background noise.

Code

🐦 birdjournal

An offline bird-call field journal. Record birds on a walk, put the phone away, and let open-source AI tell you who was singing, with no internet, no account and no cloud.

Built for the Hacktoberfest Open-Source AI Challenge, Week 1: Touch Grass.

$ python main.py barbet.wav --place "Sikar, Rajasthan" --lat 27.6 --lon 75.14 --out test.md Species heard: 1 Coppersmith Barbet x16 best 100% first at 0s 

How it works

 phone recording (.wav/.mp3) | v BirdNET (open source) ---- geo filter (lat/lon) removes species that don't live nearby | v species list + confidence | v local LLM via Ollama (open weights) | v short field-journal entry (English / Hindi / Punjabi ...) 

The idea is that the screen is the shortest part of the experience. You go outside, record, and listen. The tool does its work afterwards.

Open-source pieces














Piece Role
BirdNET Identifies species from sound. Runs
…





Released under the MIT License.

How I Built It

  • BirdNET is an open-source bird-sound classifier. I used its litert backend, so TensorFlow isn't needed and it can run on a Raspberry Pi. Its geo model takes your latitude and longitude and drops species that don't live near you.
  • An open-weight LLM through Ollama writes the journal. The default is Qwen2.5 3B, and --model swaps it for any other local model.
  • Python glue: detector.py runs BirdNET and groups detections by species, journal.py prompts the local LLM, and main.py is the command-line tool. If Ollama isn't running, it still prints the species list and a plain summary.

What went wrong: My first prompt let the small model invent facts that weren't in the detections, such as calling the barbet "colorful and melodious" (its call is closer to a steady "tuk-tuk-tuk"). It also said "heard 16 times" when it meant 16 three-second windows. I tightened the prompt to three first-person sentences using only the listed facts.

I also ran the whole pipeline with Gemma 3 4B locally through Ollama, using the same code and one flag:

python main.py barbet.wav --place "Sikar, Rajasthan" --lat 27.6 --lon 75.14 --model gemma3:4b --out test_gemma.md 

My first Gemma run had two bugs: it wrote a literal "N" instead of a number, and it called a 100% detection "uncertain". I moved the confident/uncertain decision into code and tightened the prompt. The second run was clean, with one slip: it says "16 Coppersmith Barbets" when it means 16 three-second windows of audio. A 4B model can follow rules but still blurs this kind of detail, which is why I treat the journal as a rewrite of BirdNET's output and not as the source of truth.

Why Does Open Innovation Matter?

  • Works with no signal. The models are about 77 MB and 46 MB, downloaded once and cached. After that, the trail needs no internet. A cloud bird-ID app can't do that.
  • Your recordings stay on your machine. No audio is uploaded anywhere.
  • Free to run. There are no per-call API fees, so you can record all morning without worrying about cost.
  • I could fix it myself. When the journal model started making things up, I changed the prompt and could swap the model with one flag. With a closed API, I'd be stuck with whatever it gave me.

Limits: BirdNET is trained on more data from Europe and North America than South Asia, so expect misses. One loud, clean clip is an easy test, not a measure of accuracy. The journal only rewrites BirdNET's output, so check it against what you actually saw.

Prize Categories

Best Use of Gemma