AI-powered voice transcription for desktop and web
Live-Speech-to-Text, YouTube- und Datei-Transkription, plus Transcript-Management.
Features • Screenshots • Quick Start • Usage • Architektur • Endpunkte • Konfiguration • Troubleshooting
-
🎤 Live-Mikrofontranskription
- Globaler Hotkey (
Ctrl+Alt+Sals Standard) für Start/Stop (toggle) oder Press-and-hold (push_to_talk). - Zwei STT-Modi: Live-Stream über Audio-Frames oder Aufzeichnung + Transkription nach Start.
- Laufzeitereignisse über WebSocket (
state,status,transcript,audio_level,input_warning,session_*,history_updated,error). - Text-Injektion in aktive App:
auto,sendinput,paste,type.
- Globaler Hotkey (
-
📺 YouTube-Transkription
- Suche über YouTube-API (
search) und Video-Lookup via URL/ID. - Download + Transkriptions-Job (
queued -> transcribing -> completed/failed). - Persistierung als Transcript-Eintrag.
- Suche über YouTube-API (
-
📁 Datei-Transkription
- Multipart Upload via
POST /api/file/transcribe. - Unterstützte Dateitypen:
.mp3,.m4a,.wav,.ogg,.flac,.aac,.mp4,.mov,.webm,.avi,.mkv,.m4v. - Videoformate mit Audio-Extraktion:
.mp4,.mov,.webm,.avi,.mkv,.flv,.wmv,.m4v. - Upload-Limits: Audio standardmäßig
200 MB, Video-Rohdatei standardmäßig2048 MB, extrahiertes Audio wird auf200 MBbegrenzt.
- Multipart Upload via
-
🧠 Mehrere STT-Provider + Fallbacks
- Provider: Soniox, Mistral, AssemblyAI, Deepgram, OpenAI, Azure, Gladia, Groq, Speechmatics, ElevenLabs, Google, AWS Transcribe sowie lokale ONNX/NeMo.
- Zuordnung via
ProviderRouter, Circuit-Breaker und Retry-Scheduler. - Laufende Jobs können nach Neustart des Backends automatisch fortgesetzt werden.
-
🧾 Transcript-Management
- SQLite-Persistenz (
transcripts.db), Suche, Filter und Paginierung. - Export als
pdfoderdocx. - Manueller oder automatischer Zusammenfassungsfluss (
AUTO_SUMMARIZE).
- SQLite-Persistenz (
-
🖥️ UI-/Betriebsmodi
- Web UI (
Vite) mit Seiten: Live Mic, YouTube, File, Transcript-Detail, Settings. - Tray-Modus (
src.tray) startet Backend + Web UI. - Tkinter-Fallback (
src.main) wenn kein Frontend/Node vorhanden ist.
- Web UI (
-
📦 Lokale Modelle
- ONNX-Modell-Management inkl. Quantisierung (
int8,fp16,fp32). - NeMo-Modell-Management inkl. Download, Fortschritt und Löschen.
- Lokale Modelllisten, Status und Events werden von Frontend konsumiert.
- ONNX-Modell-Management inkl. Quantisierung (
Live-Aufnahme mit Visualizer, Status und Verlauf
YouTube-Suche, Transkriptionsstart und Ergebnisübersicht
Drag-and-drop Upload, Fortschritt und Ergebnisliste
Detailansicht mit Summary, Status-Events und Export
Provider-, Hotkey-, Modell- und Erweiterungs-Settings
# 1) Repository klonen
git clone https://github.com/MyButtermilk/Scriber.git
cd Scriber
# 2) App starten
start.batstart.bat führt aus:
- Python-Prüfung und
venv-Setup. requirements.txt-Installation bei Versionsänderung.- Initiale
.env-Erstellung bei Bedarf. - Start via Tray-App, wenn Node +
Frontend/vorhanden; sonst Fallback auf Tkinter. - Startprüfung per
http://127.0.0.1:8765/api/health. - UI auf
http://localhost:5000.
./start.shstart.sh installiert Standard-Abhängigkeiten und startet python -m src.main.
# Nur Backend
python -m src.web_api
# Nur Frontend-Client (Vite)
cd Frontend
npm install
npm run dev:client # localhost:5000
# Express-Server (API + Vite-Dev)
npm run dev
# Build/Prod (Frontend)
npm run build
npm startBackend-URL: http://127.0.0.1:8765
# Zusätzlich
python -m src.tray # Tray + Web UI + Backend
python -m src.main # Nur Tkinter-Oberfläche/→ Live Mic/youtube→ YouTube/file→ File Transcribe/transcript/:id→ Transcript Detail/settings→ Settings
- Modus-Setting im UI:
start_stop(Backend:toggle) oderpress_hold(Backend:push_to_talk). - Start/Stop wird ebenfalls über API bereitgestellt (
/api/live-mic/{start,stop,toggle}). - Live-Texte landen als
mic-Eintrag in der Transcript-Liste.
search,videoundtranscribesind die aktiven Backend-Endpunkte.- Der Jobverlauf ist in der History sichtbar; Status werden über WebSocket übertragen.
- Endpoint:
POST /api/file/transcribe, erwartetmultipart/form-datamit Feldfile. - Bei Video-Dateien wird Audio zuerst via ffmpeg extrahiert (WebM/Opus, 16kHz, Mono).
- Audio-Limit nach Extraktion und alle nicht-Video-Dateien: via
SCRIBER_UPLOAD_MAX_MB/SCRIBER_UPLOAD_MAX_BYTES.
- Backend liefert und persistiert via Settings-API:
- Hotkey, Modus, STT-Service, Soniox-Modus/Modelle, Sprache, Mikrofon + Favorit, Injection, Zusammenfassung, ONNX/NeMo-Modelle, Visualizer-Bars.
- API-Keys werden gruppiert im Feld
apiKeysimGET/PUT /api/settingsverwaltet. - AWS-Zugang wird (noch) nicht als
apiKeys-Feld gesetzt, sondern über Standard-AWS-Umgebungsvariablen.
- Kontextmenü-Funktionen: Log, Restart, Auto-Start, Öffnen der UI.
- Autostart ist Windows-only via
GET/POST /api/autostart.
graph LR
U[Browser / Hotkey / Tray] -->|HTTP + WS| F[Tray / Tkinter]
F --> B[Python Backend
(src.web_api)]
B --> C[Controller
ScriberWebController]
C --> R[Pipeline + ProviderRouter]
C --> D[(SQLite)
transcripts.db]
C --> J[JobStore
RetryScheduler]
C --> P[Provider / Local Models
ONNX, NeMo, ffmpeg]
C <--> W[WebSocket /ws]
B <--> H[React UI
Frontend/client]
- Live Mic:
POST /api/live-mic/start|stop|toggle→ Pipeline → Live-Events → Persistierung im Transcript-Store. - YouTube:
POST /api/youtube/transcribe→download_audio→ Pipeline → Retry/Resume-Mechanik. - Datei:
POST /api/file/transcribe→ Größenprüfung/optional ffmpeg-Extraktion → Pipeline. - Frontend-Kommunikation: REST für Steuerung, WebSocket
/wsfür Status-/Live-Daten.
GET /api/healthGET /api/stateGET /api/metrics/hot-path?limit=nlimitwird auf1..500geklemmt.
GET /ws- Kern-Events (
type):state,status,transcript,audio_level,input_warning,transcribing,session_started,session_finished,history_updated,error.
POST /api/live-mic/startPOST /api/live-mic/stopPOST /api/live-mic/toggle
GET /api/transcripts?offset={0}&limit={50}&type={mic|youtube|file}&q={query}limitstandardmäßig 50, begrenzt auf1..100.
GET /api/transcripts/{id}DELETE /api/transcripts/{id}POST /api/transcripts/{id}/summarizePOST /api/transcripts/{id}/cancelGET /api/transcripts/{id}/export/{format}(format:pdf,docx)
GET /api/youtube/search?q={query}&maxResults={n}&pageToken={token}GET /api/youtube/video?id={id}|url={url}POST /api/youtube/transcribe
POST /api/file/transcribe
GET /api/settingsPUT /api/settingsGET /api/microphonesGET /api/autostartPOST /api/autostart
GET /api/onnx/modelsGET /api/onnx/models/{model_id}(optionalquantization-Query)POST /api/onnx/downloadDELETE /api/onnx/models/{model_id}(optionalquantization-Query)GET /api/nemo/modelsPOST /api/nemo/downloadDELETE /api/nemo/models/{model_id}
SCRIBER_WEB_HOST=127.0.0.1
SCRIBER_WEB_PORT=8765
SCRIBER_ALLOWED_ORIGINS= # optional, default: localhost,127.0.0.1,::1VITE_BACKEND_URL=http://127.0.0.1:8765
PORT=5000SCRIBER_HOTKEY=ctrl+alt+s
SCRIBER_MODE=toggle
SCRIBER_DEFAULT_STT=soniox
SCRIBER_SONIOX_MODE=realtime
SCRIBER_SONIOX_ASYNC_MODEL=stt-async-v4
SCRIBER_SONIOX_RT_MODEL=stt-rt-v4
SCRIBER_MISTRAL_RT_MODEL=voxtral-mini-transcribe-realtime-2602
SCRIBER_MISTRAL_ASYNC_MODEL=voxtral-mini-2602
SCRIBER_LANGUAGE=auto
SCRIBER_DEBUG=0
SCRIBER_OPENAI_STT_MODEL=gpt-4o-mini-transcribe-2025-12-15SCRIBER_MIC_DEVICE=default
SCRIBER_FAVORITE_MIC=<Name>
SCRIBER_MIC_ALWAYS_ON=0
SCRIBER_MIC_BLOCK_SIZE=512
SCRIBER_INJECT_METHOD=auto
SCRIBER_PASTE_PRE_DELAY_MS=80
SCRIBER_PASTE_RESTORE_DELAY_MS=1500SCRIBER_UPLOAD_MAX_MB=200
SCRIBER_UPLOAD_MAX_BYTES=
SCRIBER_DOWNLOADS_DIR=./downloads
SCRIBER_JOB_MAX_ATTEMPTS=3
SCRIBER_JOB_RETRY_BASE_SEC=5
SCRIBER_JOB_RETRY_MAX_SEC=120
SCRIBER_TIMEOUT_FILE_TRANSCRIBE_SEC=600
SCRIBER_TIMEOUT_YOUTUBE_TRANSCRIBE_SEC=600
SCRIBER_TIMEOUT_YOUTUBE_DOWNLOAD_SEC=300Hinweis: Videouploads haben intern ein hartes Rohlimit von 2048 MB (WebM/Audio-Extraktion danach 200 MB).
SCRIBER_SUMMARIZATION_PROMPT=...
SCRIBER_SUMMARIZATION_MODEL=gemini-3-flash-preview
SCRIBER_AUTO_SUMMARIZE=1
SCRIBER_SUMMARY_MIN_WORDS=180
SCRIBER_SUMMARY_MAX_WORDS=2200SONIOX_API_KEY=...
MISTRAL_API_KEY=...
ASSEMBLYAI_API_KEY=...
DEEPGRAM_API_KEY=...
OPENAI_API_KEY=...
AZURE_SPEECH_KEY=...
AZURE_SPEECH_REGION=...
GLADIA_API_KEY=...
GROQ_API_KEY=...
SPEECHMATICS_API_KEY=...
ELEVENLABS_API_KEY=...
GOOGLE_API_KEY=...
GOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json
YOUTUBE_API_KEY=...
SCRIBER_VISUALIZER_BAR_COUNT=60AWS nutzt derzeit Standard-Umgebungsvariablen (nicht über apiKeys im Settings-JSON):
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
AWS_REGION=...SCRIBER_ONNX_MODEL=nemo-parakeet-tdt-0.6b-v3
SCRIBER_ONNX_QUANTIZATION=int8
SCRIBER_ONNX_USE_GPU=0
SCRIBER_NEMO_MODEL=parakeet-primelinesettings.json enthält den persistierten summarizationPrompt.
Scriber/
├── src/
│ ├── web_api.py # aiohttp REST + WebSocket API
│ ├── pipeline.py # STT-Pipeline / Provider-Auswahl
│ ├── config.py # Env + Settings
│ ├── tray.py # Tray, Menüs, Autostart, Hotkeys
│ ├── database.py # SQLite (transcripts.db)
│ ├── export.py # PDF/DOCX Export
│ ├── overlay.py # Recording-Overlay
│ ├── summarization.py # Zusammenfassung
│ ├── youtube_api.py # YouTube-Suche / Video-Metadaten
│ ├── youtube_download.py # Audio Download von Video
│ ├── onnx_local_service.py # ONNX STT
│ ├── nemo_local_service.py # NeMo STT
│ ├── main.py # Tkinter-Fallback UI
│ └── microphone.py # Mikrofoneingabe
├── Frontend/
│ ├── client/ # React + Wouter + React Query + WS
│ ├── server/ # Express/Dev/Vite Host
│ └── shared/ # Shared Types / Schema
├── docs/
│ └── screenshots/ # README-Grafiken
├── start.bat
├── start.sh
├── requirements.txt
└── README.md
- Backend startet nicht
python -m src.web_apimanuell starten und Log prüfen.
- Web-UI lädt nicht
- Prüfen, ob Backend auf
http://127.0.0.1:8765/api/healthläuft.
- Prüfen, ob Backend auf
- Kein Mikrofon verfügbar
GET /api/microphonestesten und Mikrophoneinstellung prüfen.
- YouTube-Transkription ohne Zugriff
YOUTUBE_API_KEYin.env/Settings setzen.
- Datei-/Video-Upload schlägt fehl
- Format/Limits prüfen (
200 MBAudio,2048 MBRoh-Video).
- Format/Limits prüfen (
- Modelle werden nicht angezeigt
ffmpegbzw.onnx-asr/nemo_stt-Abhängigkeiten prüfen.
# Python
pytest
# Frontend
cd Frontend
npm run checkMIT License – siehe LICENSE.
Efficient, resumable, multi-provider speech-to-text workflows.




