agentvibes 4.2.0 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agentvibes/bmad/bmad-voices.md +69 -69
- package/.agentvibes/config.json +12 -0
- package/.claude/activation-instructions +54 -54
- package/.claude/audio/tracks/README.md +52 -52
- package/.claude/commands/agent-vibes/add.md +21 -21
- package/.claude/commands/agent-vibes/agent-vibes.md +101 -101
- package/.claude/commands/agent-vibes/agent.md +79 -79
- package/.claude/commands/agent-vibes/background-music.md +111 -111
- package/.claude/commands/agent-vibes/bmad.md +198 -198
- package/.claude/commands/agent-vibes/clean.md +18 -18
- package/.claude/commands/agent-vibes/cleanup.md +18 -18
- package/.claude/commands/agent-vibes/commands.json +145 -145
- package/.claude/commands/agent-vibes/effects.md +97 -97
- package/.claude/commands/agent-vibes/get.md +9 -9
- package/.claude/commands/agent-vibes/hide.md +91 -91
- package/.claude/commands/agent-vibes/language.md +23 -23
- package/.claude/commands/agent-vibes/learn.md +67 -67
- package/.claude/commands/agent-vibes/list.md +13 -13
- package/.claude/commands/agent-vibes/mute.md +37 -37
- package/.claude/commands/agent-vibes/preview.md +17 -17
- package/.claude/commands/agent-vibes/provider.md +68 -68
- package/.claude/commands/agent-vibes/replay-target.md +14 -14
- package/.claude/commands/agent-vibes/sample.md +12 -12
- package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -84
- package/.claude/commands/agent-vibes/set-pretext.md +65 -65
- package/.claude/commands/agent-vibes/set-speed.md +41 -41
- package/.claude/commands/agent-vibes/show.md +84 -84
- package/.claude/commands/agent-vibes/switch.md +87 -87
- package/.claude/commands/agent-vibes/target-voice.md +26 -26
- package/.claude/commands/agent-vibes/target.md +30 -30
- package/.claude/commands/agent-vibes/translate.md +68 -68
- package/.claude/commands/agent-vibes/unmute.md +45 -45
- package/.claude/commands/agent-vibes/verbosity.md +89 -89
- package/.claude/commands/agent-vibes/whoami.md +7 -7
- package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
- package/.claude/commands/agent-vibes-rdp.md +24 -24
- package/.claude/config/agentvibes.json +1 -0
- package/.claude/config/audio-effects.cfg +2 -2
- package/.claude/config/audio-effects.cfg.sample +52 -52
- package/.claude/config/background-music-volume.txt +1 -0
- package/.claude/config/intro-text.txt +1 -0
- package/.claude/config/piper-speech-rate.txt +4 -0
- package/.claude/config/piper-target-speech-rate.txt +1 -0
- package/.claude/config/reverb-level.txt +1 -0
- package/.claude/config/tts-speech-rate.txt +4 -0
- package/.claude/config/tts-target-speech-rate.txt +1 -0
- package/.claude/docs/TERMUX_SETUP.md +408 -408
- package/.claude/github-star-reminder.txt +1 -1
- package/.claude/hooks/README-TTS-QUEUE.md +135 -135
- package/.claude/hooks/audio-cache-utils.sh +246 -246
- package/.claude/hooks/audio-processor.sh +433 -433
- package/.claude/hooks/background-music-manager.sh +404 -404
- package/.claude/hooks/bmad-speak-enhanced.sh +165 -165
- package/.claude/hooks/bmad-speak.sh +269 -269
- package/.claude/hooks/bmad-tts-injector.sh +568 -568
- package/.claude/hooks/bmad-voice-manager.sh +928 -928
- package/.claude/hooks/clawdbot-receiver-SECURE.sh +129 -129
- package/.claude/hooks/clawdbot-receiver.sh +107 -107
- package/.claude/hooks/clean-audio-cache.sh +22 -22
- package/.claude/hooks/cleanup-cache.sh +106 -106
- package/.claude/hooks/configure-rdp-mode.sh +137 -137
- package/.claude/hooks/download-extra-voices.sh +244 -244
- package/.claude/hooks/effects-manager.sh +268 -268
- package/.claude/hooks/github-star-reminder.sh +154 -154
- package/.claude/hooks/language-manager.sh +362 -362
- package/.claude/hooks/learn-manager.sh +492 -492
- package/.claude/hooks/macos-voice-manager.sh +205 -205
- package/.claude/hooks/migrate-background-music.sh +125 -125
- package/.claude/hooks/migrate-to-agentvibes.sh +161 -161
- package/.claude/hooks/optimize-background-music.sh +87 -87
- package/.claude/hooks/path-resolver.sh +60 -60
- package/.claude/hooks/personality-manager.sh +448 -448
- package/.claude/hooks/piper-download-voices.sh +225 -225
- package/.claude/hooks/piper-installer.sh +292 -292
- package/.claude/hooks/piper-multispeaker-registry.sh +171 -171
- package/.claude/hooks/piper-voice-manager.sh +24 -3
- package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +90 -90
- package/.claude/hooks/play-tts-enhanced.sh +105 -105
- package/.claude/hooks/play-tts-macos.sh +368 -368
- package/.claude/hooks/play-tts-piper.sh +679 -679
- package/.claude/hooks/play-tts-soprano.sh +356 -356
- package/.claude/hooks/play-tts-ssh-remote.sh +167 -167
- package/.claude/hooks/play-tts-termux-ssh.sh +169 -169
- package/.claude/hooks/play-tts.sh +301 -301
- package/.claude/hooks/prepare-release.sh +54 -54
- package/.claude/hooks/provider-commands.sh +617 -617
- package/.claude/hooks/provider-manager.sh +399 -399
- package/.claude/hooks/replay-target-audio.sh +95 -95
- package/.claude/hooks/requirements.txt +6 -6
- package/.claude/hooks/sentiment-manager.sh +201 -201
- package/.claude/hooks/session-start-tts.sh +81 -81
- package/.claude/hooks/soprano-gradio-synth.py +139 -139
- package/.claude/hooks/speed-manager.sh +291 -291
- package/.claude/hooks/stop-tts.sh +84 -84
- package/.claude/hooks/termux-installer.sh +261 -261
- package/.claude/hooks/translate-manager.sh +341 -341
- package/.claude/hooks/translator.py +237 -237
- package/.claude/hooks/tts-queue-worker.sh +145 -145
- package/.claude/hooks/tts-queue.sh +165 -165
- package/.claude/hooks/verbosity-manager.sh +178 -178
- package/.claude/hooks/voice-manager.sh +548 -548
- package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
- package/.claude/hooks-windows/background-music-manager.ps1 +348 -0
- package/.claude/hooks-windows/clean-audio-cache.ps1 +53 -0
- package/.claude/hooks-windows/download-extra-voices.ps1 +185 -0
- package/.claude/hooks-windows/effects-manager.ps1 +294 -0
- package/.claude/hooks-windows/language-manager.ps1 +193 -0
- package/.claude/hooks-windows/learn-manager.ps1 +241 -0
- package/.claude/hooks-windows/personality-manager.ps1 +266 -0
- package/.claude/hooks-windows/play-tts-piper.ps1 +209 -0
- package/.claude/hooks-windows/play-tts-sapi.ps1 +108 -0
- package/.claude/hooks-windows/play-tts-soprano.ps1 +159 -158
- package/.claude/hooks-windows/play-tts-windows-piper.ps1 +50 -5
- package/.claude/hooks-windows/play-tts-windows-sapi.ps1 +108 -108
- package/.claude/hooks-windows/play-tts.ps1 +344 -266
- package/.claude/hooks-windows/provider-manager.ps1 +29 -10
- package/.claude/hooks-windows/session-start-tts.ps1 +124 -124
- package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
- package/.claude/hooks-windows/speed-manager.ps1 +166 -0
- package/.claude/hooks-windows/verbosity-manager.ps1 +119 -0
- package/.claude/hooks-windows/voice-manager-windows.ps1 +92 -8
- package/.claude/output-styles/agent-vibes.md +202 -202
- package/.claude/personalities/angry.md +14 -14
- package/.claude/personalities/annoying.md +14 -14
- package/.claude/personalities/crass.md +14 -14
- package/.claude/personalities/dramatic.md +14 -14
- package/.claude/personalities/dry-humor.md +50 -50
- package/.claude/personalities/flirty.md +20 -20
- package/.claude/personalities/funny.md +14 -14
- package/.claude/personalities/grandpa.md +32 -32
- package/.claude/personalities/millennial.md +14 -14
- package/.claude/personalities/moody.md +14 -14
- package/.claude/personalities/normal.md +16 -16
- package/.claude/personalities/pirate.md +14 -14
- package/.claude/personalities/poetic.md +14 -14
- package/.claude/personalities/professional.md +14 -14
- package/.claude/personalities/rapper.md +55 -55
- package/.claude/personalities/robot.md +14 -14
- package/.claude/personalities/sarcastic.md +38 -38
- package/.claude/personalities/sassy.md +14 -14
- package/.claude/personalities/surfer-dude.md +14 -14
- package/.claude/personalities/zen.md +14 -14
- package/.claude/settings.json +15 -15
- package/.claude/verbosity.txt +1 -1
- package/.clawdbot/README.md +105 -105
- package/.clawdbot/skill/SKILL.md +241 -241
- package/.mcp.json +12 -0
- package/CLAUDE.md +170 -170
- package/README.md +2029 -2007
- package/RELEASE_NOTES.md +1310 -1203
- package/WINDOWS-SETUP.md +208 -208
- package/bin/agent-vibes +39 -39
- package/bin/agentvibes-voice-browser.js +1840 -1840
- package/bin/agentvibes.js +48 -2
- package/bin/mcp-server.js +121 -121
- package/bin/mcp-server.sh +206 -206
- package/bin/test-bmad-pr +78 -78
- package/mcp-server/QUICK_START.md +203 -203
- package/mcp-server/README.md +345 -345
- package/mcp-server/WINDOWS_SETUP.md +260 -260
- package/mcp-server/docs/troubleshooting-audio.md +313 -313
- package/mcp-server/examples/claude_desktop_config.json +11 -11
- package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
- package/mcp-server/examples/custom_instructions.md +169 -169
- package/mcp-server/install-deps.js +130 -130
- package/mcp-server/pyproject.toml +52 -52
- package/mcp-server/requirements.txt +2 -2
- package/mcp-server/server.py +1465 -1453
- package/mcp-server/test_server.py +395 -395
- package/mcp-server/test_windows_script_parity.py +336 -0
- package/package.json +110 -110
- package/setup-windows.ps1 +815 -815
- package/src/bmad-detector.js +71 -71
- package/src/cli/list-personalities.js +110 -110
- package/src/cli/list-voices.js +114 -114
- package/src/commands/bmad-voices.js +394 -394
- package/src/commands/install-mcp.js +476 -476
- package/src/console/app.js +824 -824
- package/src/console/audio-env.js +20 -1
- package/src/console/brand-colors.js +13 -13
- package/src/console/constants/personalities.js +44 -44
- package/src/console/footer-config.js +50 -50
- package/src/console/modals/modal-overlay.js +247 -247
- package/src/console/navigation.js +62 -62
- package/src/console/tabs/agents-tab.js +1684 -1516
- package/src/console/tabs/help-tab.js +261 -261
- package/src/console/tabs/install-tab.js +1007 -991
- package/src/console/tabs/music-tab.js +22 -8
- package/src/console/tabs/placeholder-tab.js +53 -53
- package/src/console/tabs/readme-tab.js +267 -267
- package/src/console/tabs/receiver-tab.js +1472 -1212
- package/src/console/tabs/settings-tab.js +152 -79
- package/src/console/tabs/voices-tab.js +100 -21
- package/src/console/widgets/destroy-list.js +25 -25
- package/src/console/widgets/format-utils.js +89 -89
- package/src/console/widgets/notice.js +55 -55
- package/src/console/widgets/personality-picker.js +185 -185
- package/src/console/widgets/reverb-picker.js +94 -94
- package/src/console/widgets/track-picker.js +285 -285
- package/src/installer/music-file-input.js +304 -304
- package/src/installer.js +5882 -5829
- package/src/services/agent-voice-store.js +423 -423
- package/src/services/config-service.js +264 -264
- package/src/services/navigation-service.js +123 -123
- package/src/services/provider-service.js +132 -132
- package/src/services/verbosity-service.js +157 -157
- package/src/utils/audio-duration-validator.js +298 -298
- package/src/utils/audio-format-validator.js +277 -277
- package/src/utils/dependency-checker.js +469 -466
- package/src/utils/file-ownership-verifier.js +358 -358
- package/src/utils/list-formatter.js +194 -194
- package/src/utils/music-file-validator.js +285 -285
- package/src/utils/preview-list-prompt.js +136 -136
- package/src/utils/provider-validator.js +96 -12
- package/src/utils/secure-music-storage.js +412 -412
- package/templates/agentvibes-receiver.sh +482 -482
- package/templates/audio/welcome-music.mp3 +0 -0
- package/voice-assignments.json +8244 -8244
- package/.claude/config/background-music-position.txt +0 -1
|
@@ -1,292 +1,292 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# File: .claude/hooks/piper-installer.sh
|
|
4
|
-
#
|
|
5
|
-
# AgentVibes - Finally, your AI Agents can Talk Back! Text-to-Speech WITH personality for AI Assistants!
|
|
6
|
-
#
|
|
7
|
-
# Usage: piper-installer.sh [--non-interactive]
|
|
8
|
-
# Website: https://agentvibes.org
|
|
9
|
-
# Repository: https://github.com/paulpreibisch/AgentVibes
|
|
10
|
-
#
|
|
11
|
-
# Co-created by Paul Preibisch with Claude AI
|
|
12
|
-
# Copyright (c) 2025 Paul Preibisch
|
|
13
|
-
#
|
|
14
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
15
|
-
# you may not use this file except in compliance with the License.
|
|
16
|
-
# You may obtain a copy of the License at
|
|
17
|
-
#
|
|
18
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
19
|
-
#
|
|
20
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
21
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
22
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
23
|
-
# See the License for the specific language governing permissions and
|
|
24
|
-
# limitations under the License.
|
|
25
|
-
#
|
|
26
|
-
# DISCLAIMER: This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
27
|
-
# express or implied, including but not limited to the warranties of
|
|
28
|
-
# merchantability, fitness for a particular purpose and noninfringement.
|
|
29
|
-
# In no event shall the authors or copyright holders be liable for any claim,
|
|
30
|
-
# damages or other liability, whether in an action of contract, tort or
|
|
31
|
-
# otherwise, arising from, out of or in connection with the software or the
|
|
32
|
-
# use or other dealings in the software.
|
|
33
|
-
#
|
|
34
|
-
# ---
|
|
35
|
-
#
|
|
36
|
-
# @fileoverview Piper TTS Installer - Installs Piper TTS via pipx and downloads initial voice models
|
|
37
|
-
# @context Automated installation script for free offline Piper TTS on WSL/Linux systems
|
|
38
|
-
# @architecture Helper script for AgentVibes installer, invoked manually or from provider switcher
|
|
39
|
-
# @dependencies pipx (Python package installer), apt-get/brew/dnf/pacman (for pipx installation)
|
|
40
|
-
# @entrypoints Called by src/installer.js or manually by users during setup
|
|
41
|
-
# @patterns Platform detection (WSL/Linux only), package manager abstraction, guided voice download
|
|
42
|
-
# @related piper-download-voices.sh, provider-manager.sh, src/installer.js
|
|
43
|
-
#
|
|
44
|
-
|
|
45
|
-
set -e # Exit on error
|
|
46
|
-
|
|
47
|
-
# Parse command line arguments
|
|
48
|
-
NON_INTERACTIVE=false
|
|
49
|
-
if [[ "$1" == "--non-interactive" ]]; then
|
|
50
|
-
NON_INTERACTIVE=true
|
|
51
|
-
fi
|
|
52
|
-
|
|
53
|
-
echo "🎤 Piper TTS Installer"
|
|
54
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
55
|
-
echo ""
|
|
56
|
-
|
|
57
|
-
# Detect platform
|
|
58
|
-
PLATFORM="$(uname -s)"
|
|
59
|
-
ARCH="$(uname -m)"
|
|
60
|
-
|
|
61
|
-
# Check if running on Termux/Android first
|
|
62
|
-
if [[ -d "/data/data/com.termux" ]]; then
|
|
63
|
-
echo "📱 Detected Termux/Android"
|
|
64
|
-
echo ""
|
|
65
|
-
echo " Termux requires a special installation process using proot-distro."
|
|
66
|
-
echo " Running Termux-specific installer..."
|
|
67
|
-
echo ""
|
|
68
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
69
|
-
if [[ -f "$SCRIPT_DIR/termux-installer.sh" ]]; then
|
|
70
|
-
exec "$SCRIPT_DIR/termux-installer.sh" "$@"
|
|
71
|
-
else
|
|
72
|
-
echo "❌ Error: termux-installer.sh not found"
|
|
73
|
-
echo " Please download it from the AgentVibes repository"
|
|
74
|
-
exit 1
|
|
75
|
-
fi
|
|
76
|
-
fi
|
|
77
|
-
|
|
78
|
-
# Check if running on macOS, WSL, or Linux
|
|
79
|
-
if [[ "$PLATFORM" == "Darwin" ]]; then
|
|
80
|
-
IS_MACOS=true
|
|
81
|
-
echo "🍎 Detected macOS"
|
|
82
|
-
elif grep -qi microsoft /proc/version 2>/dev/null || [[ "$PLATFORM" == "Linux" ]]; then
|
|
83
|
-
IS_MACOS=false
|
|
84
|
-
echo "🐧 Detected Linux/WSL"
|
|
85
|
-
else
|
|
86
|
-
echo "❌ Unsupported platform: $PLATFORM"
|
|
87
|
-
echo ""
|
|
88
|
-
echo " For Windows, use macOS provider instead:"
|
|
89
|
-
echo " /agent-vibes:provider switch macos"
|
|
90
|
-
exit 1
|
|
91
|
-
fi
|
|
92
|
-
|
|
93
|
-
# Check if Piper is already installed
|
|
94
|
-
if command -v piper &> /dev/null; then
|
|
95
|
-
# Piper doesn't have a --version flag, just check if it exists
|
|
96
|
-
echo "✅ Piper TTS is already installed!"
|
|
97
|
-
echo " Location: $(which piper)"
|
|
98
|
-
echo ""
|
|
99
|
-
echo " Download voices with: .claude/hooks/piper-download-voices.sh"
|
|
100
|
-
exit 0
|
|
101
|
-
fi
|
|
102
|
-
|
|
103
|
-
echo "📦 Installing Piper TTS..."
|
|
104
|
-
echo ""
|
|
105
|
-
|
|
106
|
-
# macOS: Use precompiled binaries
|
|
107
|
-
if [[ "$IS_MACOS" == true ]]; then
|
|
108
|
-
echo "🍎 Installing Piper TTS from precompiled binaries for macOS..."
|
|
109
|
-
echo ""
|
|
110
|
-
|
|
111
|
-
# Determine architecture
|
|
112
|
-
if [[ "$ARCH" == "arm64" ]]; then
|
|
113
|
-
echo "Detected Apple Silicon (M1/M2/M3)"
|
|
114
|
-
PIPER_URL="https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_macos_aarch64.tar.gz"
|
|
115
|
-
elif [[ "$ARCH" == "x86_64" ]]; then
|
|
116
|
-
echo "Detected Intel Mac"
|
|
117
|
-
PIPER_URL="https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_macos_x64.tar.gz"
|
|
118
|
-
else
|
|
119
|
-
echo "❌ Unsupported macOS architecture: $ARCH"
|
|
120
|
-
exit 1
|
|
121
|
-
fi
|
|
122
|
-
|
|
123
|
-
# Create installation directory
|
|
124
|
-
INSTALL_DIR="$HOME/.local/bin"
|
|
125
|
-
mkdir -p "$INSTALL_DIR"
|
|
126
|
-
|
|
127
|
-
# Download and extract
|
|
128
|
-
echo "📥 Downloading Piper from: $PIPER_URL"
|
|
129
|
-
TEMP_DIR=$(mktemp -d)
|
|
130
|
-
cd "$TEMP_DIR"
|
|
131
|
-
|
|
132
|
-
if curl -L "$PIPER_URL" | tar -xz; then
|
|
133
|
-
echo "✅ Downloaded and extracted successfully"
|
|
134
|
-
|
|
135
|
-
# Copy binaries to ~/.local/bin
|
|
136
|
-
if [[ -d "piper" ]]; then
|
|
137
|
-
cp -r piper/* "$INSTALL_DIR/"
|
|
138
|
-
chmod +x "$INSTALL_DIR/piper"
|
|
139
|
-
chmod +x "$INSTALL_DIR/piper_phonemize"
|
|
140
|
-
|
|
141
|
-
echo "✅ Installed Piper to: $INSTALL_DIR/piper"
|
|
142
|
-
|
|
143
|
-
# Add to PATH if not already there
|
|
144
|
-
if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then
|
|
145
|
-
echo ""
|
|
146
|
-
echo "⚠️ Add $INSTALL_DIR to your PATH:"
|
|
147
|
-
echo ""
|
|
148
|
-
if [[ "$SHELL" == *"zsh"* ]]; then
|
|
149
|
-
echo " echo 'export PATH=\"\$HOME/.local/bin:\$PATH\"' >> ~/.zshrc"
|
|
150
|
-
echo " source ~/.zshrc"
|
|
151
|
-
else
|
|
152
|
-
echo " echo 'export PATH=\"\$HOME/.local/bin:\$PATH\"' >> ~/.bash_profile"
|
|
153
|
-
echo " source ~/.bash_profile"
|
|
154
|
-
fi
|
|
155
|
-
fi
|
|
156
|
-
else
|
|
157
|
-
echo "❌ Failed to extract Piper binaries"
|
|
158
|
-
cd -
|
|
159
|
-
rm -rf "$TEMP_DIR"
|
|
160
|
-
exit 1
|
|
161
|
-
fi
|
|
162
|
-
else
|
|
163
|
-
echo "❌ Failed to download Piper"
|
|
164
|
-
cd -
|
|
165
|
-
rm -rf "$TEMP_DIR"
|
|
166
|
-
exit 1
|
|
167
|
-
fi
|
|
168
|
-
|
|
169
|
-
cd -
|
|
170
|
-
rm -rf "$TEMP_DIR"
|
|
171
|
-
|
|
172
|
-
# Linux/WSL: Use pipx
|
|
173
|
-
else
|
|
174
|
-
# Check if pipx is installed
|
|
175
|
-
if ! command -v pipx &> /dev/null; then
|
|
176
|
-
echo "⚠️ pipx not found. Installing pipx first..."
|
|
177
|
-
echo ""
|
|
178
|
-
|
|
179
|
-
# Try to install pipx
|
|
180
|
-
if command -v apt-get &> /dev/null; then
|
|
181
|
-
# Debian/Ubuntu
|
|
182
|
-
sudo apt-get update
|
|
183
|
-
sudo apt-get install -y pipx
|
|
184
|
-
elif command -v brew &> /dev/null; then
|
|
185
|
-
# Linux with Homebrew
|
|
186
|
-
brew install pipx
|
|
187
|
-
elif command -v dnf &> /dev/null; then
|
|
188
|
-
# Fedora
|
|
189
|
-
sudo dnf install -y pipx
|
|
190
|
-
elif command -v pacman &> /dev/null; then
|
|
191
|
-
# Arch Linux
|
|
192
|
-
sudo pacman -S python-pipx
|
|
193
|
-
else
|
|
194
|
-
echo "❌ Unable to install pipx automatically."
|
|
195
|
-
echo ""
|
|
196
|
-
echo " Please install pipx manually:"
|
|
197
|
-
echo " https://pipx.pypa.io/stable/installation/"
|
|
198
|
-
exit 1
|
|
199
|
-
fi
|
|
200
|
-
|
|
201
|
-
# Ensure pipx is in PATH
|
|
202
|
-
pipx ensurepath
|
|
203
|
-
echo ""
|
|
204
|
-
fi
|
|
205
|
-
|
|
206
|
-
# Install Piper TTS
|
|
207
|
-
echo "📥 Installing Piper TTS via pipx..."
|
|
208
|
-
pipx install piper-tts
|
|
209
|
-
|
|
210
|
-
if ! command -v piper &> /dev/null; then
|
|
211
|
-
echo ""
|
|
212
|
-
echo "❌ Installation completed but piper command not found in PATH"
|
|
213
|
-
echo ""
|
|
214
|
-
echo " Try running: pipx ensurepath"
|
|
215
|
-
echo " Then restart your terminal"
|
|
216
|
-
exit 1
|
|
217
|
-
fi
|
|
218
|
-
fi
|
|
219
|
-
|
|
220
|
-
echo ""
|
|
221
|
-
echo "✅ Piper TTS installed successfully!"
|
|
222
|
-
echo ""
|
|
223
|
-
|
|
224
|
-
# Use full path since PATH hasn't been updated in current session
|
|
225
|
-
PIPER_VERSION=$($INSTALL_DIR/piper --version 2>&1 || echo "unknown")
|
|
226
|
-
echo " Version: $PIPER_VERSION"
|
|
227
|
-
echo ""
|
|
228
|
-
|
|
229
|
-
# Determine voices directory
|
|
230
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
231
|
-
CLAUDE_DIR="$(dirname "$SCRIPT_DIR")"
|
|
232
|
-
|
|
233
|
-
# Check for configured voices directory
|
|
234
|
-
VOICES_DIR=""
|
|
235
|
-
if [[ -f "$CLAUDE_DIR/piper-voices-dir.txt" ]]; then
|
|
236
|
-
VOICES_DIR=$(cat "$CLAUDE_DIR/piper-voices-dir.txt")
|
|
237
|
-
elif [[ -f "$HOME/.claude/piper-voices-dir.txt" ]]; then
|
|
238
|
-
VOICES_DIR=$(cat "$HOME/.claude/piper-voices-dir.txt")
|
|
239
|
-
else
|
|
240
|
-
VOICES_DIR="$HOME/.claude/piper-voices"
|
|
241
|
-
fi
|
|
242
|
-
|
|
243
|
-
echo "📁 Voice storage location: $VOICES_DIR"
|
|
244
|
-
echo ""
|
|
245
|
-
|
|
246
|
-
# Ask if user wants to download voices now (skip in non-interactive mode)
|
|
247
|
-
DOWNLOAD_VOICES=true
|
|
248
|
-
if [[ "$NON_INTERACTIVE" == "false" ]]; then
|
|
249
|
-
read -p "Would you like to download voice models now? [Y/n] " -n 1 -r
|
|
250
|
-
echo ""
|
|
251
|
-
|
|
252
|
-
if [[ ! $REPLY =~ ^[Yy]$ ]] && [[ -n $REPLY ]]; then
|
|
253
|
-
DOWNLOAD_VOICES=false
|
|
254
|
-
fi
|
|
255
|
-
else
|
|
256
|
-
echo "📥 Auto-downloading recommended voices (non-interactive mode)..."
|
|
257
|
-
echo ""
|
|
258
|
-
fi
|
|
259
|
-
|
|
260
|
-
if [[ "$DOWNLOAD_VOICES" == "true" ]]; then
|
|
261
|
-
echo ""
|
|
262
|
-
echo "📥 Downloading recommended voices..."
|
|
263
|
-
echo ""
|
|
264
|
-
|
|
265
|
-
# Use the piper-download-voices.sh script if available
|
|
266
|
-
if [[ -f "$SCRIPT_DIR/piper-download-voices.sh" ]]; then
|
|
267
|
-
"$SCRIPT_DIR/piper-download-voices.sh" --yes
|
|
268
|
-
else
|
|
269
|
-
# Manual download of a basic voice
|
|
270
|
-
mkdir -p "$VOICES_DIR"
|
|
271
|
-
|
|
272
|
-
echo "Downloading en_US-lessac-medium (recommended)..."
|
|
273
|
-
curl -L "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx" \
|
|
274
|
-
-o "$VOICES_DIR/en_US-lessac-medium.onnx"
|
|
275
|
-
curl -L "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx.json" \
|
|
276
|
-
-o "$VOICES_DIR/en_US-lessac-medium.onnx.json"
|
|
277
|
-
|
|
278
|
-
echo "✅ Voice downloaded!"
|
|
279
|
-
fi
|
|
280
|
-
fi
|
|
281
|
-
|
|
282
|
-
echo ""
|
|
283
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
284
|
-
echo "🎉 Piper TTS Setup Complete!"
|
|
285
|
-
echo ""
|
|
286
|
-
echo "Next steps:"
|
|
287
|
-
echo " 1. Download more voices: .claude/hooks/piper-download-voices.sh"
|
|
288
|
-
echo " 2. List available voices: /agent-vibes:list"
|
|
289
|
-
echo " 3. Test it out: /agent-vibes:preview"
|
|
290
|
-
echo ""
|
|
291
|
-
echo "Enjoy your free, offline TTS! 🎤"
|
|
292
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# File: .claude/hooks/piper-installer.sh
|
|
4
|
+
#
|
|
5
|
+
# AgentVibes - Finally, your AI Agents can Talk Back! Text-to-Speech WITH personality for AI Assistants!
|
|
6
|
+
#
|
|
7
|
+
# Usage: piper-installer.sh [--non-interactive]
|
|
8
|
+
# Website: https://agentvibes.org
|
|
9
|
+
# Repository: https://github.com/paulpreibisch/AgentVibes
|
|
10
|
+
#
|
|
11
|
+
# Co-created by Paul Preibisch with Claude AI
|
|
12
|
+
# Copyright (c) 2025 Paul Preibisch
|
|
13
|
+
#
|
|
14
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
15
|
+
# you may not use this file except in compliance with the License.
|
|
16
|
+
# You may obtain a copy of the License at
|
|
17
|
+
#
|
|
18
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
19
|
+
#
|
|
20
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
21
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
22
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
23
|
+
# See the License for the specific language governing permissions and
|
|
24
|
+
# limitations under the License.
|
|
25
|
+
#
|
|
26
|
+
# DISCLAIMER: This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
27
|
+
# express or implied, including but not limited to the warranties of
|
|
28
|
+
# merchantability, fitness for a particular purpose and noninfringement.
|
|
29
|
+
# In no event shall the authors or copyright holders be liable for any claim,
|
|
30
|
+
# damages or other liability, whether in an action of contract, tort or
|
|
31
|
+
# otherwise, arising from, out of or in connection with the software or the
|
|
32
|
+
# use or other dealings in the software.
|
|
33
|
+
#
|
|
34
|
+
# ---
|
|
35
|
+
#
|
|
36
|
+
# @fileoverview Piper TTS Installer - Installs Piper TTS via pipx and downloads initial voice models
|
|
37
|
+
# @context Automated installation script for free offline Piper TTS on WSL/Linux systems
|
|
38
|
+
# @architecture Helper script for AgentVibes installer, invoked manually or from provider switcher
|
|
39
|
+
# @dependencies pipx (Python package installer), apt-get/brew/dnf/pacman (for pipx installation)
|
|
40
|
+
# @entrypoints Called by src/installer.js or manually by users during setup
|
|
41
|
+
# @patterns Platform detection (WSL/Linux only), package manager abstraction, guided voice download
|
|
42
|
+
# @related piper-download-voices.sh, provider-manager.sh, src/installer.js
|
|
43
|
+
#
|
|
44
|
+
|
|
45
|
+
set -e # Exit on error
|
|
46
|
+
|
|
47
|
+
# Parse command line arguments
|
|
48
|
+
NON_INTERACTIVE=false
|
|
49
|
+
if [[ "$1" == "--non-interactive" ]]; then
|
|
50
|
+
NON_INTERACTIVE=true
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
echo "🎤 Piper TTS Installer"
|
|
54
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
55
|
+
echo ""
|
|
56
|
+
|
|
57
|
+
# Detect platform
|
|
58
|
+
PLATFORM="$(uname -s)"
|
|
59
|
+
ARCH="$(uname -m)"
|
|
60
|
+
|
|
61
|
+
# Check if running on Termux/Android first
|
|
62
|
+
if [[ -d "/data/data/com.termux" ]]; then
|
|
63
|
+
echo "📱 Detected Termux/Android"
|
|
64
|
+
echo ""
|
|
65
|
+
echo " Termux requires a special installation process using proot-distro."
|
|
66
|
+
echo " Running Termux-specific installer..."
|
|
67
|
+
echo ""
|
|
68
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
69
|
+
if [[ -f "$SCRIPT_DIR/termux-installer.sh" ]]; then
|
|
70
|
+
exec "$SCRIPT_DIR/termux-installer.sh" "$@"
|
|
71
|
+
else
|
|
72
|
+
echo "❌ Error: termux-installer.sh not found"
|
|
73
|
+
echo " Please download it from the AgentVibes repository"
|
|
74
|
+
exit 1
|
|
75
|
+
fi
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
# Check if running on macOS, WSL, or Linux
|
|
79
|
+
if [[ "$PLATFORM" == "Darwin" ]]; then
|
|
80
|
+
IS_MACOS=true
|
|
81
|
+
echo "🍎 Detected macOS"
|
|
82
|
+
elif grep -qi microsoft /proc/version 2>/dev/null || [[ "$PLATFORM" == "Linux" ]]; then
|
|
83
|
+
IS_MACOS=false
|
|
84
|
+
echo "🐧 Detected Linux/WSL"
|
|
85
|
+
else
|
|
86
|
+
echo "❌ Unsupported platform: $PLATFORM"
|
|
87
|
+
echo ""
|
|
88
|
+
echo " For Windows, use macOS provider instead:"
|
|
89
|
+
echo " /agent-vibes:provider switch macos"
|
|
90
|
+
exit 1
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
# Check if Piper is already installed
|
|
94
|
+
if command -v piper &> /dev/null; then
|
|
95
|
+
# Piper doesn't have a --version flag, just check if it exists
|
|
96
|
+
echo "✅ Piper TTS is already installed!"
|
|
97
|
+
echo " Location: $(which piper)"
|
|
98
|
+
echo ""
|
|
99
|
+
echo " Download voices with: .claude/hooks/piper-download-voices.sh"
|
|
100
|
+
exit 0
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
echo "📦 Installing Piper TTS..."
|
|
104
|
+
echo ""
|
|
105
|
+
|
|
106
|
+
# macOS: Use precompiled binaries
|
|
107
|
+
if [[ "$IS_MACOS" == true ]]; then
|
|
108
|
+
echo "🍎 Installing Piper TTS from precompiled binaries for macOS..."
|
|
109
|
+
echo ""
|
|
110
|
+
|
|
111
|
+
# Determine architecture
|
|
112
|
+
if [[ "$ARCH" == "arm64" ]]; then
|
|
113
|
+
echo "Detected Apple Silicon (M1/M2/M3)"
|
|
114
|
+
PIPER_URL="https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_macos_aarch64.tar.gz"
|
|
115
|
+
elif [[ "$ARCH" == "x86_64" ]]; then
|
|
116
|
+
echo "Detected Intel Mac"
|
|
117
|
+
PIPER_URL="https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_macos_x64.tar.gz"
|
|
118
|
+
else
|
|
119
|
+
echo "❌ Unsupported macOS architecture: $ARCH"
|
|
120
|
+
exit 1
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# Create installation directory
|
|
124
|
+
INSTALL_DIR="$HOME/.local/bin"
|
|
125
|
+
mkdir -p "$INSTALL_DIR"
|
|
126
|
+
|
|
127
|
+
# Download and extract
|
|
128
|
+
echo "📥 Downloading Piper from: $PIPER_URL"
|
|
129
|
+
TEMP_DIR=$(mktemp -d)
|
|
130
|
+
cd "$TEMP_DIR"
|
|
131
|
+
|
|
132
|
+
if curl -L "$PIPER_URL" | tar -xz; then
|
|
133
|
+
echo "✅ Downloaded and extracted successfully"
|
|
134
|
+
|
|
135
|
+
# Copy binaries to ~/.local/bin
|
|
136
|
+
if [[ -d "piper" ]]; then
|
|
137
|
+
cp -r piper/* "$INSTALL_DIR/"
|
|
138
|
+
chmod +x "$INSTALL_DIR/piper"
|
|
139
|
+
chmod +x "$INSTALL_DIR/piper_phonemize"
|
|
140
|
+
|
|
141
|
+
echo "✅ Installed Piper to: $INSTALL_DIR/piper"
|
|
142
|
+
|
|
143
|
+
# Add to PATH if not already there
|
|
144
|
+
if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then
|
|
145
|
+
echo ""
|
|
146
|
+
echo "⚠️ Add $INSTALL_DIR to your PATH:"
|
|
147
|
+
echo ""
|
|
148
|
+
if [[ "$SHELL" == *"zsh"* ]]; then
|
|
149
|
+
echo " echo 'export PATH=\"\$HOME/.local/bin:\$PATH\"' >> ~/.zshrc"
|
|
150
|
+
echo " source ~/.zshrc"
|
|
151
|
+
else
|
|
152
|
+
echo " echo 'export PATH=\"\$HOME/.local/bin:\$PATH\"' >> ~/.bash_profile"
|
|
153
|
+
echo " source ~/.bash_profile"
|
|
154
|
+
fi
|
|
155
|
+
fi
|
|
156
|
+
else
|
|
157
|
+
echo "❌ Failed to extract Piper binaries"
|
|
158
|
+
cd -
|
|
159
|
+
rm -rf "$TEMP_DIR"
|
|
160
|
+
exit 1
|
|
161
|
+
fi
|
|
162
|
+
else
|
|
163
|
+
echo "❌ Failed to download Piper"
|
|
164
|
+
cd -
|
|
165
|
+
rm -rf "$TEMP_DIR"
|
|
166
|
+
exit 1
|
|
167
|
+
fi
|
|
168
|
+
|
|
169
|
+
cd -
|
|
170
|
+
rm -rf "$TEMP_DIR"
|
|
171
|
+
|
|
172
|
+
# Linux/WSL: Use pipx
|
|
173
|
+
else
|
|
174
|
+
# Check if pipx is installed
|
|
175
|
+
if ! command -v pipx &> /dev/null; then
|
|
176
|
+
echo "⚠️ pipx not found. Installing pipx first..."
|
|
177
|
+
echo ""
|
|
178
|
+
|
|
179
|
+
# Try to install pipx
|
|
180
|
+
if command -v apt-get &> /dev/null; then
|
|
181
|
+
# Debian/Ubuntu
|
|
182
|
+
sudo apt-get update
|
|
183
|
+
sudo apt-get install -y pipx
|
|
184
|
+
elif command -v brew &> /dev/null; then
|
|
185
|
+
# Linux with Homebrew
|
|
186
|
+
brew install pipx
|
|
187
|
+
elif command -v dnf &> /dev/null; then
|
|
188
|
+
# Fedora
|
|
189
|
+
sudo dnf install -y pipx
|
|
190
|
+
elif command -v pacman &> /dev/null; then
|
|
191
|
+
# Arch Linux
|
|
192
|
+
sudo pacman -S python-pipx
|
|
193
|
+
else
|
|
194
|
+
echo "❌ Unable to install pipx automatically."
|
|
195
|
+
echo ""
|
|
196
|
+
echo " Please install pipx manually:"
|
|
197
|
+
echo " https://pipx.pypa.io/stable/installation/"
|
|
198
|
+
exit 1
|
|
199
|
+
fi
|
|
200
|
+
|
|
201
|
+
# Ensure pipx is in PATH
|
|
202
|
+
pipx ensurepath
|
|
203
|
+
echo ""
|
|
204
|
+
fi
|
|
205
|
+
|
|
206
|
+
# Install Piper TTS
|
|
207
|
+
echo "📥 Installing Piper TTS via pipx..."
|
|
208
|
+
pipx install piper-tts
|
|
209
|
+
|
|
210
|
+
if ! command -v piper &> /dev/null; then
|
|
211
|
+
echo ""
|
|
212
|
+
echo "❌ Installation completed but piper command not found in PATH"
|
|
213
|
+
echo ""
|
|
214
|
+
echo " Try running: pipx ensurepath"
|
|
215
|
+
echo " Then restart your terminal"
|
|
216
|
+
exit 1
|
|
217
|
+
fi
|
|
218
|
+
fi
|
|
219
|
+
|
|
220
|
+
echo ""
|
|
221
|
+
echo "✅ Piper TTS installed successfully!"
|
|
222
|
+
echo ""
|
|
223
|
+
|
|
224
|
+
# Use full path since PATH hasn't been updated in current session
|
|
225
|
+
PIPER_VERSION=$($INSTALL_DIR/piper --version 2>&1 || echo "unknown")
|
|
226
|
+
echo " Version: $PIPER_VERSION"
|
|
227
|
+
echo ""
|
|
228
|
+
|
|
229
|
+
# Determine voices directory
|
|
230
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
231
|
+
CLAUDE_DIR="$(dirname "$SCRIPT_DIR")"
|
|
232
|
+
|
|
233
|
+
# Check for configured voices directory
|
|
234
|
+
VOICES_DIR=""
|
|
235
|
+
if [[ -f "$CLAUDE_DIR/piper-voices-dir.txt" ]]; then
|
|
236
|
+
VOICES_DIR=$(cat "$CLAUDE_DIR/piper-voices-dir.txt")
|
|
237
|
+
elif [[ -f "$HOME/.claude/piper-voices-dir.txt" ]]; then
|
|
238
|
+
VOICES_DIR=$(cat "$HOME/.claude/piper-voices-dir.txt")
|
|
239
|
+
else
|
|
240
|
+
VOICES_DIR="$HOME/.claude/piper-voices"
|
|
241
|
+
fi
|
|
242
|
+
|
|
243
|
+
echo "📁 Voice storage location: $VOICES_DIR"
|
|
244
|
+
echo ""
|
|
245
|
+
|
|
246
|
+
# Ask if user wants to download voices now (skip in non-interactive mode)
|
|
247
|
+
DOWNLOAD_VOICES=true
|
|
248
|
+
if [[ "$NON_INTERACTIVE" == "false" ]]; then
|
|
249
|
+
read -p "Would you like to download voice models now? [Y/n] " -n 1 -r
|
|
250
|
+
echo ""
|
|
251
|
+
|
|
252
|
+
if [[ ! $REPLY =~ ^[Yy]$ ]] && [[ -n $REPLY ]]; then
|
|
253
|
+
DOWNLOAD_VOICES=false
|
|
254
|
+
fi
|
|
255
|
+
else
|
|
256
|
+
echo "📥 Auto-downloading recommended voices (non-interactive mode)..."
|
|
257
|
+
echo ""
|
|
258
|
+
fi
|
|
259
|
+
|
|
260
|
+
if [[ "$DOWNLOAD_VOICES" == "true" ]]; then
|
|
261
|
+
echo ""
|
|
262
|
+
echo "📥 Downloading recommended voices..."
|
|
263
|
+
echo ""
|
|
264
|
+
|
|
265
|
+
# Use the piper-download-voices.sh script if available
|
|
266
|
+
if [[ -f "$SCRIPT_DIR/piper-download-voices.sh" ]]; then
|
|
267
|
+
"$SCRIPT_DIR/piper-download-voices.sh" --yes
|
|
268
|
+
else
|
|
269
|
+
# Manual download of a basic voice
|
|
270
|
+
mkdir -p "$VOICES_DIR"
|
|
271
|
+
|
|
272
|
+
echo "Downloading en_US-lessac-medium (recommended)..."
|
|
273
|
+
curl -L "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx" \
|
|
274
|
+
-o "$VOICES_DIR/en_US-lessac-medium.onnx"
|
|
275
|
+
curl -L "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx.json" \
|
|
276
|
+
-o "$VOICES_DIR/en_US-lessac-medium.onnx.json"
|
|
277
|
+
|
|
278
|
+
echo "✅ Voice downloaded!"
|
|
279
|
+
fi
|
|
280
|
+
fi
|
|
281
|
+
|
|
282
|
+
echo ""
|
|
283
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
284
|
+
echo "🎉 Piper TTS Setup Complete!"
|
|
285
|
+
echo ""
|
|
286
|
+
echo "Next steps:"
|
|
287
|
+
echo " 1. Download more voices: .claude/hooks/piper-download-voices.sh"
|
|
288
|
+
echo " 2. List available voices: /agent-vibes:list"
|
|
289
|
+
echo " 3. Test it out: /agent-vibes:preview"
|
|
290
|
+
echo ""
|
|
291
|
+
echo "Enjoy your free, offline TTS! 🎤"
|
|
292
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|