DEV Community

Air Drop
Air Drop

Posted on

Trail Journal Offline: Field Notes That Transcribe Themselves Where There's No Signal

Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass Submission 🌿

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

What I Built

The best field notes are spoken. When you're halfway up a ridge with binoculars in one hand and a deer in front of you, you don't type — you talk to your phone for twenty seconds and move on.

The problem is what happens next. Those voice memos pile up, unsearchable and unwritten, and the cloud transcription services that could fix that all share one flaw: they need the internet. The places worth writing about — ridgelines, deep forest, river valleys, the far end of the garden in a storm — are exactly where the internet isn't.

Trail Journal Offline is a small command-line tool that turns a spoken field note into a written Markdown journal entry, entirely on your own machine:

  • It transcribes the recording with the open-weight Whisper model, running locally via faster-whisper.
  • It then highlights the observation points — sentences where you mentioned a creature, a place, or the weather — and files them into a tidy journal entry with the full transcript attached.
  • No account. No upload. No signal required. The tool forces offline mode in code, so an accidental network fetch isn't just unlikely — it's impossible by construction.

It's built for hikers, birders, gardeners, rangers, and community scientists: anyone who observes things outdoors and would rather spend their attention on the deer than on a note-taking app.

Demo

Here's a real, unedited run. A 26-second spoken note went in:

"Field note, Saturday morning. I am hiking the ridge trail above the valley, and the weather is clear and sunny with a light breeze. Near the creek I saw two deer drinking, and a red squirrel ran across the path in front of me. I heard an eagle calling somewhere over the forest. In the meadow there were butterflies everywhere, and the river below is loud after the rain last night. No signal up here at all, so this note stays on my phone until I get home."

And a journal entry came out — word-for-word transcript, plus the observation points the tool pulled from it:

Creatures & wildlife

  • Near the creek I saw two deer drinking, and a red squirrel ran across the path in front of me.
  • I heard an eagle calling somewhere over the forest.
  • In the meadow there were butterflies everywhere, and the river below is loud after the rain last night.

Weather & conditions

  • I am hiking the ridge trail above the valley, and the weather is clear and sunny with a light breeze.
  • In the meadow there were butterflies everywhere, and the river below is loud after the rain last night.

That output is committed in this project as demo-output.md, alongside the sample audio, so anyone can reproduce the run exactly. (The sample voice is synthetic, generated with a TTS voice, purely so the demo doesn't depend on my personal recordings — feed it a real phone memo and the pipeline is identical.)

Code

The whole thing is one Python file, plus ffmpeg, as described in How I Built It below. The demo output described above is committed in this project as demo-output.md, alongside the sample audio, so anyone can reproduce the run exactly.

How I Built It

The pipeline is deliberately boring — three steps, all local:

  1. Decode. ffmpeg converts whatever the phone produced (mp3, m4a, wav) into 16 kHz mono WAV, which is what Whisper eats natively.
  2. Transcribe. faster-whisper runs Whisper's open weights on CPU (int8, CTranslate2) from a local model folder. One implementation detail worth sharing: I feed the model the audio as a NumPy array of samples rather than a file path. In my environment, the audio-decoding library underneath threw a TypeError on some files; reading the WAV samples directly sidestepped the whole class of problem and made the tool more robust in the field, where "the file is weird" is normal.
  3. Highlight. The transcript is split into sentences, and each sentence is matched against three small, explicit keyword lists — creatures, places, weather. No ML here, on purpose: the lists are plain Python that any birder can extend with their local species in seconds.

The whole thing is one Python file, plus ffmpeg. It ran the demo transcription on an ordinary laptop CPU in about thirteen seconds for a 26-second note.

Why Does Open Innovation Matter?

This project only exists because Whisper's weights are open (MIT License) — and I don't mean that as a slogan. Three concrete things depend on it:

The backcountry test. A cloud API fails the moment the trail leaves coverage, which is precisely where the observations happen. An open model runs on the device that's already in your pocket or backpack. "Touch grass" and "works offline" turn out to be the same requirement.

The privacy test. Field notes can be sensitive: nesting sites of rare birds, the location of a vulnerable species, your own movements through wild places. With a local open model, no audio, transcript, or accidental location hint ever leaves the device. There's no server to trust because there's no server.

The swap test. Because the weights are open, the tool isn't married to one model. small is today's sweet spot for a laptop CPU; large-v3, a fine-tune for another language, or a future model drops into the same slot without touching the tool. Open weights turn a product into a platform anyone can improve — including the birders who'll add species my keyword lists have never heard of.

And the quiet fourth one: cost. Rangers, volunteers, and community science projects record hundreds of notes a season. Zero per-minute billing isn't a discount; it's the difference between a tool they can use and one they can't.

Honest limitations

This is an MVP, and I'd rather show the seams:

  • The observation extractor is keyword heuristics, not NLP. It's transparent and predictable, but crude — it cheerfully files "Field note, Saturday morning" under Places because "field" is on the list. It demonstrates the idea honestly; a small local NER model is the obvious upgrade.
  • Wind noise still trips up the small model. A voice-activity-detection pass is next on the list.
  • One file in, one journal out. No live recording, no database, no app — yet.

What's next

Batch mode for a whole season of notes with a species index, region-specific keyword packs (a birder's list is not a gardener's list), and — keeping the offline faith — an optional summary step using a small open-weight language model, still entirely on-device.

The trail doesn't have Wi-Fi. With open models, it doesn't need any.

Prize Categories

Category: Overall. Built with open-source/open-weight AI: Whisper (MIT) via faster-whisper (MIT), ffmpeg. No partner technology used.

Top comments (0)