DEV Community

kavyansh wadhwa
kavyansh wadhwa

Posted on

Birdjournal: Identify Birds by Sound, Offline, with Open-Source AI

Hacktoberfest: Maintainer Spotlight

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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

Top comments (0)

Some comments may only be visible to logged-in visitors. Sign in to view all comments.