This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady
What I Built
TalkNotTyping takes a rambling voice memo and writes the note I was too lazy to type.
I drop in an audio file. A minute or so later there is a markdown file with a title, a short summary, action items, key points, and the full transcript underneath. The transcript stays in the note so I can see when the model cleaned up my "um, I mean" and when it should have left a name alone.
That is the whole point. A three-minute walk-and-talk becomes a note I can file, without me sitting down to reconstruct what I said. Students, people who think better out loud, and anyone who already has a folder full of voice memos get to stay lazy. The sloth records. The machine types.
It also does the small follow-through I usually skip. --style todo keeps only the action items. --export todo writes a todo.txt, and --export ics writes a calendar file, but only with a date I actually said out loud. "Tomorrow" does not get turned into a made-up due date. --tags meeting,priya sticks hashtags on the note for whatever app I dump it into.
There is a tiny local page too: python voice2notes.py --web, then drop a file on http://127.0.0.1:8765.
Speech-to-text is faster-whisper. The notes model is whatever open-weight model I have in Ollama, qwen2.5:3b by default. Both run on the machine in front of me. After the one-time downloads, I can turn the network off and it still works.
Demo
The sample in the repo is a few seconds long. It says: "Remember to buy milk and call Priya tomorrow."
python voice2notes.py tests/fixtures/sample.wav
The note lands in notes/, dated, and named after the file. Run it again and you get a second file ending in -2, not an overwrite. The transcript is at the bottom so the summary can be checked against what was actually said.
Or skip the terminal:
python voice2notes.py --web
Open http://127.0.0.1:8765 and drop the same file on the page. The note shows up there and is still written under notes/.
If the laptop is too small to hold a notes model, the same script runs in Google Colab. Clone the repo, start Ollama in the notebook, pull qwen2.5:3b, and run the sample. Colab can open the page with output.serve_kernel_port_as_window(8765) because the server only binds to 127.0.0.1 on that machine.
Code
pranjalaman
/
TalkNotTyping
A lazy-person's note taker. Ramble into a voice memo, and get clean, structured notes back. Everything runs locally with open-source pieces: no cloud, no API keys, no per-use cost.
TalkNotTyping
Talk into a voice memo. Get a markdown note back: a short title, a summary, action items, key points, and the full transcript. Speech-to-text and the notes model both run on your machine. After the one-time model downloads, the pipeline does not need the network.
Install
You need Python 3.10 or newer, plus Ollama.
git clone https://github.com/pranjalaman/TalkNotTyping.git
cd TalkNotTyping
pip install -r requirements.txt
ollama serve
ollama pull qwen2.5:3b
Leave ollama serve running in its own terminal. The first transcription also downloads the Whisper base weights once. That download is the slow step. A first note from the sample below is a few minutes on a normal connection, then seconds after that.
requirements.txt pins PyAV below version 19. The current faster-whisper release cannot decode audio with PyAV 19.
First note
python voice2notes.py tests/fixtures/sample.wav
The recording says: "Remember to buy milk and call Priya tomorrow."
The note is written toβ¦
The pipeline lives in one file, voice2notes.py, on purpose. The prompt, the headings, and the note layout are plain text in that file. Fork it and change the note without learning a framework.
How I Built It
Two open pieces do the work, and a short Python script glues them.
faster-whisper turns the audio into text. It loads on CPU with
int8weights, so a laptop can run it. Voice-activity detection skips the silence. The model size is a flag:tiny,base,small, ormedium. The detected language and the duration go into the note header.--lang hiforces Hindi when auto-detect is not what I want. Small models are weaker on Hindi and Hinglish, and the README says so.Ollama writes the note from that transcript. The script talks to
http://localhost:11434/api/chatwith the standard library only. No SDK. Temperature is 0.2. The default model isqwen2.5:3b.--llm llama3.2:3bor--llm gemma2:2bswaps it for anything else already pulled. The system prompt is one constant: use only what is in the transcript, do not invent tasks, names, dates, or facts, and write "None" when there are no action items.
Long transcripts are split at about 2,500 words so a small model stays inside its context. Action items from each chunk are merged into one list. Each part keeps its own summary. If the model reply is missing a heading, the raw reply is kept under "Notes" instead of crashing.
A missing file is skipped. Silence prints a warning and writes nothing. If Ollama is down, the script says to run ollama serve and ollama pull, and names the model. If the Whisper weights were never downloaded and the machine is offline, it says so, and it tells you about HF_HUB_OFFLINE=1 for the next run.
Why Does Open Innovation Matter?
A voice memo is a private thing. It is where I think before I have decided what is fit to type. Sending that audio to a transcription API means the recording, the pauses, and the names all leave the house. Here they do not. faster-whisper never opens a network connection after the weights are on disk. Ollama is a process on localhost. The note is a file in a folder I chose.
Closed APIs are also a meter. A long lecture costs more than a short reminder, every month, forever. An open-weight model costs the download once. After that a twenty-minute ramble and a twenty-second one cost the same: electricity.
The third thing is that I can change it. Whisper size is one flag. The notes model is another flag. The prompt is a string I can edit when I want lecture notes instead of errands. A closed API would give me a summary in its format, on its servers, while I was online. I would not get the transcript beside the summary, I would not get to refuse a date the model invented, and I would not get a note at all on a train with no signal.
Open is what makes the lazy version possible. The sloth does not want an account, a bill, or a wifi icon.
The Lazy Payoff
Typing the note is the part I skip, so the memos pile up and I forget the action items. This cuts that job down to "record, drop the file, read the note."
A few minutes of speech is a few minutes I do not spend reconstructing sentences. The action items are already checkboxes. If I said "October 20," the calendar export can carry that date. If I only said "tomorrow," it does not invent one. I still read the transcript, because the model is a cleaner, not a witness. That check is faster than writing the note from scratch.
The sample in the repo is the short version of the same habit: say the errand out loud, come back to a file I can drop into a notes app.
Prize Categories
Overall challenge only. The project does not use a partner product. Whisper and an Ollama model are the whole stack. Swap --llm to gemma2:2b and pull that model if you want to enter Best Use of Gemma. I have not done that here.
Top comments (0)