BMAD-METHOD/.claude/hooks/piper-installer.sh

179 lines
6.1 KiB
Bash
Executable File

#!/bin/bash
#
# File: .claude/hooks/piper-installer.sh
#
# AgentVibes - Finally, your AI Agents can Talk Back! Text-to-Speech WITH personality for AI Assistants!
# Website: https://agentvibes.org
# Repository: https://github.com/paulpreibisch/AgentVibes
#
# Co-created by Paul Preibisch with Claude AI
# Copyright (c) 2025 Paul Preibisch
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# DISCLAIMER: This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
# express or implied, including but not limited to the warranties of
# merchantability, fitness for a particular purpose and noninfringement.
# In no event shall the authors or copyright holders be liable for any claim,
# damages or other liability, whether in an action of contract, tort or
# otherwise, arising from, out of or in connection with the software or the
# use or other dealings in the software.
#
# ---
#
# @fileoverview Piper TTS Installer - Installs Piper TTS via pipx and downloads initial voice models
# @context Automated installation script for free offline Piper TTS on WSL/Linux systems
# @architecture Helper script for AgentVibes installer, invoked manually or from provider switcher
# @dependencies pipx (Python package installer), apt-get/brew/dnf/pacman (for pipx installation)
# @entrypoints Called by src/installer.js or manually by users during setup
# @patterns Platform detection (WSL/Linux only), package manager abstraction, guided voice download
# @related piper-download-voices.sh, provider-manager.sh, src/installer.js
#
set -e # Exit on error
echo "🎤 Piper TTS Installer"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
# Check if running on WSL or Linux
if ! grep -qi microsoft /proc/version 2>/dev/null && [[ "$(uname -s)" != "Linux" ]]; then
echo "❌ Piper TTS is only supported on WSL and Linux"
echo " Your platform: $(uname -s)"
echo ""
echo " For macOS/Windows, use ElevenLabs instead:"
echo " /agent-vibes:provider switch elevenlabs"
exit 1
fi
# Check if Piper is already installed
if command -v piper &> /dev/null; then
# Piper doesn't have a --version flag, just check if it exists
echo "✅ Piper TTS is already installed!"
echo " Location: $(which piper)"
echo ""
echo " Download voices with: .claude/hooks/piper-download-voices.sh"
exit 0
fi
echo "📦 Installing Piper TTS..."
echo ""
# Check if pipx is installed
if ! command -v pipx &> /dev/null; then
echo "⚠️ pipx not found. Installing pipx first..."
echo ""
# Try to install pipx
if command -v apt-get &> /dev/null; then
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y pipx
elif command -v brew &> /dev/null; then
# macOS (though Piper doesn't run on macOS)
brew install pipx
elif command -v dnf &> /dev/null; then
# Fedora
sudo dnf install -y pipx
elif command -v pacman &> /dev/null; then
# Arch Linux
sudo pacman -S python-pipx
else
echo "❌ Unable to install pipx automatically."
echo ""
echo " Please install pipx manually:"
echo " https://pipx.pypa.io/stable/installation/"
exit 1
fi
# Ensure pipx is in PATH
pipx ensurepath
echo ""
fi
# Install Piper TTS
echo "📥 Installing Piper TTS via pipx..."
pipx install piper-tts
if ! command -v piper &> /dev/null; then
echo ""
echo "❌ Installation completed but piper command not found in PATH"
echo ""
echo " Try running: pipx ensurepath"
echo " Then restart your terminal"
exit 1
fi
echo ""
echo "✅ Piper TTS installed successfully!"
echo ""
PIPER_VERSION=$(piper --version 2>&1 || echo "unknown")
echo " Version: $PIPER_VERSION"
echo ""
# Determine voices directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CLAUDE_DIR="$(dirname "$SCRIPT_DIR")"
# Check for configured voices directory
VOICES_DIR=""
if [[ -f "$CLAUDE_DIR/piper-voices-dir.txt" ]]; then
VOICES_DIR=$(cat "$CLAUDE_DIR/piper-voices-dir.txt")
elif [[ -f "$HOME/.claude/piper-voices-dir.txt" ]]; then
VOICES_DIR=$(cat "$HOME/.claude/piper-voices-dir.txt")
else
VOICES_DIR="$HOME/.claude/piper-voices"
fi
echo "📁 Voice storage location: $VOICES_DIR"
echo ""
# Ask if user wants to download voices now
read -p "Would you like to download voice models now? [Y/n] " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Yy]$ ]] || [[ -z $REPLY ]]; then
echo ""
echo "📥 Downloading recommended voices..."
echo ""
# Use the piper-download-voices.sh script if available
if [[ -f "$SCRIPT_DIR/piper-download-voices.sh" ]]; then
"$SCRIPT_DIR/piper-download-voices.sh"
else
# Manual download of a basic voice
mkdir -p "$VOICES_DIR"
echo "Downloading en_US-lessac-medium (recommended)..."
curl -L "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx" \
-o "$VOICES_DIR/en_US-lessac-medium.onnx"
curl -L "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx.json" \
-o "$VOICES_DIR/en_US-lessac-medium.onnx.json"
echo "✅ Voice downloaded!"
fi
fi
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🎉 Piper TTS Setup Complete!"
echo ""
echo "Next steps:"
echo " 1. Download more voices: .claude/hooks/piper-download-voices.sh"
echo " 2. List available voices: /agent-vibes:list"
echo " 3. Test it out: /agent-vibes:preview"
echo ""
echo "Enjoy your free, offline TTS! 🎤"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"