Lokalny rejestrator spotkań CLI dla Linux: stereo-diaryzacja i podsumowanie LLM
Narzędzie CLI tapeback przechwytuje audio za pośrednictwem PipeWire/PulseAudio, transkrybuje z faster-whisper, rozdziela mówców na kanale stereo i generuje podsumowanie przez LLM. Wynik to plik Markdown w określonym katalogu, włączając vault Obsidian. Jedno polecenie uruchamia nagrywanie, Ctrl+C kończy pipeline: przechwytywanie → transkrypcja → diaryzacja → podsumowanie.
Obsługuje Zoom, Teams, Meet, Discord, Telegram. Przechwytywanie na poziomie systemowym, bez API usług.
tapeback start
# spotkanie
# Ctrl+C → przetwarzanie → Markdown
Stereo-rozdzielenie mówców
Architektura wykorzystuje stereo-WAV: lewy kanał to mikrofon ("Ty"), prawy to źródło monitora (inni). Whisper przetwarza kanały osobno. Diaryzacja pyannote stosowana jest tylko do prawego kanału dla numerowania Mówca 1, 2... Segmenty klasyfikowane są według energii RMS.
Fizyczne rozdzielenie eliminuje błędy klasteryzacji: brak pomylenia podobnych głosów, brak dzielenia jednego mówcy na klastry. GPU przyspiesza przetwarzanie, fallback na CPU w przypadku błędów CUDA.
┌─────────────┐ ┌──────────────┐ ┌────────────────────┐
│ Stereo │ │ Whisper │ │ Klasyfikacja │
│ plik WAV │───▶│ (na każdy │───▶│ według kanałów: │
│ L: mikrofon│ │ kanał │ │ L -> "Ty" │
│ R: monitor │ │ osobno) │ │ R -> pyannote │
└─────────────┘ └──────────────┘ │ dla Innych │
└────────────────────┘
Opcjonalne zależności
Podstawowa instalacja (~320 MB): nagrywanie + transkrypcja. Dodatkowe extras unikają niepotrzebnych 2 GB PyTorch:
| Wariant | Co dodaje | Rozmiar |
|---------|-----------|---------|
| tapeback | Nagrywanie + Whisper | ~320 MB |
| [llm] | Podsumowanie (Anthropic, OpenAI, Groq...) | +50 MB |
| [diarize] | pyannote + PyTorch | +2 GB |
| [tray] | Ikona w zasobniku systemowym | +1 MB |
Graceful degradation: bez pyannote prawy kanał to "Inni". Leniwy import w __init__.
Integracja LLM z fallbackiem
Obsługa 7 dostawców: Anthropic, OpenAI, Groq, Gemini, DeepSeek, OpenRouter, Qwen. Kompatybilne z OpenAI używają jednego API z base URL:
_OPENAI_COMPATIBLE_BASE_URLS = {
"groq": "https://api.groq.com/openai/v1",
"gemini": "https://generativelanguage.googleapis.com/v1beta/openai/",
"deepseek": "https://api.deepseek.com",
# ...
}
Błąd dostawcy → automatyczne przejście do następnego. Transkrypcja zawsze zapisywana. Podsumowanie w JSON wewnątrz Markdown:
## Summary
Krótki przegląd.
### Action Items
- [ ] **You:** Wyślij raport do piątku
- [ ] **Speaker 1:** Sprawdź PR
### Key decisions
- PostgreSQL zamiast MongoDB
Pakietowanie dla Arch Linux
W AUR 4 meta-pakiety:
tapeback– podstawowy.tapeback-tray– ikona w zasobniku.tapeback-llm– LLM.tapeback-diarize– PyTorch + pyannote.
Instalacja przez yay doinstalowuje pip-zależności w venv. Wydanie: release.sh + CI na PyPI (Trusted Publisher) + skrypty AUR.
yay -S tapeback tapeback-diarize tapeback-llm tapeback-tray
Konfig w ~/.config/tapeback/.env:
TAPEBACK_VAULT_PATH=~/Documents/obsidian/vault
Rozwój i lekcje
3 dni na MVP, 2 tygodnie na v0.8.9 (błędy, testy). Spec-driven: specyfikacje Markdown z kryteriami gotowości. Kod od Claude z recenzją. Sprawdzaj nazwy na PyPI/AUR wcześnie – normalizacja sprawia, że echo-vault == echovault.
Co jest ważne
- Stereo-rozdzielenie: mikrofon (Ty) vs monitor (Inni) – deterministyczne, bez probabilistycznych błędów pyannote.
- Lokalne przetwarzanie: faster-whisper + opcjonalny PyTorch, bez chmury.
- Modularność: extras dla diarize/llm/tray, graceful fallback.
- Integracja: Markdown w Obsidian z JSON-podsumowaniem (action items, decyzje).
- Instalacja:
uv tool install tapeback[tray,diarize,llm]lub AUR.
— Editorial Team
Brak komentarzy.