A simple self-hosted transcription tool. It runs locally, so your audio/video never leaves your machine or server.
- Upload local files (
.mp4,.mp3,.wav, …) - Automatic transcription using faster-whisper
- Job queue with progress tracking
- Download transcripts as
.txt - Optional email delivery (SMTP, with group support)
- Recipient groups (e.g.
recipients_main.txt,recipients_team.txt) - Web interface with dark theme
- Basic authentication (via
.env) - Docker support
- Clone this repository
- Copy
.env.exampleto.envand adjust settings - Install Python requirements (or use Docker, see below)
Run locally:
pip install -r requirements.txt
python app.pyThen open http://localhost:15551.
For running in Docker, create a .env file with your settings (see .env.example).
Then use Docker Compose:
services:
transcriber:
image: spaleks/transcriber:latest
# or if you prefer quay.io:
# image: quay.io/spaleks/transcriber:latest
container_name: spal-transcriber
ports:
- "15551:15551"
volumes:
- ./data:/app/data
- ./config:/app/config
- ./.env:/app/.env:ro- Go to
http://localhost:15551 - Upload a file (e.g.
meeting.mp4orrecording.mp3) - Select which recipient group should be notified (if SMTP is configured)
- Wait until processing finishes
- Download the transcript or send it via email
Recipients are defined in plain text files inside the RECIPIENTS_DIR (default: ./config).
recipients.txt→ main recipients (always notified if email sending is enabled)recipients_<group>.txt→ group-specific recipients (notified only if the job is assigned to that group)
Example:
config/
recipients.txt # always notified
recipients_Team.txt # group "Team"
recipients_Clients.txt # group "Clients"
Inside each file, list one email address per line. Lines starting with # are ignored.
If configured, a webhook is called when a job finishes. The transcript is sent as multipart/form-data with metadata.
Set these in .env:
WEBHOOK_URL– target endpoint (if unset, webhooks are disabled)WEBHOOK_BEARER– optional token for theAuthorization BearerWEBHOOK_TIMEOUT– request timeout in seconds (default:15)WEBHOOK_VERIFY– TLS verification (1= verify,0= skip)
- Automatically after a job reaches
done. - Manually via a button in the GUI.
-
Method:
POST -
Content-Type:
multipart/form-data -
Parts:
metadata: JSON string with job info (see below)file: transcript astext/plain(<slug>.txt)
Example metadata JSON:
{
"slug": "meeting-2025-09-26",
"name": "Weekly Meeting",
"job_id": 123,
"recipient_group": "Team",
"created_at": "2025-09-26 10:05:11",
"updated_at": "2025-09-26 10:22:44",
"source": "spal.transcriber",
"status": "done",
"filename": "meeting-2025-09-26.txt"
}Here’s what you can configure via .env:
APP_DATA_DIR– Directory for storing jobs and outputs (default:./data)APP_HOST– Host to bind (default:127.0.0.1)PORT– Port to bind (default:15551)APP_AUTH_USER– Username for Basic AuthAPP_AUTH_PASS– Password for Basic Auth
WHISPER_MODEL– Model size (tiny,base,small,medium,large-v3)WHISPER_DEVICE–cpuorcudaWHISPER_COMPUTE– Compute type (int8,float32,int8_float16,float16)WHISPER_ALLOWED_LANGUAGES– Comma-separated allowlist for language detection (e.g.en,de), or*/unset to allow any languageWHISPER_THREADS– CPU threads (integer)WORKER_CONCURRENCY– Number of concurrent workers.
AUTO_SEND_EMAIL– If1, emails are sent automatically after transcription (default:0)SMTP_HOST– SMTP server hostnameSMTP_PORT– SMTP port (default:587)SMTP_USER– SMTP username (optional)SMTP_PASS– SMTP password (optional)SMTP_SENDER– Sender email addressSMTP_SENDER_NAME– Display name for senderSMTP_USE_TLS– Use STARTTLS (default:1)SMTP_USE_SSL– Use SSL/TLS directly (default:0)SMTP_VERIFY– Verify server certificate (1= yes,0= no)
RECIPIENTS_DIR– Directory containing recipient list files (default:./config)RECIPIENTS_FILE– Path to main recipients file (default:./config/recipients.txt)
MAIL_SUBJECT– Email subject (supports{name},{slug}placeholders)MAIL_BODY– Email body (supports{name},{slug}, supports\n)MAIL_BODY_FILE– Optional path to a file containing email body
- All files are stored and processed locally.
- Nothing is uploaded to third-party servers.
- Please always respect the privacy of speakers and only process content you are allowed to handle.
MIT
