YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
Whisper Transcribe
A local speech-to-text service powered by faster-whisper and exposed publicly via ngrok. Upload any audio/video file and get back a full transcript with timestamps.
Quick start
1. Install dependencies
pip install -r requirements.txt
2. Set your ngrok auth token
Open .env and paste your token after NGROK_AUTHTOKEN=:
NGROK_AUTHTOKEN=your_token_here
Get your free token at: https://dashboard.ngrok.com/get-started/your-authtoken
3. Run
python run.py
The terminal will print a public URL like:
================================================================
Whisper Transcribe is live -> https://xxxx.ngrok-free.app
================================================================
Open that URL in any browser to use the web interface.
Configuration (.env)
| Variable | Default | Description |
|---|---|---|
NGROK_AUTHTOKEN |
(empty) | Your ngrok auth token (required for stable tunnels) |
WHISPER_MODEL_SIZE |
large-v3 |
Model to use: tiny, base, small, medium, large-v3 |
HOST |
0.0.0.0 |
Flask bind address |
PORT |
5000 |
Flask port |
MAX_UPLOAD_MB |
100 |
Max upload size in MB |
Smaller models (tiny, base, small) load faster and use less memory; large-v3 gives the best accuracy.
API
POST /api/transcribe
Upload an audio or video file.
Request β multipart/form-data
| Field | Type | Description |
|---|---|---|
file |
file | Audio/video to transcribe |
Supported formats: .mp3, .wav, .m4a, .aac, .ogg, .flac, .mp4, .webm
Response β 200 OK
{
"text": "Full transcript as a single string.",
"language": "en",
"duration": 12.34,
"segments": [
{ "start": 0.0, "end": 3.5, "text": "Hello world." },
{ "start": 3.5, "end": 6.1, "text": "This is a test." }
]
}
GET /api/progress/<job_id>
Server-sent events (SSE) progress stream for a queued transcription job.
GET /api/download/<job_id>
Download the generated output file once the job is completed.
GET /health
Returns { "status": "ok", "model_size": "large-v3" }.
Deploying on Render
Use this app as a single web service (frontend + backend served by Flask) or split frontend/backend services.
- Single service: no extra frontend configuration is needed.
- Split services: set frontend API base to your backend URL by either:
- adding
?api_base=https://your-backend.onrender.comto the frontend URL, or - adding
<meta name="api-base" content="https://your-backend.onrender.com">infrontend/index.html.
- adding
The frontend always calls /api/* endpoints now, and backend supports both /api/* and legacy non-/api/* routes.
Project structure
.
βββ backend/
β βββ app.py # Flask routes
β βββ config.py # Settings loaded from .env
β βββ transcriber.py # faster-whisper inference
βββ frontend/
β βββ index.html
β βββ style.css
β βββ app.js
βββ outputs/ # Temporary upload scratch space (auto-cleaned)
βββ run.py # Entry point β starts Flask + ngrok tunnel
βββ requirements.txt
βββ .env # Your local config (never commit this)
Notes
- The model weights are downloaded automatically on the first run (~3 GB for
large-v3). Subsequent runs use the cached weights. - Transcription runs on CPU by default (
compute_type=int8). If you have a CUDA GPU, edittranscriber.pyand changedevice="cpu"todevice="cuda"andcompute_typeto"float16". - Without an ngrok token the tunnel still works on the anonymous free tier but may be rate-limited.