268 lines
7.4 KiB
Markdown
268 lines
7.4 KiB
Markdown
# Meeting Audio Summarizer
|
|
|
|
Dieses Python-Programm transkribiert Audio-Dateien von Meetings mit Whisper (lokal) und erstellt automatisch eine Zusammenfassung mit einem LLM über eine OpenAI-kompatible API.
|
|
|
|
## Features
|
|
|
|
- 🎤 **Lokale Transkription** mit OpenAI Whisper (keine Cloud erforderlich)
|
|
- 🤖 **Flexible LLM-Integration** über OpenAI-kompatible APIs
|
|
- 📝 **Strukturierte Zusammenfassungen** mit Hauptthemen, Entscheidungen und Action Items
|
|
- 🔄 **Provider-unabhängig** - funktioniert mit OpenAI, Anthropic, Ollama, LM Studio, etc.
|
|
- 💾 **Automatisches Speichern** von Transkript und Zusammenfassung
|
|
|
|
## Installation
|
|
|
|
### Voraussetzungen
|
|
|
|
- Python 3.8 oder höher
|
|
- ffmpeg (für Audio-Verarbeitung)
|
|
|
|
#### ffmpeg Installation
|
|
|
|
**Ubuntu/Debian:**
|
|
```bash
|
|
sudo apt update
|
|
sudo apt install ffmpeg
|
|
```
|
|
|
|
**macOS:**
|
|
```bash
|
|
brew install ffmpeg
|
|
```
|
|
|
|
**Windows:**
|
|
Lade ffmpeg von https://ffmpeg.org/download.html herunter und füge es zum PATH hinzu.
|
|
|
|
### Python-Pakete installieren
|
|
|
|
```bash
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
Whisper benötigt beim ersten Start einige Zeit zum Herunterladen der Modelle.
|
|
|
|
## Konfiguration
|
|
|
|
### API-Key setzen
|
|
|
|
Setze deinen API-Key als Umgebungsvariable:
|
|
|
|
```bash
|
|
export OPENAI_API_KEY="dein-api-key"
|
|
```
|
|
|
|
Oder übergebe ihn direkt beim Aufruf mit `--api-key`.
|
|
|
|
### Alternative LLM-Provider
|
|
|
|
Das Programm funktioniert mit jedem OpenAI-kompatiblen Endpunkt:
|
|
|
|
#### Ollama (lokal)
|
|
```bash
|
|
python meeting_summarizer.py meeting.mp3 \
|
|
--api-base http://localhost:11434/v1 \
|
|
--api-key ollama \
|
|
--model llama3.2 \
|
|
--language german
|
|
```
|
|
|
|
#### LM Studio (lokal)
|
|
```bash
|
|
python meeting_summarizer.py meeting.mp3 \
|
|
--api-base http://localhost:1234/v1 \
|
|
--api-key lm-studio \
|
|
--model local-model \
|
|
--language english
|
|
```
|
|
|
|
#### Anthropic Claude (via OpenAI-Kompatibilitätslayer)
|
|
```bash
|
|
python meeting_summarizer.py meeting.mp3 \
|
|
--api-base https://api.anthropic.com/v1 \
|
|
--api-key $ANTHROPIC_API_KEY \
|
|
--model claude-3-5-sonnet-20241022 \
|
|
--language german
|
|
```
|
|
|
|
#### OpenRouter
|
|
```bash
|
|
python meeting_summarizer.py meeting.mp3 \
|
|
--api-base https://openrouter.ai/api/v1 \
|
|
--api-key $OPENROUTER_API_KEY \
|
|
--model anthropic/claude-3.5-sonnet \
|
|
--language spanish
|
|
```
|
|
|
|
## Verwendung
|
|
|
|
### Basis-Verwendung
|
|
|
|
```bash
|
|
python meeting_summarizer.py meeting.mp3
|
|
```
|
|
|
|
Dies erstellt:
|
|
- `meeting_transcript.txt` - Vollständiges Transkript
|
|
- `meeting_summary.txt` - Zusammenfassung
|
|
|
|
### Mit Optionen
|
|
|
|
```bash
|
|
python meeting_summarizer.py meeting.wav \
|
|
--whisper-model medium \
|
|
--model gpt-4 \
|
|
--language german \
|
|
--output-dir ./summaries \
|
|
--api-base https://api.openai.com/v1
|
|
```
|
|
|
|
### Alle Optionen
|
|
|
|
```
|
|
Optionen:
|
|
audio_file Pfad zur Audio-Datei (mp3, wav, m4a, etc.)
|
|
|
|
--whisper-model MODEL Whisper-Modellgröße (default: base)
|
|
Optionen: tiny, base, small, medium, large
|
|
|
|
--api-base URL Base URL für OpenAI-kompatible API
|
|
(default: https://api.openai.com/v1)
|
|
|
|
--api-key KEY API-Key (nutzt OPENAI_API_KEY wenn nicht angegeben)
|
|
|
|
--model MODEL LLM-Modellname (default: gpt-4)
|
|
|
|
--language LANG Sprache für die Zusammenfassung (default: english)
|
|
Beispiele: english, german, spanish, french, turkish
|
|
|
|
--output-dir DIR Ausgabeverzeichnis für Transkript und Zusammenfassung
|
|
(default: gleiches Verzeichnis wie Audio-Datei)
|
|
|
|
--no-transcript Vollständiges Transkript nicht speichern
|
|
```
|
|
|
|
## Whisper-Modelle
|
|
|
|
Die Wahl des Whisper-Modells beeinflusst Geschwindigkeit und Genauigkeit:
|
|
|
|
| Modell | Parameter | Geschwindigkeit | Genauigkeit | Empfehlung |
|
|
|--------|-----------|-----------------|-------------|------------|
|
|
| tiny | 39M | Sehr schnell | Niedrig | Schnelle Tests |
|
|
| base | 74M | Schnell | Gut | **Standard** |
|
|
| small | 244M | Mittel | Sehr gut | Gute Balance |
|
|
| medium | 769M | Langsam | Ausgezeichnet | Hohe Qualität |
|
|
| large | 1550M | Sehr langsam | Beste | Produktionsumgebung |
|
|
|
|
**Empfehlung für Meetings:** `base` oder `small` für gute Balance zwischen Geschwindigkeit und Qualität.
|
|
|
|
## Unterstützte Audio-Formate
|
|
|
|
Alle Formate, die von ffmpeg unterstützt werden:
|
|
- MP3
|
|
- WAV
|
|
- M4A
|
|
- FLAC
|
|
- OGG
|
|
- WMA
|
|
- AAC
|
|
|
|
## Sprach-Handling
|
|
|
|
Das Programm unterscheidet zwischen zwei Spracheinstellungen:
|
|
|
|
### Transkription (Input)
|
|
- **Whisper erkennt die Sprache automatisch** - du musst nichts einstellen
|
|
- Die Audio-Datei kann in jeder Sprache sein (Deutsch, Englisch, Spanisch, etc.)
|
|
- Whisper transkribiert das Audio in der Originalsprache
|
|
|
|
### Zusammenfassung (Output)
|
|
- **Der `--language` Parameter steuert die Ausgabesprache** der Zusammenfassung
|
|
- Du kannst z.B. ein deutsches Meeting transkribieren und eine englische Zusammenfassung erhalten
|
|
- Alle Prompts an das LLM sind auf Englisch, aber das LLM antwortet in der gewünschten Sprache
|
|
|
|
**Beispiel:**
|
|
```bash
|
|
# Deutsches Meeting → Deutsche Zusammenfassung
|
|
python meeting_summarizer.py german-meeting.mp3 --language german
|
|
|
|
# Deutsches Meeting → Englische Zusammenfassung
|
|
python meeting_summarizer.py german-meeting.mp3 --language english
|
|
|
|
# Türkisches Meeting → Türkische Zusammenfassung
|
|
python meeting_summarizer.py turkish-meeting.mp3 --language turkish
|
|
```
|
|
|
|
## Programmatische Verwendung
|
|
|
|
Du kannst das Programm auch als Modul verwenden:
|
|
|
|
```python
|
|
from meeting_summarizer import MeetingSummarizer
|
|
|
|
# Initialisiere den Summarizer
|
|
summarizer = MeetingSummarizer(
|
|
whisper_model="base",
|
|
api_base_url="http://localhost:11434/v1",
|
|
api_key="ollama",
|
|
model_name="llama3.2",
|
|
output_language="german"
|
|
)
|
|
|
|
# Verarbeite ein Meeting
|
|
transcript, summary = summarizer.process_meeting(
|
|
audio_path="meeting.mp3",
|
|
output_dir="./output",
|
|
save_transcript=True
|
|
)
|
|
|
|
print(summary)
|
|
```
|
|
|
|
## Performance-Tipps
|
|
|
|
### Für schnellere Transkription:
|
|
- Nutze kleinere Whisper-Modelle (`tiny` oder `base`)
|
|
- Nutze GPU-Beschleunigung (CUDA) falls verfügbar
|
|
- Whisper installiert automatisch die passende Version für deine Hardware
|
|
|
|
### Für bessere Qualität:
|
|
- Nutze größere Whisper-Modelle (`medium` oder `large`)
|
|
- Stelle sicher, dass die Audio-Qualität gut ist
|
|
- Whisper erkennt die Sprache des Audios automatisch
|
|
- Mit `--language` bestimmst du die Sprache der **Zusammenfassung**, nicht der Transkription
|
|
|
|
## Tipps für embedded Systems
|
|
|
|
Da du mit embedded Systems arbeitest, hier einige Hinweise für ressourcenbeschränkte Umgebungen:
|
|
|
|
- **Raspberry Pi:** Nutze `tiny` oder `base` Modell
|
|
- **Echtzeit-Verarbeitung:** Whisper ist nicht für Echtzeit optimiert, verarbeite Aufnahmen nachträglich
|
|
- **Speicher:** `base` benötigt ~140MB RAM, `large` ~3GB
|
|
- **Alternative:** Nutze Whisper.cpp für C++-Integration in embedded Systems
|
|
|
|
## Troubleshooting
|
|
|
|
### "No module named 'whisper'"
|
|
```bash
|
|
pip install openai-whisper
|
|
```
|
|
|
|
### "ffmpeg not found"
|
|
Installiere ffmpeg (siehe Installationsanleitung oben)
|
|
|
|
### "API key not provided"
|
|
Setze die Umgebungsvariable oder übergebe `--api-key`
|
|
|
|
### Langsame Transkription
|
|
Nutze ein kleineres Modell oder aktiviere GPU-Beschleunigung
|
|
|
|
## Lizenz
|
|
|
|
Frei verwendbar für private und kommerzielle Zwecke.
|
|
|
|
## Hinweise
|
|
|
|
- Whisper läuft komplett lokal - keine Audio-Daten werden gesendet
|
|
- Nur der transkribierte Text wird an das LLM gesendet
|
|
- Achte auf Datenschutz bei sensiblen Meeting-Inhalten
|
|
- Die Qualität der Zusammenfassung hängt vom gewählten LLM ab |