| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- #!/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 ""
|