Tools now includes a permission-gated Whisper transcription queue.
/whisper (requires permission:whisper.use)/admin/whisper (requires permission:whisper.manage)/api/whisper/* (requires authenticated user + whisper.use)POST /api/whisper/run-now (requires whisper.manage)Admin users are allowed by admin bypass.
whisper_transcriptions with status queued.whisper:process claims queued rows and runs transcription.downloading, transcribing, finalizing, completed or failed).Typical Debian/Ubuntu setup:
sudo apt-get update
sudo apt-get install -y ffmpeg python3 python3-venv python3-pip
python3 -m venv ~/.venvs/whisper
~/.venvs/whisper/bin/pip install --upgrade pip
~/.venvs/whisper/bin/pip install openai-whisper
Then set WHISPER_BIN to your binary path if needed.
WHISPER_ENABLED=true
WHISPER_BIN=whisper
WHISPER_DEFAULT_MODEL=small
WHISPER_VERIFY_SSL=true
WHISPER_DOWNLOAD_TIMEOUT=180
WHISPER_PROCESS_TIMEOUT=3600
WHISPER_MAX_ATTEMPTS=3
WHISPER_RETRY_DELAY_SECONDS=120
The queue is processed via Laravel scheduler every minute:
php artisan whisper:process --limit=1Manual run:
php artisan whisper:process --limit=5
All endpoints are authenticated (web session or JWT from /api/account/login) and permission-gated.
GET /api/whisper/statusReturns queue counters and client capability flags.
GET /api/whisper/jobs?limit=100Returns visible jobs for current user.
limit range is capped server-side.POST /api/whisper/jobsQueue a new transcription request.
Request body:
{
"source_url": "https://example.com/audio.mp3",
"model": "small",
"language": "sv"
}
GET /api/whisper/jobs/{jobId}Returns one visible queue item.
POST /api/whisper/run-nowAdmin/manager endpoint for immediate queue processing pass.
Request body (optional):
{
"limit": 1
}
Each job includes:
status: queued|downloading|transcribing|finalizing|completed|failedprogress_percent: integer percent used by UI pollinglast_error: latest processing error texttranscript_text: populated when job is completed