Transcribing Audio Locally with Whisper: My Actual Workflow (No Uploads)
Two hours of interview audio transcribed on a laptop in eleven minutes, offline. The model size that is worth it, the flags that matter, and how I handle speaker names.

The result I care about
a 118-minute interview transcribed in 11 minutes on a laptop, fully offline, at an accuracy I only had to correct nine times. No upload, no per-minute pricing, no terms of service question about whose audio it is.
I moved to local transcription after a client asked, reasonably, where their recordings were being processed. Here is the workflow I ended up with.
What to install
Related: Midjourney vs DALL-E vs Flux: A Practical Image-Tool Comparison Framework →
Related: How to Run DeepSeek-R1 Offline on Mac mini M4 (Step-by-Step 2026 Guide) →
pip install faster-whisper
# ffmpeg is required for anything that is not already 16kHz wav
sudo apt install ffmpeg # or: brew install ffmpegfaster-whisper is the implementation I settled on: same models, several times faster than the original reference code, and it runs on CPU acceptably.
Choosing the model size
Related: 9 Free AI Coding Tools Every Developer Should Try in 2026 →
Related: Which GPU Should You Buy for Local AI in 2026? (I Tested Five Price Brackets) →
This is the only decision that really matters.
| Model | Size | CPU speed (1h audio) | GPU speed | When I use it |
|---|---|---|---|---|
| tiny | 75 MB | ~4 min | <1 min | Never, for real work |
| base | 145 MB | ~7 min | ~1 min | Rough search index |
| small | 480 MB | ~18 min | ~2 min | Clear single-speaker audio |
| medium | 1.5 GB | ~50 min | ~4 min | Good default |
| large-v3 | 3 GB | ~2.5 h | ~8 min | Interviews, accents, other languages |
| large-v3-turbo | 1.6 GB | ~35 min | ~3 min | What I actually use |
The turbo variant is the sweet spot. It is close to large-v3 in accuracy on the material I work with and several times faster. If you only try one thing from this article, try that.
The script I run
Related: Sora 2 Review: OpenAI's Video Model Is Finally Useful for Real Work →
Related: MCP Servers, Explained by Someone Who Wired Five of Them Up →
from faster_whisper import WhisperModelmodel = WhisperModel("large-v3-turbo", device="cuda", compute_type="int8_float16")
CPU-only machines: device="cpu", compute_type="int8"
segments, info = model.transcribe( "interview.m4a", language="en", # skip auto-detection, it costs time and can be wrong vad_filter=True, # drop silence; big speed win on real recordings beam_size=5, initial_prompt="Discussion about semiconductors, TSMC, EUV lithography.", )
with open("transcript.txt", "w") as f: for s in segments: f.write(f"[{int(s.start)//60:02d}:{int(s.start)%60:02d}] {s.text.strip()}\n")
Two flags do the heavy lifting. vad_filter=True skips silence and cut my time on a real recording by about 30% because interviews contain a lot of nothing. initial_prompt is underrated: feeding it the proper nouns and jargon that appear in the audio dramatically reduces misspelled names and acronyms. My first run turned "EUV" into "you view" repeatedly; the prompt fixed it entirely.
Subtitles
Related: How to Clone Your Voice with AI in 2026 (Free and Paid Options) →
Related: Self-Hosting n8n on a $6 VPS: Full Setup, Backups Included →
pip install faster-whisper-cli
# or write SRT directly:def srt_time(t):
h, m, s = int(t//3600), int(t%3600//60), t%60
return f"{h:02d}:{m:02d}:{s:06.3f}".replace(".", ",")with open("out.srt", "w") as f: for i, s in enumerate(segments, 1): f.write(f"{i}\n{srt_time(s.start)} --> {srt_time(s.end)}\n{s.text.strip()}\n\n")
Experience log: what went wrong
Related: Fine-Tuning a Small Model on a Laptop with LoRA: Start to Finish →
Auto language detection picked the wrong language on a recording that opened with ten seconds of music. Everything after that was nonsense. Setting language= explicitly is worth it whenever you know the answer.
Repeated hallucinated sentences at the end of the file. Classic Whisper behaviour on trailing silence — it invents text like "Thank you for watching" in the gap. The VAD filter removed it. If it persists, trim the tail with ffmpeg first.
A quiet second speaker was partly dropped. Whisper does not separate speakers, and a distant microphone makes it worse. Normalising the audio first helped noticeably:
ffmpeg -i raw.m4a -af "loudnorm=I=-16:TP=-1.5:LRA=11" -ar 16000 -ac 1 clean.wavRun this on everything. It is fast and it improves accuracy more than moving up a model size in some cases.
Speaker labels
Related: CUDA Out of Memory: 9 Fixes That Actually Worked on My GPU →
Whisper alone will not tell you who is talking. For two-person interviews I found manual labelling with timestamps quicker than setting up diarization. If you need it automated, whisperx adds diarization on top, at the cost of an extra model and more setup. For meetings with five speakers it is worth it; for two, it is not.
Where local wins and loses
Wins: privacy, cost at volume, no file size limits, works on a plane. Loses: you handle the setup, no built-in speaker names, and the very best hosted models still edge out local on messy audio with heavy crosstalk.
FAQ
Does it handle non-English audio well? large-v3 and turbo are strong across major languages. Accuracy drops on low-resource languages and heavy dialect.
Can I run it on a phone? Whisper.cpp has mobile builds and the tiny/base models work. Quality is what you would expect from tiny/base.
How do I transcribe a whole folder? Loop over the files in the script above. Load the model once outside the loop — reloading per file is the most common speed mistake I see.
Is int8 quantization worse? For transcription, the difference was invisible to me across dozens of files, and it roughly halves memory.
Related Articles
مقالات ذات صلة — تابع القراءة داخل الموقع
مواضيع مقترحة · Suggested Topics
استكشف مواضيع ومحاور ذات صلة بهذا المقال — روابط داخلية لتعميق قراءتك.
The Daily Pulse
Newsletter delivery is not connected yet. This form only saves your address in this browser; no email is sent.
Get concise, source-linked technology notes without the hype.




