This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend.
Who it's for
Odilia is my mother-in-law, and her cooking lives in voice memos. Decades of family recipes — including her Luxembourgish Gromperekichelcher (crispy potato fritters) — exist only as rambling WhatsApp audios she sends when one of us asks "how do you make that again?". Nobody ever scrolls back to find them, and nobody writes them down.
So this weekend I built her voice-recipe-book: drop a voice memo in, get a clean recipe card out. One real person, one real problem.
What it does
voice memo (.mp3/.m4a/.wav)
│
├─ transcribe.py faster-whisper (open-weight Whisper, int8 CPU) → raw text
└─ structure_recipe.py Qwen2.5-3B-Instruct (open-weight LLM, local CPU) → Markdown card
title · servings/times · ingredients · steps · "the secret"
Everything runs locally. No cloud, no API key, €0 per recipe.
👉 Repo: https://github.com/jeffreyturov-dev/voice-recipe-book
Demo (real run)
The demo memo is TTS-synthesized because I won't publish a real family recording — the pipeline is identical either way. Whisper (small, CPU) transcribed the 40-second French memo at confidence 1.00. One honest failure: Gromperekichelcher came out as "grands-pèreux qui chèrent" — regional dish names are exactly the words a speech model has never seen, so the app accepts an explicit title (a feature, not a bug).
Then Qwen2.5-3B-Instruct, running on the same CPU, structured the raw transcript — hesitations and all — into this card (actual output, unedited except the title):
# Gromperekichelcher d'Odilia
**Portions :** 8 | **Préparation :** 30 min | **Cuisson :** 15 min
## Ingrédients
- 1 kg de pommes de terre farineuses
- 1 oignon
- 2 œufs
- 2 cuillères à soupe de farine
- Sel, poivre, noix de muscade
- Persil haché (non précisé)
## Étapes
1. Râpez les pommes de terre farineuses et essorez-les bien dans un torchon.
2. Mélangez avec l'oignon râpé, les œufs, la farine, le sel, le poivre et la muscade.
3. Chauffez de l'huile dans une poêle à feu moyen.
4. Formez des galettes et aplatissez-les.
5. Faites frire 3 à 4 minutes de chaque côté jusqu'à ce qu'elles soient croustillantes.
6. Servez chaud avec une compote de pommes.
## Le secret
> Essorer bien les pommes de terre pour éviter qu'elles détrempe.
It even extracted "the secret" — squeeze the potatoes dry — the one line of grandma-wisdom that makes the dish.
Why open innovation matters here
- Privacy: family voice memos never leave the laptop. No third-party server ever hears Odilia's voice. With a cloud speech API, that's simply not true.
- Cost: €0 per recipe, forever, vs ~€0.02–0.10 per memo with a cloud speech+LLM stack. A whole family book costs nothing.
- Offline: after a one-time model download, it works in a kitchen with no internet.
- Hackable: every layer is an open weight — swap Whisper sizes, swap the LLM, fine-tune on her dialect, change the card template. A closed API gives you none of that.
The stack: Whisper (MIT, via faster-whisper/CTranslate2) + Qwen2.5-3B-Instruct (Apache 2.0) on plain CPU. Total new code: ~150 lines of Python, written this weekend — the open models do the heavy lifting.
Try it
git clone https://github.com/jeffreyturov-dev/voice-recipe-book
cd voice-recipe-book && pip install -r requirements.txt
python3 app.py memo.m4a "Grandma's apple pie"
Next for Odilia: a weekly cron that pulls her memos and prints the growing book for Christmas. She doesn't need to know what an LLM is. She just needs her recipes to outlive the chat history.
Top comments (0)