router: deutsche Spracherkennung mit whisper.cpp (CPU-only)

- STT-Worker (stt_worker.py): langlebiger HTTP-Service auf Port 8084
  - whisper-cli als Subprozess (CPU-only, 8 Threads)
  - Audio-Vorbereitung via ffmpeg (WebM/Opus/M4A → 16 kHz WAV)
  - Nativ: WAV, MP3, OGG, FLAC
  - Health-Endpunkt: GET /status
  - Transkription: POST /transcribe (Multipart-Form-Data)

- Router-Integration:
  - POST /v1/audio/transcriptions (OpenAI-kompatibel)
  - GET /v1/audio/models (whisper-1, kokoro-german)
  - GET /v1/audio/voices (martin, victoria)
  - /status mit stt-Section
  - model=whisper-1 akzeptiert
  - response_format: json, verbose_json

- systemd-Service: mike-ai-whisper.service
  - Boot-Start, Restart on failure, journald
  - CPU-only, kein GPU-Lock

- Deploy-Dateien aktualisiert (deploy.sh, install.sh)
- Mock-STT-Worker für lokale Tests (dev/mock_stt_worker.py)
- Tests ergänzt: STT Status, WAV, language=de, unbekanntes Modell,
  Worker down, Recovery, Audio-Modelle, Audio-Voices,
  STT+Qwen parallel, STT+TTS parallel
- README.md: STT-Section mit Endpunkten, Benchmarks, Doku

Benchmarks (CPU-only, 8 Threads):
  7.3 s Audio → 8.9 s (RTF 1.22×)
  30 s Audio → 16.8 s (RTF 0.56×)
  50 s Audio → 18.5 s (RTF 0.37×)
  RAM: ~1.7 GB (Modell), Worker: ~20 MB
This commit is contained in:
Mikei386
2026-08-19 13:53:22 +02:00
parent ff064685ce
commit 51ef07c874
8 changed files with 1059 additions and 6 deletions
+25
View File
@@ -0,0 +1,25 @@
[Unit]
Description=Whisper STT Worker (deutsche Spracherkennung, CPU-only)
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/mike-ai/ai-profile-router
Environment=WHISPER_HOST=127.0.0.1
Environment=WHISPER_PORT=8084
Environment=WHISPER_CLI=/opt/mike-ai/whisper.cpp/build-cpu/bin/whisper-cli
Environment=WHISPER_MODEL=/opt/mike-ai/models/whisper/ggml-large-v3-turbo.bin
Environment=WHISPER_THREADS=8
Environment=WHISPER_LANGUAGE=de
Environment=FFMPEG_BIN=/usr/bin/ffmpeg
Environment=LOG_LEVEL=INFO
ExecStart=/usr/bin/python3 /opt/mike-ai/ai-profile-router/stt_worker.py
Restart=always
RestartSec=5
# CPU-only: keine GPU-Bindung, keine VRAM-Belegung
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target