152 lines
5.5 KiB
Markdown
152 lines
5.5 KiB
Markdown
# Meeting Intelligence System
|
|
|
|
A fully self-hosted, zero-cost meeting intelligence system for Jeffsi Meet that provides:
|
|
- Automatic meeting recording via Jibri
|
|
- Local transcription via whisper.cpp (CPU-only)
|
|
- Speaker diarization (who said what)
|
|
- AI-powered summaries via Ollama
|
|
- Searchable meeting archive with dashboard
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────────┐
|
|
│ Netcup RS 8000 (Backend) │
|
|
│ │
|
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
|
|
│ │ Jibri │───▶│ Whisper │───▶│ AI Processor │ │
|
|
│ │ Recording │ │ Transcriber │ │ (Ollama + Summarizer) │ │
|
|
│ │ Container │ │ Service │ │ │ │
|
|
│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │
|
|
│ │ │ │ │
|
|
│ ▼ ▼ ▼ │
|
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
│ │ PostgreSQL + pgvector │ │
|
|
│ └─────────────────────────────────────────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Components
|
|
|
|
| Service | Port | Description |
|
|
|---------|------|-------------|
|
|
| PostgreSQL | 5432 | Database with pgvector for semantic search |
|
|
| Redis | 6379 | Job queue for async processing |
|
|
| Transcriber | 8001 | whisper.cpp + speaker diarization |
|
|
| API | 8000 | REST API for meetings, transcripts, search |
|
|
| Jibri | - | Recording service (joins meetings as hidden participant) |
|
|
|
|
## Deployment
|
|
|
|
### Prerequisites
|
|
|
|
1. Docker and Docker Compose installed
|
|
2. Ollama running on the host (for AI summaries)
|
|
3. Jeffsi Meet configured with recording enabled
|
|
|
|
### Setup
|
|
|
|
1. Copy environment file:
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
2. Edit `.env` with your configuration:
|
|
```bash
|
|
vim .env
|
|
```
|
|
|
|
3. Create storage directories:
|
|
```bash
|
|
sudo mkdir -p /opt/meetings/{recordings,audio}
|
|
sudo chown -R 1000:1000 /opt/meetings
|
|
```
|
|
|
|
4. Start services:
|
|
```bash
|
|
docker compose up -d
|
|
```
|
|
|
|
5. Check logs:
|
|
```bash
|
|
docker compose logs -f
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
Base URL: `https://meet.jeffemmett.com/api/intelligence`
|
|
|
|
### Meetings
|
|
- `GET /meetings` - List all meetings
|
|
- `GET /meetings/{id}` - Get meeting details
|
|
- `DELETE /meetings/{id}` - Delete meeting
|
|
|
|
### Transcripts
|
|
- `GET /meetings/{id}/transcript` - Get full transcript
|
|
- `GET /meetings/{id}/transcript/text` - Get as plain text
|
|
- `GET /meetings/{id}/speakers` - Get speaker statistics
|
|
|
|
### Summaries
|
|
- `GET /meetings/{id}/summary` - Get AI summary
|
|
- `POST /meetings/{id}/summary` - Generate summary
|
|
|
|
### Search
|
|
- `POST /search` - Search transcripts (text + semantic)
|
|
- `GET /search/suggest` - Get search suggestions
|
|
|
|
### Export
|
|
- `GET /meetings/{id}/export?format=markdown` - Export as Markdown
|
|
- `GET /meetings/{id}/export?format=json` - Export as JSON
|
|
- `GET /meetings/{id}/export?format=pdf` - Export as PDF
|
|
|
|
### Webhooks
|
|
- `POST /webhooks/recording-complete` - Jibri recording callback
|
|
|
|
## Processing Pipeline
|
|
|
|
1. **Recording** - Jibri joins meeting and records
|
|
2. **Webhook** - Jibri calls `/webhooks/recording-complete`
|
|
3. **Audio Extraction** - FFmpeg extracts audio from video
|
|
4. **Transcription** - whisper.cpp transcribes audio
|
|
5. **Diarization** - resemblyzer identifies speakers
|
|
6. **Embedding** - Generate vector embeddings for search
|
|
7. **Summary** - Ollama generates AI summary
|
|
8. **Ready** - Meeting available in dashboard
|
|
|
|
## Resource Usage
|
|
|
|
| Service | CPU | RAM | Storage |
|
|
|---------|-----|-----|---------|
|
|
| Transcriber | 8 cores | 12GB | 5GB (models) |
|
|
| API | 1 core | 2GB | - |
|
|
| PostgreSQL | 2 cores | 4GB | ~50GB |
|
|
| Jibri | 2 cores | 4GB | - |
|
|
| Redis | 0.5 cores | 512MB | - |
|
|
|
|
## Troubleshooting
|
|
|
|
### Transcription is slow
|
|
- Check CPU usage: `docker stats meeting-intelligence-transcriber`
|
|
- Increase `WHISPER_THREADS` in docker-compose.yml
|
|
- Consider using the `tiny` model for faster (less accurate) transcription
|
|
|
|
### No summary generated
|
|
- Check Ollama is running: `curl http://localhost:11434/api/tags`
|
|
- Check logs: `docker compose logs api`
|
|
- Verify model is available: `ollama list`
|
|
|
|
### Recording not starting
|
|
- Check Jibri logs: `docker compose logs jibri`
|
|
- Verify XMPP credentials in `.env`
|
|
- Check Prosody recorder virtual host configuration
|
|
|
|
## Cost Analysis
|
|
|
|
| Component | Monthly Cost |
|
|
|-----------|-------------|
|
|
| Jibri recording | $0 (local) |
|
|
| Whisper transcription | $0 (local CPU) |
|
|
| Ollama summarization | $0 (local) |
|
|
| PostgreSQL | $0 (local) |
|
|
| **Total** | **$0/month** |
|