Use local faster-whisper only for transcription.
Drop cloud and Ollama engine choices so audio stays on-machine via Docker Whisper, and tighten orphan detection plus UI around a single local flow.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# AndyTranscribe
|
||||
|
||||
Upload pocket-recorder audio (MP3, WAV, OGG, and more), extract embedded metadata, and transcribe with OpenAI Whisper, a local faster-whisper server, or a remote OpenAI-compatible endpoint.
|
||||
Upload pocket-recorder audio (MP3, WAV, OGG, and more), extract embedded metadata, and transcribe locally with [faster-whisper-server](https://github.com/fedirz/faster-whisper-server) via Docker. Audio never leaves your machine.
|
||||
|
||||
Built with Laravel 13, Blade, Tailwind CSS 4, and [Laravel AI](https://github.com/laravel/ai).
|
||||
|
||||
@@ -9,11 +9,9 @@ Built with Laravel 13, Blade, Tailwind CSS 4, and [Laravel AI](https://github.co
|
||||
- Upload common audio formats (MP3, WAV, OGG, FLAC, M4A, AAC, WebM, WMA, AIFF — up to 100 MB)
|
||||
- Automatic metadata extraction when tags are present (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](https://github.com/fedirz/faster-whisper-server) via Docker
|
||||
- **Ollama host** — user-supplied host URL exposing `/v1/audio/transcriptions`
|
||||
- Queued local transcription (faster-whisper in Docker)
|
||||
- Live transcription progress (stage, %, elapsed time)
|
||||
- Stop or restart a run anytime
|
||||
- Copy finished transcripts from the recording detail page
|
||||
|
||||
## Requirements
|
||||
@@ -22,9 +20,7 @@ Built with Laravel 13, Blade, Tailwind CSS 4, and [Laravel AI](https://github.co
|
||||
- Composer
|
||||
- Node.js & npm
|
||||
- SQLite (default) or another supported database
|
||||
- For **cloud** transcription: an OpenAI API key
|
||||
- For **local** transcription: [Docker](https://docs.docker.com/get-docker/) (runs Whisper in a container)
|
||||
- For **remote** transcription: a host with an OpenAI-compatible transcription API
|
||||
- [Docker](https://docs.docker.com/get-docker/) for the Whisper container
|
||||
|
||||
## Setup
|
||||
|
||||
@@ -48,7 +44,7 @@ npm run build
|
||||
|
||||
## Local Whisper (Docker)
|
||||
|
||||
The **Local** engine does not run Whisper inside PHP. It calls an OpenAI-compatible HTTP API. This project ships Compose for that:
|
||||
Transcription calls an OpenAI-compatible HTTP API. This project ships Compose for that:
|
||||
|
||||
```bash
|
||||
# CPU (works everywhere; slower on long files)
|
||||
@@ -74,20 +70,15 @@ Stop:
|
||||
docker compose down
|
||||
```
|
||||
|
||||
Without this container, **Cloud** and **Ollama host** still work; only **Local** needs Docker.
|
||||
|
||||
## 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://127.0.0.1:8090/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 |
|
||||
| `WHISPER_HOST_PORT` | Host port published by Compose (default `8090`) |
|
||||
| `TRANSCRIPTION_TIMEOUT` | Job/HTTP timeout in seconds (default `600`) |
|
||||
| `DB_QUEUE_RETRY_AFTER` | Database queue retry window; must exceed `TRANSCRIPTION_TIMEOUT` (default `660`) |
|
||||
@@ -99,21 +90,17 @@ Ensure `APP_URL` matches how you access the app (default `http://localhost:8000`
|
||||
|
||||
## Running locally
|
||||
|
||||
Start the app, queue worker, and Vite together:
|
||||
|
||||
```bash
|
||||
composer run dev
|
||||
```
|
||||
|
||||
For confidential local transcription, also start Whisper:
|
||||
Start Whisper, then the app stack:
|
||||
|
||||
```bash
|
||||
docker compose up -d whisper
|
||||
composer run dev
|
||||
```
|
||||
|
||||
Or separately:
|
||||
|
||||
```bash
|
||||
docker compose up -d whisper
|
||||
php artisan serve
|
||||
php artisan queue:work
|
||||
npm run dev
|
||||
@@ -126,18 +113,10 @@ Transcription jobs are queued — keep a queue worker running or jobs will stay
|
||||
## Usage
|
||||
|
||||
1. **Upload** audio from Recordings → Upload (optional title override).
|
||||
2. Open the recording and choose a transcription engine.
|
||||
3. Watch live progress on the recording page until the transcript appears.
|
||||
2. Open the recording and start transcription.
|
||||
3. Watch live progress until the transcript appears (or stop and restart).
|
||||
4. 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 | `docker compose up -d whisper` |
|
||||
| `ollama` | Another machine on your network | Host URL + OpenAI-compatible `/v1/audio/transcriptions` |
|
||||
|
||||
## Tests
|
||||
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user