A fully offline, privacy-first audio and video transcription tool.
No cloud APIs. No internet dependency. No data leaves your machine.
OfflineScribe : Upload Interface
Upload audio or video files for local transcription.
Model Selection
Choose between Tiny, Small, and Medium models based on speed and transcription quality.
OfflineScribe is a local web application that transcribes audio and video files directly on your machine using open-source speech recognition models. It strips audio from any video file using ffmpeg, processes it through faster-whisper (an optimized offline Whisper implementation), and returns a timestamped transcript all without sending a single byte to any external server.
Built for developers, content creators, researchers, and anyone who needs accurate transcription without sacrificing privacy or paying for API credits.
- Fully Offline : No internet required after initial model download. All processing happens locally.
- Multi-format Support : Accepts MP4, MP3, WAV, MKV, AVI, and M4A files.
- Timestamped Transcripts : Every segment includes precise start and end timestamps.
- Model Selection : Choose between Tiny, Small, and Medium Whisper models based on your speed vs. accuracy preference.
- Multiple Export Formats : Download transcripts as
.srt(subtitle format) or.txt, or copy directly to clipboard. - Real-time Progress Tracking : Step-by-step status updates: Uploaded → Extracting Audio → Transcribing → Done.
- Typing Animation : Visual feedback during transcription so you always know the process is running.
- Smart Time Estimates : File size-based processing time estimates shown before transcription begins.
- Error Handling : Clear, user-friendly error messages for every failure scenario without exposing internals.
- File Size Validation : Frontend and backend validation with a 500MB file size limit.
┌─────────────┐ ┌──────────────────┐ ┌─────────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ │ │ │ │ │ │ │ │ │
│ User drops │────▶│ Django receives │────▶│ ffmpeg strips │────▶│ faster-whisper │────▶│ Timestamped │
│ file on UI │ │ file + model │ │ audio to 16kHz WAV │ │ transcribes │ │ transcript │
│ │ │ selection │ │ │ │ locally │ │ shown on UI │
└─────────────┘ └──────────────────┘ └─────────────────────┘ └──────────────────┘ └─────────────────┘
│
┌───────────────────────────┤
│ │
┌──────▼──────┐ ┌───────▼──────┐
│ Copy to │ │ Download │
│ Clipboard │ │ SRT / TXT │
└─────────────┘ └──────────────┘
Pipeline detail:
| Stage | What happens |
|---|---|
| Upload | File is validated (format + size) and saved locally |
| Extracting | ffmpeg strips audio track, converts to 16kHz mono WAV (optimal for Whisper) |
| Transcribing | faster-whisper runs selected model on WAV file, returns segments with timestamps |
| Done | Segments saved to DB, returned to frontend as JSON, rendered with timestamps |
| Technology | Role | Why |
|---|---|---|
| Python 3.13 | Core language | Latest stable, async-friendly, rich ML ecosystem |
| Django 6.1 | Web framework | Built-in ORM, URL routing, file handling no boilerplate needed |
| faster-whisper | Speech-to-text engine | CTranslate2-optimized Whisper 4x faster than OpenAI's original with same accuracy, fully offline |
| ffmpeg | Audio extraction | Industry standard for audio/video processing, handles virtually every format |
| SQLite | Database | Zero-config local database, perfect for a single-user local tool |
| Whitenoise | Static file serving | Serves CSS/JS without needing a separate web server in development |
| python-dotenv | Environment config | Keeps SECRET_KEY and sensitive config out of source code |
| Vanilla JS (Fetch API) | Frontend | No framework overhead lightweight polling and DOM updates |
| Threading | Background processing | Runs transcription in a background thread without blocking the Django request cycle |
OfflineScribe/
├── core/ → Django project config (settings, urls, wsgi)
├── transcriber/ → Core app
│ ├── static/
│ │ └── transcriber/
│ │ ├── css/style.css
│ │ └── js/main.js
│ ├── templates/
│ │ └── transcriber/
│ │ └── index.html
│ ├── models.py → TranscriptionJob model
│ ├── views.py → Upload + status endpoints
│ ├── services.py → ffmpeg + faster-whisper pipeline
│ └── urls.py → App-level URL routing
├── media/ → Uploaded files + extracted audio (auto-created)
├── .env → Environment variables (not committed)
├── manage.py
├── requirements.txt
├── README.md
└── SETUP.md
git clone https://github.com/yourusername/OfflineScribe.git
cd OfflineScribe
setup.batgit clone https://github.com/yourusername/OfflineScribe.git
cd OfflineScribe
chmod +x setup.sh && ./setup.shThen run:
# Windows
venv\Scripts\activate && python manage.py runserver
# macOS / Linux
source venv/bin/activate && python3 manage.py runserverOpen http://127.0.0.1:8000 in your browser.
For manual setup on, Django learning, or troubleshooting see SETUP.md
| Chirag Gupta | LinkedIn · chirag1706gupta@gmail.com |




