WhisperNotes
Handbuch
FastAPI-Wrapper um whisper.cpp – nativ auf macOS (Apple Silicon, Metal) oder als Docker-Container unter Linux mit AMD-, NVIDIA- oder ohne GPU (docker.md). Ursprüngliche Spezifikation: spezifikation.md.
- OpenAI-kompatibel:
POST /für Discord, Home Assistant & Co. (beliebiger API-Key)v1/ audio/ transcriptions - On-Demand:
whisper-startet beim ersten Request (Metal) und wird nach 120 s Leerlauf beendetserver - Sequenziell: parallele Requests werden eingereiht; Batch-Jobs geben zwischen ihren Chunks Vorrang an Live-Requests
- Dashboard (
/): Upload langer Aufnahmen → 5-Minuten-Chunks → Master-Transkript → Map-Reduce-Zusammenfassungdashboard/ - Ollama: in den Einstellungen kann ein festes Modell aus den installierten Modellen (
/) gewählt werden, oder standardmäßig immer das aktuell geladene Modell (api/ tags /) genutzt werdenapi/ ps - Sprechererkennung (optional): standardmäßig sherpa-onnx
(pyannote-Segmentierung 3.0 + CAM++, CPU, parallel zu Whisper), alternativ
pyannote.audio community-1 (
DIARIZATION_, brauchtENGINE=pyannote HF_). Erkannte Stimmen werden im Dashboard per Hörprobe Namen zugeordnet;TOKEN tools/vergleicht Engines und Modelle an einer echten Aufnahmediarize_ benchmark. py - DnD-Tab: Kampagnen mit Runde (Spieler/Charaktere/DM) und Glossar; Sessions werden mit Sprechern transkribiert und nach der Zuordnung als Session-Recap zusammengefasst (Handlung, NPCs & Orte, Kämpfe, Beute, offene Handlungsstränge, Zitate). Der Rückblick der vorherigen Session fließt als Kontext ein.
Installation auf dem Mac
git clone <repo-url> ~/WhisperNotes && cd ~/WhisperNotes
bash deploy/setup_mac.sh
Das Skript installiert per Homebrew cmake ffmpeg uv node, baut whisper- mit Metal, lädt
ggml-, erzeugt backend/, führt die Tests aus, baut das Dashboard und
richtet den LaunchAgent com. ein (Autostart, Logs unter ~/).
Update: git pull && bash deploy/
Dienst steuern:
launchctl kickstart -k gui/$(id -u)/com.whispernotes
Clients anbinden
| Client | Einstellung |
|---|---|
| Home Assistant | z. B. HACS-Integration „OpenAI Whisper Speech-to-Text API“: URL http:/, Modell whisper-, API-Key = API_ (ohne Zugangsschutz beliebig) |
| Eigene Skripte | openai-SDK mit base_, api_ |
Für kurze Sprachbefehle lohnt ein eigenes, schnelles Modell für die API: Einstellungen → Transkription →
„Modell für die /v1-API“ (bzw. API_).
Optionale Header pro Request:
| Header | Wirkung |
|---|---|
X-, X-, X-, X- | werden mit dem Text in gespeichert |
X- | Text zusätzlich über Ollama nachbearbeiten → |
Ergebnisse der Dashboard-Jobs liegen unter .
Datenordner
Aufnahmen, Transkripte, Kampagnen, Stimmprofile und die im Dashboard geänderten Einstellungen (settings.)
liegen im Datenordner DATA_. Standard:
| System | Ort |
|---|---|
| Docker | / im Volume (docker/) |
| macOS | ~/ |
| Linux | ~/ (bzw. $XDG_) |
| Windows | %LOCALAPPDATA%\WhisperNotes |
Ältere Installationen hatten ihn in backend/. Existiert dieser Ordner, wird er weiter genutzt.
Zugang
Ohne weitere Einstellung ist WhisperNotes offen. Das ist fürs Heimnetz gedacht. Für den Betrieb dahinter (Reverse-Proxy, VPN, Internet) gibt es zwei Einstellungen, im Dashboard unter Einstellungen → Zugang oder per Umgebung:
| Variable | Wirkung |
|---|---|
API_ | / und / verlangen Authorization: Bearer – Home Assistant (API-Key), Discord-Bot (WHISPERNOTES_), Skripte |
DASHBOARD_ | Anmeldung im Dashboard; leer = Anmeldung mit dem API-Schlüssel |
Die Anmeldung ist ein signiertes Cookie (30 Tage). Ändert sich Passwort oder Schlüssel, sind alle Anmeldungen
ungültig. / bleibt offen, verrät ohne Anmeldung aber nur Sprache und Anmeldepflicht. Links aus BasaltNotes
führen ohne Anmeldung zur Anmeldeseite und danach zum Dokument. Für den Betrieb im Internet gehört HTTPS davor
(Reverse-Proxy).
Sprache und Vorlagen
LANGUAGE (de oder en, Einstellungen → Allgemein) gilt für Dashboard, Statusmeldungen und Zusammenfassungen.
Was in den Aufnahmen gesprochen wird, legt WHISPER_ fest. Bei en nutzt das D&D-Glossar die englischen
Regelbegriffe.
Die Vorlagen der Dokumente (Zusammenfassung, Session-Recap, Recap je Spielercharakter, Welt & Lore) lassen sich unter
Einstellungen → Vorlagen anpassen: Abschnitte, Länge, Ton. Leer heißt, dass die eingebaute Vorlage der Sprache
gilt (backend/). Die Regeln hängt WhisperNotes immer an: nichts erfinden, Zeitangaben auflösen,
Charakternamen statt Spielernamen. Beim Session-Recap sollte die Überschrift „Was bisher geschah“ bzw. „Previously“
bleiben. Ihr Abschnitt fließt als Rückblick in die nächste Session ein.
API-Überblick
| Methode | Pfad | Zweck |
|---|---|---|
| POST | / | Transkription (file, optional language, prompt, response_) |
| GET | / | Wrapper-, Whisper- und Ollama-Status inkl. ollama_ (ohne Anmeldung nur language, auth_) |
| POST | / · / | Dashboard-Anmeldung ({"password": …}), setzt bzw. löscht das Cookie |
| POST | / | Datei für das Batch-Processing hochladen |
| GET | / | Fortschritt als Server-Sent Events |
| GET | / | Rohtranskript |
| GET | / | KI-Zusammenfassung (Markdown) |
| POST | / | Zusammenfassung erneut erzeugen (z. B. nachdem ein Modell geladen wurde) |
Discord-Bot
Der Bot (discord-) nimmt Gespräche in Voice-Channels auf – jede Person als eigene Spur – und
schickt sie als normale Aufnahme an WhisperNotes. Die Sprecher stehen damit fest (keine Sprechererkennung
nötig), die Namen kommen aus Discord. Die fertige Zusammenfassung erscheint im Dashboard und wird zusätzlich in
den Discord-Channel gepostet, in dem die Aufnahme gestartet wurde. DnD-Recaps landen in dem Channel, der in der
Kampagne ausgewählt ist.
| Befehl | Wirkung |
|---|---|
/ | Aufnahme im eigenen Voice-Channel starten |
/ | beenden und verarbeiten lassen (automatisch, wenn der Channel leer ist oder nach 6 h) |
/ | läuft gerade eine Aufnahme? |
Einrichtung:
- Discord Developer Portal → New Application → Bot →
Reset Token (Token kopieren). Bot mit den Scopes
botundapplications.sowie den Rechten View Channels, Send Messages, Embed Links, Attach Files und Connect einladen (commands permissions=1099776). - Docker:
docker/anlegen und mitdiscord. env -starten (siehe docker.md). Auf dem Mac (Node ≥ 22.12):- profile discord discord-ausbot/ . env .anlegen,env. example DISCORD_(und bei ZugangsschutzTOKEN WHISPERNOTES_) eintragen, dannAPI_ KEY bash deploy/– der Bot läuft danach als LaunchAgentsetup_ mac. sh com.(Log:whispernotes. discord ~/).Library/ Logs/ whispernotes/ discord- bot. log
Aufgenommen wird unter Discords Ende-zu-Ende-Verschlüsselung (DAVE, Pflicht seit März 2026) mit
@discordjs/; npm run probe (/) prüft das bei Problemen isoliert.
Gespräche nur mit Einverständnis aller Anwesenden aufnehmen – der Bot kündigt jede Aufnahme im Channel an.
Entwicklung unter Windows
Ohne Mac wird whisper- durch backend/ ersetzt:
pip install uv && cd backend && uv sync
cd backend && uv run pytest -q
cd backend && .venv/Scripts/python -m uvicorn app.main:app --port 8000 --env-file .env.dev
Frontend mit Hot-Reload (Proxy auf Port 8000): cd frontend && npm install && npm run dev, dann
http:/. Für Dashboard-Jobs wird lokal ffmpeg/ffprobe im PATH benötigt.
Wichtige Einstellungen (backend/.env )
| Variable | Standard | Bedeutung |
|---|---|---|
IDLE_ | 120 | Sekunden Leerlauf bis whisper- beendet wird |
INFERENCE_ | 180 | max. Sekunden pro Request/Chunk, danach Prozess-Kill und HTTP 500 |
CHUNK_ / CHUNK_ | 300 / 10 | Slicing langer Dateien |
AUDIO_ | 10 | Speicherlimit für Audio-Uploads; älteste Audiodateien werden gelöscht, Transkripte bleiben. 0 = unbegrenzt |
OLLAMA_ | – | festes Modell für Zusammenfassungen; leer = automatisch das aktuell geladene Modell |
OLLAMA_ | – | nur bei „automatisch“ genutzt, wenn in Ollama gerade kein Modell geladen ist |
LOGBOOK_ | metadata | off, metadata (nur Requests mit Metadaten-Headern) oder all |
LANGUAGE | de | Sprache von Dashboard, Meldungen und Zusammenfassungen (de, en) |
API_ / DASHBOARD_ | – | Zugangsschutz, siehe Zugang |
DATA_ | je System | siehe Datenordner |
OLLAMA_ | http:/ | Ollama oder ein Proxy davor |
Vollständige Liste: backend/.env.example, backend/app/config.py.