This app helps you turn iOS Voice Memos into clean, readable transcripts using OpenAI's Whisper and GPT models.
- 🎙 Lists and previews all
.m4avoice memos from macOS Voice Memos - ✅ Select files to transcribe using a web UI
- ✨ Transcribes selected audio files using OpenAI Whisper
- 🧼 Automatically generates a cleaned version of each transcript using GPT-4
- 🗣️ Optionally generates a speaker-attributed version (currently using a simple heuristic, and disabled because it's not very good)
- 📄 Saves multiple transcript versions per memo:
raw: Original Whisper outputcleaned: GPT-enhanced grammar/punctuationspeakers: Speaker-attributed version (disabled)prompt-*: Custom prompted versions (planned)
- 📁 Assign memos to projects (groupings) for organization
- 🔊 Audio playback directly in the browser
- ⚡ Uses
.envfor secure, local API key storage - 📤 Export cleaned transcripts of selected memos to a single, copyable text output
- macOS with access to your Voice Memos at:
~/Library/Group Containers/group.com.apple.VoiceMemos.shared/Recordings/ - Python 3.10+
- An OpenAI API key (get one here)
-
Clone or download this repository
-
Run the setup script:
./setup.sh
-
Add your API key to the
.envfile:OPENAI_API_KEY=sk-... -
Start the app:
source venv/bin/activate python app.py -
Open your browser at: http://localhost:5000
The app scans your macOS Voice Memos folder and displays your recordings in a clean interface. You can:
- ✅ Select recordings to transcribe
- 📝 Automatically get raw + cleaned transcripts
- 🗂️ Add files to named projects for organization
- 🔍 View and switch between available transcript versions
- 📤 Export transcripts as copyable text to use elsewhere
Each transcript is saved as .txt files in the transcripts/ directory. Possible versions:
filename.raw.txt– Raw Whisper output (basic formatting only)filename.cleaned.txt– GPT-4 cleaned outputfilename.speakers.txt– Speaker-attributed version (optional)filename.prompt-custom.txt– Custom prompt outputs (coming soon)
You can create and assign projects to your memos. Files can be added to projects individually or in bulk. An "Uncategorized" section is shown by default for unassigned files.
Project data is saved in projects.json.
You can select any number of memos and click Export Selected. This will:
- Gather the cleaned transcript of each selected memo
- Sort them by date (oldest to newest)
- Combine them into a single text block
- Open a modal where you can copy the entire export for use elsewhere
If you sometimes address your AI assistant by name (e.g. "Cheshire, remind me to..." or "Cheshire, make a note..."), you can tell the app to recognize those instructions during cleaning.
To enable this:
- Add your assistant name to
.env:
ASSISTANT_NAME=Cheshire
- The cleaner will then treat lines beginning with
Cheshire,as meta-instructions — not part of the spoken transcript — and will preserve them clearly, without misinterpreting them as part of the dialogue.
If ASSISTANT_NAME is not set, the cleaner behaves as usual.
- Your API key is stored locally in
.env .envis ignored by Git via.gitignore
Right now, speaker-attributed transcripts use a simple pause-based heuristic, which is limited in accuracy.
To improve speaker detection, future versions may integrate:
- pyannote-audio — diarization via embeddings
- WhisperX — adds diarization to Whisper
- Hosted APIs like AssemblyAI or Deepgram with native speaker support
The button for generating speaker transcripts is currently commented out in the UI, pending these improvements.
- Transcripts are only as accurate as Whisper + GPT can infer.
- Lines like “Cheshire, remind me…” require the assistant awareness mode to be enabled for best results.
- Speaker attribution is currently based on pauses between segments — diarization support (e.g. WhisperX, pyannote) is planned for later.
- Flask
- OpenAI Whisper
- ChatGPT / GPT-4 (for cleaning transcripts)
MIT — modify, share, and build on it freely