174 lines
6.2 KiB
Bash
Executable File
174 lines
6.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Copyright 2026 Umbra Tools (umbratools.com)
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
# UmbraAudio Environment Setup Script
|
|
# This script sets up the Python environment, installs dependencies,
|
|
# and configures paths for the UmbraAudio audiobook generation system.
|
|
set -euo pipefail
|
|
|
|
echo "=== UmbraAudio Environment Setup ==="
|
|
echo ""
|
|
|
|
# --- Configuration ---
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
UMBRE_DIR="$SCRIPT_DIR" # The directory containing this script (umbra_package/)
|
|
PROJECT_DIR="$(dirname "$UMBRE_DIR")" # Parent should be the UmbraAudio project root
|
|
|
|
# Allow override via environment
|
|
if [ -z "${UMBRE_PROJECT_DIR:-}" ]; then
|
|
export UMBRA_PROJECT_DIR="${UMBRA_PROJECT_DIR:-$PROJECT_DIR}"
|
|
fi
|
|
export UMBRA_DATA_DIR="$UMBRA_PROJECT_DIR/.umbra"
|
|
|
|
echo "Project directory: $UMBRA_PROJECT_DIR"
|
|
echo "Data directory: $UMBRA_DATA_DIR"
|
|
echo ""
|
|
|
|
# --- Verify .umbra exists ---
|
|
if [ ! -d "$UMBRA_DATA_DIR" ]; then
|
|
echo "ERROR: .umbra directory not found at $UMBRA_DATA_DIR"
|
|
echo "Please ensure the project was extracted correctly."
|
|
exit 1
|
|
fi
|
|
|
|
# --- Python version check ---
|
|
PYTHON_MIN_MAJOR=3
|
|
PYTHON_MIN_MINOR=11
|
|
PYTHON_BIN="${PYTHON:-python3}"
|
|
PY_VERSION=$($PYTHON_BIN -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
|
|
PY_MAJOR=$($PYTHON_BIN -c 'import sys; print(sys.version_info.major)')
|
|
PY_MINOR=$($PYTHON_BIN -c 'import sys; print(sys.version_info.minor)')
|
|
echo "Python: $PY_VERSION"
|
|
|
|
if [ "$PY_MAJOR" -lt "$PYTHON_MIN_MAJOR" ] || ([ "$PY_MAJOR" -eq "$PYTHON_MIN_MAJOR" ] && [ "$PY_MINOR" -lt "$PYTHON_MIN_MINOR" ]); then
|
|
echo "ERROR: Python $PYTHON_MIN_MAJOR.$PYTHON_MIN_MINOR+ required, found $PY_VERSION"
|
|
exit 1
|
|
fi
|
|
echo ""
|
|
|
|
# --- Check for GPU ---
|
|
echo "=== Checking for NVIDIA GPU ==="
|
|
if command -v nvidia-smi &>/dev/null; then
|
|
GPU_INFO=$(nvidia-smi --query-gpu=name,memory.total --format=csv,noheader 2>/dev/null || echo "Unknown GPU")
|
|
echo "GPU detected: $GPU_INFO"
|
|
export UMBRA_TTS__DEVICE=cuda
|
|
else
|
|
echo "WARNING: No NVIDIA GPU detected. TTS will use CPU (slow)."
|
|
echo "Consider installing NVIDIA drivers and CUDA for hardware acceleration."
|
|
export UMBRA_TTS__DEVICE=cpu
|
|
fi
|
|
echo ""
|
|
|
|
# --- Set up virtual environment ---
|
|
VENV_DIR="$UMBRA_PROJECT_DIR/.venv"
|
|
echo "=== Setting up virtual environment ==="
|
|
if [ ! -d "$VENV_DIR" ]; then
|
|
$PYTHON_BIN -m venv "$VENV_DIR"
|
|
echo "Created virtual environment at $VENV_DIR"
|
|
else
|
|
echo "Virtual environment already exists at $VENV_DIR"
|
|
fi
|
|
|
|
# Activate venv
|
|
source "$VENV_DIR/bin/activate"
|
|
echo "Activated virtual environment"
|
|
echo ""
|
|
|
|
# --- Install dependencies ---
|
|
echo "=== Installing Python dependencies ==="
|
|
cd "$PROJECT_DIR"
|
|
pip install --upgrade pip 2>&1 | tail -1
|
|
pip install -e ".[dev]" 2>&1 | tail -5
|
|
echo ""
|
|
|
|
# --- Check for ffmpeg ---
|
|
echo "=== Checking ffmpeg ==="
|
|
if command -v ffmpeg &>/dev/null; then
|
|
echo "ffmpeg found: $(ffmpeg -version 2>&1 | head -1)"
|
|
else
|
|
echo "WARNING: ffmpeg not found. Audio processing tools may not work."
|
|
echo "Install with: sudo apt install ffmpeg (Ubuntu/Debian)"
|
|
echo " or: brew install ffmpeg (macOS)"
|
|
fi
|
|
echo ""
|
|
|
|
# --- Check for model files ---
|
|
echo "=== Checking for model files ==="
|
|
QWEN_MODEL_PATH="${UMBRA_TTS__VOICEDESIGN_MODEL:-/mnt/models/qwen3-tts/Qwen3-TTS-12Hz-1.7B-VoiceDesign}"
|
|
BASE_MODEL_PATH="${UMBRA_TTS__BASE_MODEL:-/mnt/models/qwen3-tts/Qwen3-TTS-12Hz-1.7B-Base}"
|
|
|
|
if [ -d "$(dirname "$QWEN_MODEL_PATH")" ]; then
|
|
echo "Qwen TTS models directory found: $(dirname "$QWEN_MODEL_PATH")"
|
|
if [ -d "$QWEN_MODEL_PATH" ]; then
|
|
echo " VoiceDesign model: OK"
|
|
else
|
|
echo " VoiceDesign model: MISSING"
|
|
fi
|
|
if [ -d "$BASE_MODEL_PATH" ]; then
|
|
echo " Base model: OK"
|
|
else
|
|
echo " Base model: MISSING"
|
|
fi
|
|
else
|
|
echo "Qwen TTS models NOT found at $(dirname "$QWEN_MODEL_PATH")"
|
|
echo " You need to download Qwen3-TTS models to this path."
|
|
echo " Set UMBRA_TTS__VOICEDESIGN_MODEL and UMBRA_TTS__BASE_MODEL to override."
|
|
fi
|
|
echo ""
|
|
|
|
# --- LM Studio check ---
|
|
echo "=== Checking LM Studio (LLM server) ==="
|
|
if curl -s http://localhost:1234/v1/models &>/dev/null; then
|
|
echo "LM Studio server is running on http://localhost:1234/v1"
|
|
echo "Available models:"
|
|
curl -s http://localhost:1234/v1/models | python3 -c "
|
|
import json, sys
|
|
data = json.load(sys.stdin)
|
|
for m in data.get('data', []):
|
|
print(f' - {m[\"id\"]}')
|
|
" 2>/dev/null || echo " (could not list models)"
|
|
else
|
|
echo "LM Studio server NOT running on http://localhost:1234/v1"
|
|
echo " Start LM Studio and load a model (e.g., google/gemma-4-e4b)"
|
|
fi
|
|
echo ""
|
|
|
|
# --- Qwen TTS server check ---
|
|
echo "=== Checking Qwen TTS server ==="
|
|
if curl -s "http://localhost:8881" &>/dev/null; then
|
|
echo "Qwen TTS server is running on http://localhost:8881"
|
|
else
|
|
echo "Qwen TTS server NOT running on http://localhost:8881"
|
|
echo " To start Qwen TTS server:"
|
|
echo " 1. Install qwen-tts: pip install qwen-tts"
|
|
echo " 2. Start server with appropriate model"
|
|
fi
|
|
echo ""
|
|
|
|
# --- Web UI instructions ---
|
|
echo "=== Web UI ==="
|
|
echo " Start with:"
|
|
echo " python -c \\"from pathlib import Path; from umbraaudio.web import create_app; from umbraaudio.config import load_config; import uvicorn; config = load_config(Path('.')); app = create_app(config); uvicorn.run(app, host='0.0.0.0', port=8420)\\""
|
|
echo ""
|
|
|
|
# --- Summary ---
|
|
echo "=== Setup Complete! ==="
|
|
echo ""
|
|
echo "Quick Start Commands:"
|
|
echo " 1. python -m umbraaudio.cli # Interactive CLI"
|
|
echo " 2. python scripts/resegment_all.py --mechanical-only # Re-segment chapters"
|
|
echo " 3. python scripts/reattribute_all.py --model google/gemma-4-e4b # LLM speaker attribution"
|
|
echo " 4. pytest tests/ -v # Run tests"
|
|
echo ""
|
|
echo "Environment variables (set in .env or override as needed):"
|
|
echo " UMBRA_PROJECT_DIR - Project root path (default: $PROJECT_DIR)"
|
|
echo " UMBRA_DATA_DIR - Data directory (default: .umbra)"
|
|
echo " UMBRA_TTS__DEVICE - cuda or cpu"
|
|
echo " UMBRA_TTS__ENGINE - qwen, edge, or chatterbox"
|
|
echo " UMBRA_LLM__LMSTUDIO_BASE_URL - LM Studio URL"
|
|
echo " UMBRA_LLM__LMSTUDIO_MODEL - LM model name"
|
|
echo ""
|
|
echo "To activate this environment later, run:"
|
|
echo " source $UMBRA_PROJECT_DIR/.venv/bin/activate"
|