PiperTTSProvider ruft das piper-Binary (--output-raw) async auf, liest die native Sample-Rate aus der .onnx.json und resampelt per ffmpeg auf 24000 Hz (Gateway-Norm). Nicht passende Stimmen (z. B. Cloud-Stimme 'Zephyr' aus der Route) fallen auf die konfigurierte Default-Stimme zurueck. Damit ist eine voll-lokale Konstellation (faster-whisper + Ollama + piper) moeglich -> keine API-Kosten, max. Datenschutz. - config: PIPER_BIN/PIPER_VOICES_DIR/PIPER_VOICE/TTS_SAMPLE_RATE (+ .env.example) - dependencies: piper-Factory mit Settings verdrahtet - tests: tests/test_piper_tts.py (offline, Fake-Binary; Resample-Test skippt ohne ffmpeg); e2e/auth-Tests nutzen jetzt einen Stub-TTS statt 'piper' als Pseudo-Stub - docs: README, BEDIENUNGSANLEITUNG (voll-lokal-Beispiel), Architektur-Roadmap Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
66 lines
3 KiB
Bash
66 lines
3 KiB
Bash
# Port bei Bedarf anpassen
|
|
APP_ENV=dev
|
|
HOST=0.0.0.0
|
|
PORT=8080
|
|
LOG_LEVEL=info
|
|
|
|
# Secret nur ueber die Umgebung setzen (nicht hier eintragen), z. B. export in ~/.bashrc
|
|
OPENROUTER_API_KEY=
|
|
|
|
# Satzweises Vorlesen (Audio-Streaming) als Default fuer WebSocket-Turns.
|
|
# false = Antwort erst komplett synthetisieren, dann abspielen.
|
|
AUDIO_STREAM_DEFAULT=true
|
|
|
|
# --- Authentifizierung -----------------------------------------------------
|
|
# AUTH_ENABLED=true (Standard) schuetzt chat/speak/transcribe/sessions per Bearer-Token.
|
|
# Fuer lokale Entwicklung/Tests auf false setzen (dann gilt ein anonymer Nutzer).
|
|
AUTH_ENABLED=true
|
|
# Schluessel fuer die Nutzerverwaltung (POST /api/admin/users). Nur ueber die Umgebung.
|
|
ADMIN_API_KEY=
|
|
|
|
# --- Zentrale Konfiguration / Profile -------------------------------------
|
|
# Aktives Profil aus config/voice-assistant.toml waehlen: local-dev | hybrid | cloud
|
|
# (leer lassen = nur Defaults/ENV). Eigener Pfad via VA_CONFIG_FILE.
|
|
VA_PROFILE=
|
|
# VA_CONFIG_FILE=config/voice-assistant.toml
|
|
|
|
# Hinweis zur Praezedenz: ENV gewinnt ueber die TOML-Datei. Die DEFAULT_*_PROVIDER-
|
|
# Zeilen unten ueberschreiben daher ein gesetztes VA_PROFILE. Wer profilbasiert
|
|
# umschalten will, sollte sie auskommentiert lassen.
|
|
OPENROUTER_STT_MODEL=openai/whisper-large-v3
|
|
OPENROUTER_TTS_MODEL=openai/gpt-4o-mini-tts
|
|
OPENROUTER_TTS_VOICE=alloy
|
|
OPENROUTER_LLM_MODEL=openai/gpt-4.1-mini
|
|
DEFAULT_LANGUAGE=de
|
|
DEFAULT_INPUT_ENDPOINT=local-default
|
|
DEFAULT_OUTPUT_ENDPOINT=local-default
|
|
# DEFAULT_STT_PROVIDER=openrouter
|
|
# DEFAULT_LLM_PROVIDER=local-openai-compatible
|
|
# DEFAULT_TTS_PROVIDER=openrouter
|
|
LOCAL_LLM_BASE_URL=http://127.0.0.1:11434/v1
|
|
LOCAL_LLM_API_KEY=dummy
|
|
LOCAL_LLM_MODEL=llama3.1
|
|
|
|
# --- Lokales STT (faster-whisper; nur mit pip install -e .[local] ) ---------
|
|
FASTER_WHISPER_MODEL=base # tiny|base|small|medium|large-v3
|
|
FASTER_WHISPER_DEVICE=auto # auto|cpu|cuda
|
|
FASTER_WHISPER_COMPUTE_TYPE=default # default|int8|float16|int8_float16
|
|
|
|
# --- Lokales TTS (piper; Binary + Stimmmodell noetig) ------------------------
|
|
# Aktivieren z. B. mit DEFAULT_TTS_PROVIDER=piper (oder --tts-provider piper).
|
|
# Stimmen liegen als <name>.onnx (+ .onnx.json) im Voices-Verzeichnis.
|
|
# Modelle laden: python -m piper.download_voices de_DE-thorsten-high (o. manuell).
|
|
PIPER_BIN=piper # Pfad/Name des piper-Binaries
|
|
PIPER_VOICES_DIR=~/.local/share/piper/voices # Verzeichnis der .onnx-Stimmen
|
|
PIPER_VOICE=de_DE-thorsten-high # Stimmmodell (ohne .onnx) oder voller Pfad
|
|
TTS_SAMPLE_RATE=24000 # Ziel-Sample-Rate (ffmpeg resampelt bei Bedarf)
|
|
|
|
# --- Resilienz: Fallback-Ketten (kommaseparierte Provider-Namen) ------------
|
|
# Faellt der primaere Provider aus, uebernimmt der naechste.
|
|
# STT_FALLBACK=faster-whisper
|
|
# LLM_FALLBACK=local-openai-compatible
|
|
# TTS_FALLBACK=piper
|
|
|
|
# --- Betrieb: Kontingent & Notfall -----------------------------------------
|
|
DAILY_REQUEST_LIMIT=0 # Anfragen pro Nutzer/Tag (0 = unbegrenzt)
|
|
# EMERGENCY_WEBHOOK_URL=https://example.org/alert # optionale Eskalation
|