67c1941833858072f4046d787918a3653fb65575
Accept WAV, OGG, FLAC, M4A, and related uploads, and read metadata from non-ID3 tag formats.
AndyTranscribe
Upload pocket-recorder MP3s, extract ID3 metadata, and transcribe them with OpenAI Whisper, a local faster-whisper server, or a remote OpenAI-compatible endpoint.
Built with Laravel 13, Blade, Tailwind CSS 4, and Laravel AI.
Features
- Upload MP3s (up to 100 MB) and store them on the local disk
- Automatic ID3 metadata extraction (title, artist, album, duration, recorded date)
- Search recordings by title, artist, or transcript
- Queued transcription with three engines:
- Cloud — OpenAI Whisper (
whisper-1) - Local — confidential; OpenAI-compatible faster-whisper-server (e.g. Docker on this machine)
- Ollama host — user-supplied host URL exposing
/v1/audio/transcriptions
- Cloud — OpenAI Whisper (
- Copy finished transcripts from the recording detail page
Requirements
- PHP 8.3+ (8.5 recommended)
- Composer
- Node.js & npm
- SQLite (default) or another supported database
- For cloud transcription: an OpenAI API key
- For local transcription: a running faster-whisper-server
- For remote transcription: a host with an OpenAI-compatible transcription API
Setup
composer setup
That installs PHP and JS dependencies, copies .env if needed, generates the app key, runs migrations, and builds frontend assets.
Or step by step:
composer install
cp .env.example .env
php artisan key:generate
touch database/database.sqlite # if using SQLite
php artisan migrate
npm install
npm run build
Configuration
Copy values from .env.example. The transcription-related settings are:
| Variable | Purpose |
|---|---|
OPENAI_API_KEY |
Required for cloud Whisper |
OPENAI_URL |
OpenAI API base URL (default https://api.openai.com/v1) |
LOCAL_WHISPER_URL |
Local faster-whisper base URL (default http://localhost:8000/v1) |
LOCAL_WHISPER_API_KEY |
API key for local server (often unused) |
LOCAL_WHISPER_MODEL |
Model name for local transcription |
REMOTE_WHISPER_MODEL |
Model name for Ollama-host transcription |
TRANSCRIPTION_TIMEOUT |
Job/HTTP timeout in seconds (default 600) |
QUEUE_CONNECTION |
Use database (default) so transcription runs in the background |
Ensure APP_URL matches how you access the app (default http://localhost:8000).
Running locally
Start the app, queue worker, and Vite together:
composer run dev
Or separately:
php artisan serve
php artisan queue:work
npm run dev
Open http://localhost:8000/recordings.
Transcription jobs are queued — keep a queue worker running or jobs will stay pending.
Usage
- Upload an MP3 from Recordings → Upload (optional title override).
- Open the recording and choose a transcription engine.
- Wait for the queue job to finish, then refresh to view or copy the transcript.
- Search the list by title, artist, or transcript text.
Transcription engines
| Driver | When to use | Needs |
|---|---|---|
cloud |
Fastest path; audio leaves your machine | OPENAI_API_KEY |
local |
Confidential; audio stays on this machine | faster-whisper-server at LOCAL_WHISPER_URL |
ollama |
Another machine on your network | Host URL + OpenAI-compatible /v1/audio/transcriptions |
Tests
composer test
# or
php artisan test
License
MIT
Languages
PHP
59.3%
Blade
34.9%
JavaScript
2.5%
Shell
2.3%
Dockerfile
0.9%
Other
0.1%