install_requirements.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. #!/usr/bin/env bash
  2. # ============================================================
  3. # Trixy Voice Assistant — Abhaengigkeiten installieren
  4. # ============================================================
  5. # Verwendung:
  6. # ./install_requirements.sh # Nur Kern-Pakete
  7. # ./install_requirements.sh --plugins # Kern + alle Plugins
  8. # ./install_requirements.sh --dev # Kern + Entwickler-Tools
  9. # ./install_requirements.sh --stt-layers # Kern + alle STT-Korrekturschichten
  10. # ./install_requirements.sh --tts-engines # Kern + TTS-Engines (gTTS, edge-tts, espeak, Coqui)
  11. # ./install_requirements.sh --all # Alles (ohne Bark wegen Groesse)
  12. # ./install_requirements.sh --gpu # Mit CUDA/GPU-Unterstuetzung
  13. #
  14. # Kombination moeglich:
  15. # ./install_requirements.sh --plugins --dev --gpu
  16. # ============================================================
  17. set -e
  18. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  19. cd "$SCRIPT_DIR"
  20. # Farben
  21. RED='\033[0;31m'
  22. GREEN='\033[0;32m'
  23. YELLOW='\033[1;33m'
  24. CYAN='\033[0;36m'
  25. NC='\033[0m'
  26. # Flags
  27. INSTALL_PLUGINS=false
  28. INSTALL_DEV=false
  29. INSTALL_STT_LAYERS=false
  30. INSTALL_TTS_ENGINES=false
  31. INSTALL_GPU=false
  32. for arg in "$@"; do
  33. case "$arg" in
  34. --plugins) INSTALL_PLUGINS=true ;;
  35. --dev) INSTALL_DEV=true ;;
  36. --stt-layers) INSTALL_STT_LAYERS=true ;;
  37. --tts-engines) INSTALL_TTS_ENGINES=true ;;
  38. --gpu) INSTALL_GPU=true ;;
  39. --all)
  40. INSTALL_PLUGINS=true
  41. INSTALL_DEV=true
  42. INSTALL_STT_LAYERS=true
  43. INSTALL_TTS_ENGINES=true
  44. ;;
  45. -h|--help)
  46. head -14 "$0" | tail -12
  47. exit 0
  48. ;;
  49. *)
  50. echo -e "${RED}Unbekanntes Argument: $arg${NC}"
  51. echo "Verwende --help fuer Hilfe."
  52. exit 1
  53. ;;
  54. esac
  55. done
  56. # ----------------------------------------------------------
  57. # Python-Version pruefen
  58. # ----------------------------------------------------------
  59. echo -e "${CYAN}=== Trixy Installer ===${NC}"
  60. PYTHON="${PYTHON:-python3}"
  61. if ! command -v "$PYTHON" &>/dev/null; then
  62. echo -e "${RED}Python3 nicht gefunden. Bitte installieren:${NC}"
  63. echo " sudo apt install python3 python3-pip python3-venv"
  64. exit 1
  65. fi
  66. PY_VERSION=$("$PYTHON" -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
  67. PY_MAJOR=$("$PYTHON" -c "import sys; print(sys.version_info.major)")
  68. PY_MINOR=$("$PYTHON" -c "import sys; print(sys.version_info.minor)")
  69. if [ "$PY_MAJOR" -lt 3 ] || [ "$PY_MINOR" -lt 10 ]; then
  70. echo -e "${RED}Python >= 3.10 erforderlich (gefunden: $PY_VERSION)${NC}"
  71. exit 1
  72. fi
  73. echo -e "${GREEN}Python $PY_VERSION gefunden${NC}"
  74. # ----------------------------------------------------------
  75. # System-Abhaengigkeiten pruefen (optional)
  76. # ----------------------------------------------------------
  77. echo ""
  78. echo -e "${CYAN}--- System-Abhaengigkeiten ---${NC}"
  79. MISSING_SYSTEM=()
  80. # ffmpeg wird fuer Audio-Konvertierung benoetigt
  81. if ! command -v ffmpeg &>/dev/null; then
  82. MISSING_SYSTEM+=("ffmpeg")
  83. fi
  84. # portaudio fuer PyAudio (Mikrofon-Zugriff)
  85. if ! dpkg -s portaudio19-dev &>/dev/null 2>&1; then
  86. MISSING_SYSTEM+=("portaudio19-dev")
  87. fi
  88. if [ ${#MISSING_SYSTEM[@]} -gt 0 ]; then
  89. echo -e "${YELLOW}Fehlende System-Pakete: ${MISSING_SYSTEM[*]}${NC}"
  90. echo -e "${YELLOW}Installiere mit:${NC}"
  91. echo " sudo apt install ${MISSING_SYSTEM[*]}"
  92. echo ""
  93. read -rp "Jetzt installieren? (j/N) " REPLY
  94. if [[ "$REPLY" =~ ^[jJyY]$ ]]; then
  95. sudo apt install -y "${MISSING_SYSTEM[@]}"
  96. echo -e "${GREEN}System-Pakete installiert${NC}"
  97. else
  98. echo -e "${YELLOW}Uebersprungen — einige Funktionen koennten fehlen${NC}"
  99. fi
  100. else
  101. echo -e "${GREEN}Alle System-Pakete vorhanden${NC}"
  102. fi
  103. # ----------------------------------------------------------
  104. # pip aktualisieren
  105. # ----------------------------------------------------------
  106. echo ""
  107. echo -e "${CYAN}--- pip aktualisieren ---${NC}"
  108. "$PYTHON" -m pip install --upgrade pip
  109. # ----------------------------------------------------------
  110. # Kern-Abhaengigkeiten
  111. # ----------------------------------------------------------
  112. echo ""
  113. echo -e "${CYAN}--- Kern-Abhaengigkeiten ---${NC}"
  114. "$PYTHON" -m pip install -r requirements.txt
  115. echo -e "${GREEN}Kern-Pakete installiert${NC}"
  116. # ----------------------------------------------------------
  117. # GPU-Unterstuetzung (PyTorch mit CUDA)
  118. # ----------------------------------------------------------
  119. if [ "$INSTALL_GPU" = true ]; then
  120. echo ""
  121. echo -e "${CYAN}--- GPU/CUDA-Unterstuetzung ---${NC}"
  122. # PyTorch mit CUDA 12.4 (aktuellste stabile Version)
  123. "$PYTHON" -m pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu124
  124. echo -e "${GREEN}PyTorch mit CUDA installiert${NC}"
  125. # CUDA-Verfuegbarkeit pruefen
  126. "$PYTHON" -c "
  127. import torch
  128. if torch.cuda.is_available():
  129. print(f' GPU: {torch.cuda.get_device_name(0)}')
  130. print(f' CUDA: {torch.version.cuda}')
  131. print(f' VRAM: {torch.cuda.get_device_properties(0).total_mem / 1024**3:.1f} GB')
  132. else:
  133. print(' WARNUNG: CUDA nicht verfuegbar — CPU-Modus aktiv')
  134. " 2>/dev/null || echo -e "${YELLOW} PyTorch installiert, CUDA-Check uebersprungen${NC}"
  135. else
  136. # CPU-only PyTorch (kleiner, schneller zu installieren)
  137. if ! "$PYTHON" -c "import torch" 2>/dev/null; then
  138. echo ""
  139. echo -e "${CYAN}--- PyTorch (CPU) ---${NC}"
  140. "$PYTHON" -m pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu
  141. echo -e "${GREEN}PyTorch (CPU) installiert${NC}"
  142. fi
  143. fi
  144. # ----------------------------------------------------------
  145. # STT-Korrekturschichten (optional)
  146. # ----------------------------------------------------------
  147. if [ "$INSTALL_STT_LAYERS" = true ]; then
  148. echo ""
  149. echo -e "${CYAN}--- STT-Korrekturschichten ---${NC}"
  150. # SymSpell + Cologne Phonetics (leichtgewichtig, immer installierbar)
  151. "$PYTHON" -m pip install symspellpy cologne-phonetics
  152. echo -e "${GREEN} symspell + phonetic installiert${NC}"
  153. # Hunspell (benoetigt libhunspell-dev)
  154. if dpkg -s libhunspell-dev &>/dev/null 2>&1; then
  155. "$PYTHON" -m pip install pyhunspell
  156. echo -e "${GREEN} hunspell installiert${NC}"
  157. else
  158. echo -e "${YELLOW} hunspell uebersprungen (libhunspell-dev fehlt: sudo apt install libhunspell-dev)${NC}"
  159. fi
  160. # JamSpell (C++ Extension, kann fehlschlagen)
  161. "$PYTHON" -m pip install jamspell 2>/dev/null && \
  162. echo -e "${GREEN} jamspell installiert${NC}" || \
  163. echo -e "${YELLOW} jamspell uebersprungen (C++ Build fehlgeschlagen)${NC}"
  164. # KenLM (muss von GitHub gebaut werden)
  165. echo -e "${YELLOW} kenlm: Manueller Build noetig — siehe https://github.com/kpu/kenlm${NC}"
  166. # LanguageTool (Java-basiert, gross)
  167. read -rp " language-tool-python installieren? (Startet Java-Server, ~500MB) (j/N) " REPLY
  168. if [[ "$REPLY" =~ ^[jJyY]$ ]]; then
  169. "$PYTHON" -m pip install language-tool-python
  170. echo -e "${GREEN} language-tool installiert${NC}"
  171. else
  172. echo -e "${YELLOW} language-tool uebersprungen${NC}"
  173. fi
  174. fi
  175. # ----------------------------------------------------------
  176. # Plugin-Abhaengigkeiten
  177. # ----------------------------------------------------------
  178. if [ "$INSTALL_PLUGINS" = true ]; then
  179. echo ""
  180. echo -e "${CYAN}--- Plugin-Abhaengigkeiten ---${NC}"
  181. for plugin_dir in plugins/*/; do
  182. plugin_name=$(basename "$plugin_dir")
  183. req_file="${plugin_dir}requirements.txt"
  184. if [ -f "$req_file" ]; then
  185. # Pruefen ob ueberhaupt unkommentierte Zeilen vorhanden
  186. active_lines=$(grep -cE '^[^#[:space:]]' "$req_file" 2>/dev/null || echo "0")
  187. if [ "$active_lines" -gt 0 ]; then
  188. echo -e " ${CYAN}$plugin_name${NC} ($active_lines Pakete)"
  189. "$PYTHON" -m pip install -r "$req_file" 2>/dev/null && \
  190. echo -e " ${GREEN}$plugin_name installiert${NC}" || \
  191. echo -e " ${YELLOW}$plugin_name teilweise fehlgeschlagen (optional)${NC}"
  192. else
  193. echo -e " ${YELLOW}$plugin_name — nur optionale Pakete (uebersprungen)${NC}"
  194. fi
  195. fi
  196. done
  197. fi
  198. # ----------------------------------------------------------
  199. # TTS-Engines (fuer Wakeword-Trainer Datengenerierung)
  200. # ----------------------------------------------------------
  201. if [ "$INSTALL_TTS_ENGINES" = true ]; then
  202. echo ""
  203. echo -e "${CYAN}--- TTS-Engines ---${NC}"
  204. # gTTS (Google Translate TTS, braucht Internet)
  205. "$PYTHON" -m pip install gTTS 2>/dev/null && \
  206. echo -e " ${GREEN}gTTS installiert${NC}" || \
  207. echo -e " ${YELLOW}gTTS fehlgeschlagen${NC}"
  208. # edge-tts (Microsoft Neural-Stimmen, braucht Internet)
  209. "$PYTHON" -m pip install edge-tts 2>/dev/null && \
  210. echo -e " ${GREEN}edge-tts installiert${NC}" || \
  211. echo -e " ${YELLOW}edge-tts fehlgeschlagen${NC}"
  212. # eSpeak-NG (Offline, braucht espeak-ng System-Paket)
  213. if command -v espeak-ng &>/dev/null || dpkg -s espeak-ng &>/dev/null 2>&1; then
  214. "$PYTHON" -m pip install py-espeak-ng 2>/dev/null && \
  215. echo -e " ${GREEN}py-espeak-ng installiert${NC}" || \
  216. echo -e " ${YELLOW}py-espeak-ng fehlgeschlagen${NC}"
  217. else
  218. echo -e " ${YELLOW}espeak-ng uebersprungen (sudo apt install espeak-ng)${NC}"
  219. fi
  220. # Coqui TTS (Offline Thorsten-Modelle, gross)
  221. read -rp " Coqui TTS installieren? (Thorsten-Modelle, ~2GB) (j/N) " REPLY
  222. if [[ "$REPLY" =~ ^[jJyY]$ ]]; then
  223. "$PYTHON" -m pip install TTS 2>/dev/null && \
  224. echo -e " ${GREEN}Coqui TTS installiert${NC}" || \
  225. echo -e " ${YELLOW}Coqui TTS fehlgeschlagen${NC}"
  226. else
  227. echo -e " ${YELLOW}Coqui TTS uebersprungen${NC}"
  228. fi
  229. # Bark wird wegen Groesse (~5GB) nicht automatisch installiert
  230. echo -e " ${YELLOW}Bark TTS: Manuell installierbar (pip install transformers scipy accelerate)${NC}"
  231. echo -e " ${YELLOW} GPU empfohlen, ~5GB Modell-Download beim ersten Start${NC}"
  232. fi
  233. # ----------------------------------------------------------
  234. # Entwickler-Tools
  235. # ----------------------------------------------------------
  236. if [ "$INSTALL_DEV" = true ]; then
  237. echo ""
  238. echo -e "${CYAN}--- Entwickler-Tools ---${NC}"
  239. "$PYTHON" -m pip install \
  240. pytest \
  241. pytest-asyncio \
  242. pytest-cov \
  243. mypy \
  244. ruff \
  245. black \
  246. ipython \
  247. ipdb
  248. echo -e "${GREEN}Entwickler-Tools installiert${NC}"
  249. fi
  250. # ----------------------------------------------------------
  251. # Zusammenfassung
  252. # ----------------------------------------------------------
  253. echo ""
  254. echo -e "${CYAN}=== Installation abgeschlossen ===${NC}"
  255. echo ""
  256. echo -e "Installiert:"
  257. echo -e " ${GREEN}✓${NC} Kern-Pakete (requirements.txt)"
  258. [ "$INSTALL_GPU" = true ] && echo -e " ${GREEN}✓${NC} GPU/CUDA-Unterstuetzung"
  259. [ "$INSTALL_STT_LAYERS" = true ] && echo -e " ${GREEN}✓${NC} STT-Korrekturschichten"
  260. [ "$INSTALL_TTS_ENGINES" = true ] && echo -e " ${GREEN}✓${NC} TTS-Engines"
  261. [ "$INSTALL_PLUGINS" = true ] && echo -e " ${GREEN}✓${NC} Plugin-Abhaengigkeiten"
  262. [ "$INSTALL_DEV" = true ] && echo -e " ${GREEN}✓${NC} Entwickler-Tools"
  263. echo ""
  264. echo -e "Naechste Schritte:"
  265. echo -e " ${CYAN}python3 main.py server --debug${NC} # Server starten"
  266. echo -e " ${CYAN}python3 main.py standalone --debug${NC} # Standalone starten"
  267. echo ""