SpeakFB turns an English recording into a report on your speaking pace, your long pauses and your fillers such as um. It is a small command-line tool for macOS 26 or later on Apple silicon. Transcription runs on your Mac, and the tool does not upload recordings.
It does not score pronunciation. The report below comes from an 11-second sample made with the macOS say voice.
- Words per minute: words without fillers, from the first word to the last word. Pauses in this time are included.
- Pace: below 100 words per minute is slow, 100 to 160 is steady, and above 160 is fast. These bands are only a rough guide.
- Pauses: gaps between words longer than 1 second. The report shows the five longest gaps.
- Fillers:
um,uh,er,ah,erm,hmm, andmm. - Low-confidence words: words the system rates below 0.5 confidence. Words with no confidence value, words shorter than three letters, and common words such as
theandandare left out. The report shows up to 12 words.
Confidence shows how sure the speech system is about a word. It does not measure pronunciation.
- macOS 26 or later on Apple silicon.
- Apple's command-line developer tools, with
swiftcandmake. - Python 3. No Python packages are needed.
- ffmpeg. You can install it with Homebrew:
brew install ffmpeg.
Keep both source files in this folder. In Terminal, run:
xcode-select --install
brew install ffmpeg
makeIf the developer tools and ffmpeg are already installed, run only make.
To choose a writable module cache:
make MODULE_CACHE="$TMPDIR/speakfb-module-cache"python3 speakfb.py recording.m4a
python3 speakfb.py first.mp4 second.wav
python3 speakfb.py --locale en-US recording.m4aThe default locale is en-US. --locale changes the speech model's language.
The word, filler, and pace rules stay English. The system must support the locale you choose.
The Swift tool can also read a WAV file directly:
./speakfb recording.wav --locale en-USWith no file names, the Python tool reads new recordings from ~/SpeakFB/inbox/:
python3 speakfb.pyThe inbox accepts .mp4, .mov, .m4a, .mp3, .wav, .aac, .3gp, .webm, and .caf files.
Files with names already in the progress log are skipped. Use a file name on the command line to process it again.
The tool creates these data folders:
~/SpeakFB/
inbox/
reports/
progress.tsv
Each recording with English words adds one HTML report and one row to progress.tsv.
The last report opens in your browser. Set SPEAKFB_NO_OPEN=1 to leave it closed.
Use SPEAKFB_ROOT to choose another data folder:
SPEAKFB_ROOT="$HOME/SpeechPractice" python3 speakfb.py recording.m4aTranscription runs on your Mac. The tool does not upload recordings. The system may download its speech model once for a locale. This first step needs a network connection. Reports contain the transcript and the recording's file name. They stay in your data folder.
make testThis test uses macOS say to make a short English sample with one um.
It converts the audio with ffmpeg and runs the full Python and Swift pipeline.
It checks for one HTML report and one progress row. Test files are kept in the printed temporary folder.
A missing model or a system service error can stop transcription. The test records the error in pipeline.log.
Example result from this synthetic sample (a computer voice, not a person):
sample.wav: 11 seconds, 40 words, 209 words/min, 0 long pauses, 1 fillers, 0 low-confidence words
Copyright (c) 2026 Ninon. This app uses GPL-3.0-only. Read LICENSE. Pull requests are welcome. Read CONTRIBUTING.md and CLA.md.