DEV Community

Athar
Athar

Posted on

Canopy: Offline Bird Detection for 6,000+ Species with open Birdnet model

Hacktoberfest: Maintainer Spotlight

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

What I Built

I built Canopy, a local-first Android birding companion that identifies
bird calls across 6,000+ species using the open BirdNET model.

Canopy is designed for hikers, birdwatchers, families, and anyone curious about
the sounds around them. Instead of constantly looking at a screen, users can
start a listening session, put their phone away, and explore their surroundings.

As users walk and listen, Canopy:

  • Identifies birds from microphone audio.
  • Works locally, including in areas without internet access.
  • Records species, confidence, time, and optional location.
  • Builds a Pokémon-style collection of detected birds.
  • Tracks how many times each species has been heard.
  • Creates offline birding challenges.
  • Uses Android's built-in text-to-speech to announce detections.
  • Optionally uses local Gemma to create personalized summaries and challenges.

The goal is simple: make the screen the shortest part of the experience.

Demo

Watch the Canopy walkthrough:

Watch the Canopy demo

Demo video: https://youtu.be/71nXyElfp1c

Code

The complete open-source project is available on GitHub:

Repository: https://github.com/atharhive/canopy

Beta release: https://github.com/atharhive/canopy/releases/tag/v5.4.0-gemma-beta

Canopy is released under the GNU General Public License v3.

How I Built It

Canopy is an Android application built with Kotlin, Java, Gradle, and Android
SDK API 35.

Bird detection

The core detection pipeline uses the open BirdNET model to analyze microphone
audio and identify likely bird species. The model supports recognition across
more than 6,000 bird species.

The detection flow is:

Microphone audio
      ↓
Local audio buffer
      ↓
BirdNET classifier
      ↓
Species and confidence score
      ↓
Local observation database
      ↓
Collection card and challenge
Enter fullscreen mode Exit fullscreen mode

BirdNET remains the source of truth for species identification. The optional
language model never replaces or changes the detected species.

Local Gemma integration

Canopy optionally downloads a quantized Gemma 3 1B instruction-tuned model
separately from the APK. The model runs locally through the MediaPipe GenAI
runtime.

Gemma can:

  • Turn a BirdNET result into a short natural-language explanation.
  • Create personalized challenges from collected species.
  • Answer questions about a user's bird collection.
  • Suggest ways to explore and listen during future walks.

Gemma is not required for the app to work. Without it, Canopy uses deterministic
offline summaries and challenges.

Privacy-first narration

Canopy uses Android's built-in Text-to-Speech engine for local narration. No
ElevenLabs API key or cloud voice service is required.

The local narration flow is:

BirdNET detection
      ↓
Optional Gemma summary
      ↓
Android offline Text-to-Speech
Enter fullscreen mode Exit fullscreen mode

If Gemma is unavailable, Canopy automatically falls back to a short local
summary such as:

“European Robin detected with 91 percent confidence.”

Collection and challenges

Every detected species can become a collectible card containing:

  • Bird name
  • Best confidence score
  • Number of detections
  • Collection date
  • Observation history

Canopy also includes offline challenges, including:

  • Discover a new species.
  • Hear two different birds before lunch.
  • Record a detection above 70% confidence.
  • Find a species at sunrise or sunset.
  • Build a five-species collection.
  • Improve an existing card with a higher-confidence detection.
  • Revisit a favorite location and look for a new bird.

Why Does Open Innovation Matter?

Open innovation made Canopy possible as a private, offline outdoor experience.

A closed cloud API would require users to upload audio recordings and
potentially location data to a remote service. It would also make the app
dependent on:

  • Internet connectivity.
  • API availability.
  • Usage limits.
  • Per-request costs.
  • A vendor-controlled model and experience.

With open models and local inference, Canopy can:

  • Work on trails with no signal.
  • Keep recordings and observations on the device.
  • Avoid sending location history to a third party.
  • Reduce operating costs.
  • Let the model and inference pipeline evolve independently.
  • Provide a usable fallback even when Gemma is not installed.
  • Give users more control over their data and tools.

The open pieces are not decorative additions. BirdNET powers the central
identification experience, while optional local Gemma adds contextual
explanations and personalized challenges.

Prize Categories

Best Use of Gemma

Canopy uses a downloaded, quantized Gemma model locally to:

  • Generate short explanations for BirdNET detections.
  • Create custom challenges from the user's collected species.
  • Answer questions about the user's collection.
  • Provide personalized outdoor exploration prompts.

Best Use of GitHub Copilot

Copilot assisted with the development workflow, including:

  • Android UI implementation.
  • Local narration integration.
  • Collection and challenge features.
  • Build troubleshooting.
  • Release preparation.
  • Documentation and testing guidance.

The Vision

Canopy is built around a simple idea:

Technology should help people notice more of the world, not demand more
attention from them.

The app helps users identify what they hear, then encourages them to put the
phone down and continue exploring.

The next bird is not inside the screen.

It is somewhere outside. 🐦

Top comments (0)