#!/usr/bin/env bash # ============================================================ # Trixy Voice Assistant — Abhaengigkeiten installieren # ============================================================ # Verwendung: # ./install_requirements.sh # Nur Kern-Pakete # ./install_requirements.sh --plugins # Kern + alle Plugins # ./install_requirements.sh --dev # Kern + Entwickler-Tools # ./install_requirements.sh --stt-layers # Kern + alle STT-Korrekturschichten # ./install_requirements.sh --tts-engines # Kern + TTS-Engines (gTTS, edge-tts, espeak, Coqui) # ./install_requirements.sh --all # Alles (ohne Bark wegen Groesse) # ./install_requirements.sh --gpu # Mit CUDA/GPU-Unterstuetzung # # Kombination moeglich: # ./install_requirements.sh --plugins --dev --gpu # ============================================================ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # Farben RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' # Flags INSTALL_PLUGINS=false INSTALL_DEV=false INSTALL_STT_LAYERS=false INSTALL_TTS_ENGINES=false INSTALL_GPU=false for arg in "$@"; do case "$arg" in --plugins) INSTALL_PLUGINS=true ;; --dev) INSTALL_DEV=true ;; --stt-layers) INSTALL_STT_LAYERS=true ;; --tts-engines) INSTALL_TTS_ENGINES=true ;; --gpu) INSTALL_GPU=true ;; --all) INSTALL_PLUGINS=true INSTALL_DEV=true INSTALL_STT_LAYERS=true INSTALL_TTS_ENGINES=true ;; -h|--help) head -14 "$0" | tail -12 exit 0 ;; *) echo -e "${RED}Unbekanntes Argument: $arg${NC}" echo "Verwende --help fuer Hilfe." exit 1 ;; esac done # ---------------------------------------------------------- # Python-Version pruefen # ---------------------------------------------------------- echo -e "${CYAN}=== Trixy Installer ===${NC}" PYTHON="${PYTHON:-python3}" if ! command -v "$PYTHON" &>/dev/null; then echo -e "${RED}Python3 nicht gefunden. Bitte installieren:${NC}" echo " sudo apt install python3 python3-pip python3-venv" exit 1 fi PY_VERSION=$("$PYTHON" -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')") PY_MAJOR=$("$PYTHON" -c "import sys; print(sys.version_info.major)") PY_MINOR=$("$PYTHON" -c "import sys; print(sys.version_info.minor)") if [ "$PY_MAJOR" -lt 3 ] || [ "$PY_MINOR" -lt 10 ]; then echo -e "${RED}Python >= 3.10 erforderlich (gefunden: $PY_VERSION)${NC}" exit 1 fi echo -e "${GREEN}Python $PY_VERSION gefunden${NC}" # ---------------------------------------------------------- # System-Abhaengigkeiten pruefen (optional) # ---------------------------------------------------------- echo "" echo -e "${CYAN}--- System-Abhaengigkeiten ---${NC}" MISSING_SYSTEM=() # ffmpeg wird fuer Audio-Konvertierung benoetigt if ! command -v ffmpeg &>/dev/null; then MISSING_SYSTEM+=("ffmpeg") fi # portaudio fuer PyAudio (Mikrofon-Zugriff) if ! dpkg -s portaudio19-dev &>/dev/null 2>&1; then MISSING_SYSTEM+=("portaudio19-dev") fi if [ ${#MISSING_SYSTEM[@]} -gt 0 ]; then echo -e "${YELLOW}Fehlende System-Pakete: ${MISSING_SYSTEM[*]}${NC}" echo -e "${YELLOW}Installiere mit:${NC}" echo " sudo apt install ${MISSING_SYSTEM[*]}" echo "" read -rp "Jetzt installieren? (j/N) " REPLY if [[ "$REPLY" =~ ^[jJyY]$ ]]; then sudo apt install -y "${MISSING_SYSTEM[@]}" echo -e "${GREEN}System-Pakete installiert${NC}" else echo -e "${YELLOW}Uebersprungen — einige Funktionen koennten fehlen${NC}" fi else echo -e "${GREEN}Alle System-Pakete vorhanden${NC}" fi # ---------------------------------------------------------- # pip aktualisieren # ---------------------------------------------------------- echo "" echo -e "${CYAN}--- pip aktualisieren ---${NC}" "$PYTHON" -m pip install --upgrade pip # ---------------------------------------------------------- # Kern-Abhaengigkeiten # ---------------------------------------------------------- echo "" echo -e "${CYAN}--- Kern-Abhaengigkeiten ---${NC}" "$PYTHON" -m pip install -r requirements.txt echo -e "${GREEN}Kern-Pakete installiert${NC}" # ---------------------------------------------------------- # GPU-Unterstuetzung (PyTorch mit CUDA) # ---------------------------------------------------------- if [ "$INSTALL_GPU" = true ]; then echo "" echo -e "${CYAN}--- GPU/CUDA-Unterstuetzung ---${NC}" # PyTorch mit CUDA 12.4 (aktuellste stabile Version) "$PYTHON" -m pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu124 echo -e "${GREEN}PyTorch mit CUDA installiert${NC}" # CUDA-Verfuegbarkeit pruefen "$PYTHON" -c " import torch if torch.cuda.is_available(): print(f' GPU: {torch.cuda.get_device_name(0)}') print(f' CUDA: {torch.version.cuda}') print(f' VRAM: {torch.cuda.get_device_properties(0).total_mem / 1024**3:.1f} GB') else: print(' WARNUNG: CUDA nicht verfuegbar — CPU-Modus aktiv') " 2>/dev/null || echo -e "${YELLOW} PyTorch installiert, CUDA-Check uebersprungen${NC}" else # CPU-only PyTorch (kleiner, schneller zu installieren) if ! "$PYTHON" -c "import torch" 2>/dev/null; then echo "" echo -e "${CYAN}--- PyTorch (CPU) ---${NC}" "$PYTHON" -m pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu echo -e "${GREEN}PyTorch (CPU) installiert${NC}" fi fi # ---------------------------------------------------------- # STT-Korrekturschichten (optional) # ---------------------------------------------------------- if [ "$INSTALL_STT_LAYERS" = true ]; then echo "" echo -e "${CYAN}--- STT-Korrekturschichten ---${NC}" # SymSpell + Cologne Phonetics (leichtgewichtig, immer installierbar) "$PYTHON" -m pip install symspellpy cologne-phonetics echo -e "${GREEN} symspell + phonetic installiert${NC}" # Hunspell (benoetigt libhunspell-dev) if dpkg -s libhunspell-dev &>/dev/null 2>&1; then "$PYTHON" -m pip install pyhunspell echo -e "${GREEN} hunspell installiert${NC}" else echo -e "${YELLOW} hunspell uebersprungen (libhunspell-dev fehlt: sudo apt install libhunspell-dev)${NC}" fi # JamSpell (C++ Extension, kann fehlschlagen) "$PYTHON" -m pip install jamspell 2>/dev/null && \ echo -e "${GREEN} jamspell installiert${NC}" || \ echo -e "${YELLOW} jamspell uebersprungen (C++ Build fehlgeschlagen)${NC}" # KenLM (muss von GitHub gebaut werden) echo -e "${YELLOW} kenlm: Manueller Build noetig — siehe https://github.com/kpu/kenlm${NC}" # LanguageTool (Java-basiert, gross) read -rp " language-tool-python installieren? (Startet Java-Server, ~500MB) (j/N) " REPLY if [[ "$REPLY" =~ ^[jJyY]$ ]]; then "$PYTHON" -m pip install language-tool-python echo -e "${GREEN} language-tool installiert${NC}" else echo -e "${YELLOW} language-tool uebersprungen${NC}" fi fi # ---------------------------------------------------------- # Plugin-Abhaengigkeiten # ---------------------------------------------------------- if [ "$INSTALL_PLUGINS" = true ]; then echo "" echo -e "${CYAN}--- Plugin-Abhaengigkeiten ---${NC}" for plugin_dir in plugins/*/; do plugin_name=$(basename "$plugin_dir") req_file="${plugin_dir}requirements.txt" if [ -f "$req_file" ]; then # Pruefen ob ueberhaupt unkommentierte Zeilen vorhanden active_lines=$(grep -cE '^[^#[:space:]]' "$req_file" 2>/dev/null || echo "0") if [ "$active_lines" -gt 0 ]; then echo -e " ${CYAN}$plugin_name${NC} ($active_lines Pakete)" "$PYTHON" -m pip install -r "$req_file" 2>/dev/null && \ echo -e " ${GREEN}$plugin_name installiert${NC}" || \ echo -e " ${YELLOW}$plugin_name teilweise fehlgeschlagen (optional)${NC}" else echo -e " ${YELLOW}$plugin_name — nur optionale Pakete (uebersprungen)${NC}" fi fi done fi # ---------------------------------------------------------- # TTS-Engines (fuer Wakeword-Trainer Datengenerierung) # ---------------------------------------------------------- if [ "$INSTALL_TTS_ENGINES" = true ]; then echo "" echo -e "${CYAN}--- TTS-Engines ---${NC}" # gTTS (Google Translate TTS, braucht Internet) "$PYTHON" -m pip install gTTS 2>/dev/null && \ echo -e " ${GREEN}gTTS installiert${NC}" || \ echo -e " ${YELLOW}gTTS fehlgeschlagen${NC}" # edge-tts (Microsoft Neural-Stimmen, braucht Internet) "$PYTHON" -m pip install edge-tts 2>/dev/null && \ echo -e " ${GREEN}edge-tts installiert${NC}" || \ echo -e " ${YELLOW}edge-tts fehlgeschlagen${NC}" # eSpeak-NG (Offline, braucht espeak-ng System-Paket) if command -v espeak-ng &>/dev/null || dpkg -s espeak-ng &>/dev/null 2>&1; then "$PYTHON" -m pip install py-espeak-ng 2>/dev/null && \ echo -e " ${GREEN}py-espeak-ng installiert${NC}" || \ echo -e " ${YELLOW}py-espeak-ng fehlgeschlagen${NC}" else echo -e " ${YELLOW}espeak-ng uebersprungen (sudo apt install espeak-ng)${NC}" fi # Coqui TTS (Offline Thorsten-Modelle, gross) read -rp " Coqui TTS installieren? (Thorsten-Modelle, ~2GB) (j/N) " REPLY if [[ "$REPLY" =~ ^[jJyY]$ ]]; then "$PYTHON" -m pip install TTS 2>/dev/null && \ echo -e " ${GREEN}Coqui TTS installiert${NC}" || \ echo -e " ${YELLOW}Coqui TTS fehlgeschlagen${NC}" else echo -e " ${YELLOW}Coqui TTS uebersprungen${NC}" fi # Bark wird wegen Groesse (~5GB) nicht automatisch installiert echo -e " ${YELLOW}Bark TTS: Manuell installierbar (pip install transformers scipy accelerate)${NC}" echo -e " ${YELLOW} GPU empfohlen, ~5GB Modell-Download beim ersten Start${NC}" fi # ---------------------------------------------------------- # Entwickler-Tools # ---------------------------------------------------------- if [ "$INSTALL_DEV" = true ]; then echo "" echo -e "${CYAN}--- Entwickler-Tools ---${NC}" "$PYTHON" -m pip install \ pytest \ pytest-asyncio \ pytest-cov \ mypy \ ruff \ black \ ipython \ ipdb echo -e "${GREEN}Entwickler-Tools installiert${NC}" fi # ---------------------------------------------------------- # Zusammenfassung # ---------------------------------------------------------- echo "" echo -e "${CYAN}=== Installation abgeschlossen ===${NC}" echo "" echo -e "Installiert:" echo -e " ${GREEN}✓${NC} Kern-Pakete (requirements.txt)" [ "$INSTALL_GPU" = true ] && echo -e " ${GREEN}✓${NC} GPU/CUDA-Unterstuetzung" [ "$INSTALL_STT_LAYERS" = true ] && echo -e " ${GREEN}✓${NC} STT-Korrekturschichten" [ "$INSTALL_TTS_ENGINES" = true ] && echo -e " ${GREEN}✓${NC} TTS-Engines" [ "$INSTALL_PLUGINS" = true ] && echo -e " ${GREEN}✓${NC} Plugin-Abhaengigkeiten" [ "$INSTALL_DEV" = true ] && echo -e " ${GREEN}✓${NC} Entwickler-Tools" echo "" echo -e "Naechste Schritte:" echo -e " ${CYAN}python3 main.py server --debug${NC} # Server starten" echo -e " ${CYAN}python3 main.py standalone --debug${NC} # Standalone starten" echo ""