FastWhisper is a local-first workspace for turning recordings into transcripts and optional meeting minutes. It ships with audio upload, task history, current-task inspection, retry/delete actions, and optional speaker diarization or LLM-powered minutes.
- Local-first by default:
SQLite + inline task execution - You can run the main workflow without PostgreSQL or Redis
- The default experience focuses on transcription and task review
- Speaker diarization and meeting minutes are optional enhancements
- Audio upload and task creation
- faster-whisper transcription
- Task history, detail view, retry, and delete
- Optional speaker diarization
- Uses
pyannotewhen full dependencies and a Hugging Face token are available - Falls back to local clustering when the pipeline is unavailable
- Uses
- Optional structured meeting minutes
- Disabled by default
- Enabled when LLM settings are configured
- Python 3.11
- FastAPI
- SQLAlchemy
- SQLite by default
- Optional PostgreSQL + separate worker mode
- faster-whisper
- Optional pyannote.audio
- Vue 3
- Vite
- Pinia
- Vue Router
- Tailwind CSS
Recommended for getting started quickly.
- Database: SQLite
- Task execution: inline inside the API process
- Dependency file:
requirements-local.txt - LLM minutes disabled by default
Recommended when you want a separate worker process or a PostgreSQL-backed setup.
- Database: PostgreSQL
- Task execution: API + dedicated worker
- Dependency file:
requirements.txt - Works with Docker Compose
Notes:
- The current codebase does not require a standalone message queue for the main workflow.
docker-compose.ymlstill includes PostgreSQL / Redis services for full deployments and compatibility.
- Python
3.11 - Node.js
18+ - npm
The repo pins Python 3.11 via .python-version and pyproject.toml.
- Copy backend config
cp .env.example .env- Create frontend config
cat > frontend/.env <<'EOF'
VITE_API_TOKEN=your_secure_token_here
EOF- Start everything
./dev.sh allDefault addresses:
- Frontend:
http://localhost:3000 - Backend:
http://localhost:8000 - API docs:
http://localhost:8000/docs
If your backend is running on a different port, override the Vite proxy target:
VITE_DEV_API_TARGET=http://localhost:18000 ./dev.sh frontend# Start backend (automatically chooses local or full mode)
./dev.sh backend
# Start frontend only
./dev.sh frontend
# Start everything
./dev.sh all
# Start dedicated worker (full mode only)
./dev.sh worker
# Stop services
./dev.sh stop
# Show service status
./dev.sh statuspip install -r requirements-local.txt
cp .env.example .env
mkdir -p storage/uploads storage/results
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reloadNo separate worker is needed in local mode.
pip install -r requirements.txt
cp .env.example .env
mkdir -p storage/uploads storage/results
alembic upgrade head
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
python -m app.workercp .env.example .env
docker compose up -d
docker compose logs -fMain backend settings live in .env:
# Default local database
DATABASE_URL=sqlite+aiosqlite:///./storage/fastwhisper.db
# API auth
API_TOKEN=your_secure_token_here
# Whisper
WHISPER_MODEL=large-v3
WHISPER_DEVICE=cuda
WHISPER_COMPUTE_TYPE=float16
# Runtime mode
TASK_RUNNER=inline
# Optional enhancements
ENABLE_SPEAKER_DIARIZATION=true
ENABLE_LLM_MINUTES=false
HUGGINGFACE_TOKEN=your_huggingface_token
LLM_API_KEY=your_llm_api_key
LLM_MODEL=qwen-max
LLM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1Main frontend setting in frontend/.env:
VITE_API_TOKEN=your_secure_token_hereDuring development, /api and /health are proxied to http://localhost:8000 by default.
Use VITE_DEV_API_TARGET if your backend runs elsewhere.
If you only want the core flow working first:
WHISPER_MODEL=small
WHISPER_DEVICE=cpu
TASK_RUNNER=inline
ENABLE_LLM_MINUTES=falseIf you want better diarization:
- install full dependencies from
requirements.txt - set
HUGGINGFACE_TOKEN - keep
ENABLE_SPEAKER_DIARIZATION=true
If you want meeting minutes:
- set
LLM_API_KEY - set
ENABLE_LLM_MINUTES=true
| Method | Path | Description |
|---|---|---|
POST |
/api/v1/tasks |
Upload audio and create a task |
GET |
/api/v1/tasks |
List tasks |
GET |
/api/v1/tasks/{task_id} |
Get task details |
GET |
/api/v1/tasks/{task_id}/progress |
Get task progress |
GET |
/api/v1/tasks/{task_id}/minutes |
Get minutes and transcript |
POST |
/api/v1/tasks/{task_id}/retry |
Retry a failed task |
DELETE |
/api/v1/tasks/{task_id} |
Delete a task |
GET |
/api/v1/tasks/stats/overview |
Get task statistics |
GET |
/health |
Health check |
# Backend tests
pip install -r requirements-test.txt
pytest -q
# Frontend build
cd frontend && npm run build- Left rail: task history
- Right workspace: upload and current task
- Built-in Chinese / English UI switch
fastwhisper/
├── app/ # FastAPI app and services
├── alembic/ # Database migrations
├── frontend/ # Vue frontend
├── docs/screenshots/ # README screenshots
├── storage/ # Uploads and generated output
├── requirements-local.txt
├── requirements.txt
├── requirements-test.txt
├── dev.sh
├── docker-compose.yml
├── README.md
└── README.zh.md
MIT

