{"slug": "ofrenda-keeping-a-family-story-in-their-own-voice-offline", "title": "Ofrenda: keeping a family story in their own voice, offline", "summary": "A developer built Ofrenda, a local-first Flask tool that records a family member telling a story, transcribes it with faster-whisper's small model on CPU, and uses Gemma 3 4B via Ollama at temperature 0.3 to generate a short remembrance card with a title, paragraph, list of loved things and a verbatim quote. Stories are stored as plain JSON and audio files in a gitignored memories/ folder so they never depend on a cloud service, and the developer pinned av<19 in requirements.txt to fix a metadata_errors crash in faster-whisper on fresh installs.", "body_md": "*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine](https://dev.to/challenges/hacktoberfest-week4-2026-10-26)*\n\nAn ofrenda is a place where you keep the people you remember. I took that idea and built a small tool for something most families never write down: the stories that only exist in one person's voice.\n\nWith Ofrenda, I record someone telling a story, or add a voice memo. It writes down what was said, then makes a short remembrance card: a title, a paragraph about the person, a list of things they loved (foods, songs, places), and one line in their own words. I read it, fix anything that isn't true, and save it. The card goes on a shelf, and the recording sits next to it, so I can press play and hear them again.\n\nThat is how I read the theme. The ghost in the machine is a voice that outlasts the moment it was spoken.\n\nKeep a family story before it fades. Record someone telling it (or add a voice memo), and\nOfrenda writes it down, then turns it into a short remembrance card using only what was said\nEverything runs on your laptop: Whisper (speech to text) and an open-weight model through\nOllama. No account, no API key, no cloud. Stories are saved as plain files (text, JSON and the\noriginal audio) in a `memories/` folder, so they never depend on a service that might disappear.\n\n`ollama pull gemma3:4b`\n`run.bat`. Your browser opens at To run it on Windows: install Python and [Ollama](https://ollama.com/download), run `ollama pull gemma3:4b`, then double-click `run.bat`. The first start downloads the speech model, so it needs internet once.\n\nI wrote the first version with an AI coding assistant (Claude). It is a small Flask server with one page, and two open models that both run on my laptop.\n\n**Whisper does the listening.** The browser records audio (or I upload a voice memo) and sends it to Flask. [faster-whisper](https://github.com/SYSTRAN/faster-whisper) runs the `small` model on the CPU and writes down the speech. I choose the language first (English, Hindi, Bengali or Spanish), or let it work it out. The recording waits aside until I press Save.\n\n**Gemma 3 (4B) does the writing**, through Ollama. I send the transcript and ask for a JSON answer with four fields: title, remembrance, loved and quote. The temperature is low (0.3) so it stays close to the text.\n\n**The part I worried about most is the model making things up.** For a memorial, an invented detail is worse than a boring one. I used three guardrails:\n\nWhat this doesn't cover: the paragraph and the list of things they loved are not checked by code. They rely on the prompt and on me reading them.\n\n**Plain files, not an app database.** Each saved story is a folder in `memories/`, with a `story.json` (transcript and card) and the original audio. That folder is in `.gitignore`, so family stories can't be uploaded to GitHub by accident.\n\n**One thing broke.** On a fresh install, transcription failed with `open() got an unexpected keyword argument 'metadata_errors'`. A new version of PyAV, the library faster-whisper uses to open audio, removed an argument that faster-whisper still passes. Pinning `av<19` in `requirements.txt` fixed it. \n\n**Limits I know about:**\n\nA family's voices and stories are about as private as data gets. Because Whisper and Gemma run on my own laptop, the audio and the transcript never go to anyone's server.\n\nThe theme asks about making sure what you build isn't locked inside a service that might disappear. That was the main reason I chose plain files. Everything Ofrenda saves is a JSON file and an audio file that any program can open. If Ofrenda disappeared tomorrow, the stories would still be there, and the models I downloaded would still run.\n\nIt also costs nothing to run. I could test a recording again and again without a bill or a limit. The Whisper size, the model and the writing instructions are each one line or paragraph I can change.\n\nA bigger hosted model would probably write a smoother remembrance, and recognise Hindi and Bengali better. For a story like this, I would still choose privacy and plain files.\n\nI recorded my aunt telling the story of her first job, for about three\n\nminutes. She didn't want to be recorded at first, so I told her it was\n\njust a test.\n\nWhen I played it back she was quiet for a moment, then said: \"I sound\n\nexactly like my mother.\"\n\nWhat surprised me: she corrected the transcript herself, and fixed a\n\nstreet name I never would have known was wrong.\n\nWhat the card got wrong: it said she \"loved the city\", which she never\n\nsaid. I deleted that line before saving.\n\nI haven't shown the card to anyone yet. But her voice is in a folder\n\nnow, and that's the part I'm keeping.", "url": "https://wpnews.pro/news/ofrenda-keeping-a-family-story-in-their-own-voice-offline", "canonical_source": "https://dev.to/diptichoubey24/ofrenda-keeping-a-family-story-in-their-own-voice-offline-5ao8", "published_at": "2026-10-31 15:50:17+00:00", "updated_at": "2026-10-31 15:51:55.193024+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-tools", "large-language-models", "ai-agents"], "entities": ["Ofrenda", "Ollama", "Gemma 3", "Whisper", "faster-whisper", "PyAV", "Flask", "Claude"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/ofrenda-keeping-a-family-story-in-their-own-voice-offline", "markdown": "https://wpnews.pro/news/ofrenda-keeping-a-family-story-in-their-own-voice-offline.md", "text": "https://wpnews.pro/news/ofrenda-keeping-a-family-story-in-their-own-voice-offline.txt", "jsonld": "https://wpnews.pro/news/ofrenda-keeping-a-family-story-in-their-own-voice-offline.jsonld"}}