@whyshouldaicareone AI disaster a day, and the fix

Turn voice memos into text on your own laptop (free, nothing uploaded)

Whisper types your voice memos locally. This is one paste for Windows and one for Mac, plus the fix that stops it writing "Thanks for watching." over silence.

Windows: one paste into PowerShell

Needs Python 3.9 or newer from python.org. It makes a private environment in your home folder, installs faster-whisper (a fast, free, open-source runtime for Whisper) and saves the script. av<19 is on purpose: faster-whisper 1.2.1 fails with the newest av (TypeError: open() got an unexpected keyword argument 'metadata_errors'). The script reads one file or a whole folder and writes a .txt next to each memo.

copy and paste
python -m venv $HOME\memo
& $HOME\memo\Scripts\pip install faster-whisper "av<19"
@'
import sys
from pathlib import Path
from faster_whisper import WhisperModel

AUDIO = {".m4a", ".mp3", ".wav", ".ogg", ".opus", ".flac", ".aac"}
model = WhisperModel("small", device="cpu", compute_type="int8")
for arg in sys.argv[1:]:
    path = Path(arg)
    for f in sorted(path.iterdir()) if path.is_dir() else [path]:
        if f.suffix.lower() in AUDIO:
            segments, _ = model.transcribe(str(f), vad_filter=True, condition_on_previous_text=False)
            text = " ".join(s.text.strip() for s in segments)
            f.with_suffix(".txt").write_text(text, encoding="utf-8")
            print(f"{f.name}: {text or '(no speech)'}")
'@ | Set-Content -Encoding utf8 $HOME\memo\memo.py

Mac: one paste into Terminal

Same thing for zsh or bash. Needs python3. The script is identical. We did not run this one on a Mac: the Windows paste was tested, and the Mac one uses the same Python and pip lines.

copy and paste
python3 -m venv ~/memo
~/memo/bin/pip install faster-whisper "av<19"
cat > ~/memo/memo.py <<'EOF'
import sys
from pathlib import Path
from faster_whisper import WhisperModel

AUDIO = {".m4a", ".mp3", ".wav", ".ogg", ".opus", ".flac", ".aac"}
model = WhisperModel("small", device="cpu", compute_type="int8")
for arg in sys.argv[1:]:
    path = Path(arg)
    for f in sorted(path.iterdir()) if path.is_dir() else [path]:
        if f.suffix.lower() in AUDIO:
            segments, _ = model.transcribe(str(f), vad_filter=True, condition_on_previous_text=False)
            text = " ".join(s.text.strip() for s in segments)
            f.with_suffix(".txt").write_text(text, encoding="utf-8")
            print(f"{f.name}: {text or '(no speech)'}")
EOF

Run it on your memos (Windows)

Put the memos in one folder (m4a, mp3, wav and more work; no ffmpeg needed). The first run downloads the small model, about 0.5 GB, once; after that nothing leaves your computer. Each memo prints its text and gets a .txt file next to it.

copy and paste
& $HOME\memo\Scripts\python $HOME\memo\memo.py "$HOME\Documents\memos"

Run it on your memos (Mac)

Same, in Terminal.

copy and paste
~/memo/bin/python ~/memo/memo.py ~/Documents/memos

The fix: no more "Thanks for watching."

Whisper has to output something. On silence or noise it can invent text: "Thank you." and "Thanks for watching." are the classic ones, and a repeated sentence over a long quiet stretch is another. Two options in the script stop it. vad_filter=True runs a speech detector first (Silero VAD) and drops every part without speech before Whisper sees it. condition_on_previous_text=False stops one made-up line from being fed in as context for the next window, which is how repetition loops start. Tested here on a 30-second silent file: without vad_filter the small model returned "you" and the large-v3-turbo model returned "Thank you."; with it, nothing. A memo with 20 seconds of silence, one sentence, then 30 seconds of hiss: without it the small model repeated the sentence in three segments, with it the sentence came out once.

Check it worked

Record 10 seconds of silence as a memo and run the script on it (on a Mac, use the Mac path above). It must print (no speech) and write an empty .txt. Then take the line vad_filter=True out and run again to watch the problem appear. Put it back. If the first run fails with a TypeError mentioning metadata_errors, the av pin did not install: run the pip line again.

copy and paste
& $HOME\memo\Scripts\python $HOME\memo\memo.py "$HOME\Documents\memos\silence.m4a"

Pro tip: speech is cut off or missing

Paste the .txt files into Claude with: These are voice memos I recorded half asleep. Group them into projects, list real ideas first, mark the ones I should sleep on, and tell me which are only noise.

Pro tip: sort the 3 a.m. ideas with Claude

Paste the .txt files into Claude with: These are voice memos I recorded half asleep. Group them into projects, list real ideas first, mark the ones I should sleep on, and tell me which are only noise.

Common mistake

Raising no_speech_threshold and hoping. Per the library's own description, a segment counts as silent only when the no-speech probability is high AND the average log probability is low, so one setting alone does not catch a confident hallucination. The speech detector is the filter that removes the silence itself. Also: a bigger model does not cure it. In the test, large-v3-turbo wrote "Thank you." over silence just like small.

Official docs

One fix of twenty: the whole Claude Code survival kit.

Follow @whyshouldaicare

A new disaster and its fix every day. Comment the word under a reel to get its guide.