agentvibes 4.2.0 → 4.4.1
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 +208 -84
- 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 +5895 -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 +143 -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,225 +1,225 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# File: .claude/hooks/piper-download-voices.sh
|
|
4
|
-
#
|
|
5
|
-
# AgentVibes - Finally, your AI Agents can Talk Back! Text-to-Speech WITH personality for AI Assistants!
|
|
6
|
-
# Website: https://agentvibes.org
|
|
7
|
-
# Repository: https://github.com/paulpreibisch/AgentVibes
|
|
8
|
-
#
|
|
9
|
-
# Co-created by Paul Preibisch with Claude AI
|
|
10
|
-
# Copyright (c) 2025 Paul Preibisch
|
|
11
|
-
#
|
|
12
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
-
# you may not use this file except in compliance with the License.
|
|
14
|
-
# You may obtain a copy of the License at
|
|
15
|
-
#
|
|
16
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
-
#
|
|
18
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
19
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
-
# See the License for the specific language governing permissions and
|
|
22
|
-
# limitations under the License.
|
|
23
|
-
#
|
|
24
|
-
# DISCLAIMER: This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
25
|
-
# express or implied, including but not limited to the warranties of
|
|
26
|
-
# merchantability, fitness for a particular purpose and noninfringement.
|
|
27
|
-
# In no event shall the authors or copyright holders be liable for any claim,
|
|
28
|
-
# damages or other liability, whether in an action of contract, tort or
|
|
29
|
-
# otherwise, arising from, out of or in connection with the software or the
|
|
30
|
-
# use or other dealings in the software.
|
|
31
|
-
#
|
|
32
|
-
# ---
|
|
33
|
-
#
|
|
34
|
-
# @fileoverview Piper Voice Model Downloader - Batch downloads popular Piper TTS voices from HuggingFace
|
|
35
|
-
# @context Post-installation utility to download commonly used voices (~25MB each)
|
|
36
|
-
# @architecture Wrapper around piper-voice-manager.sh download functions with progress tracking
|
|
37
|
-
# @dependencies piper-voice-manager.sh (download logic), piper binary (for validation)
|
|
38
|
-
# @entrypoints Called by piper-installer.sh or manually via ./piper-download-voices.sh [--yes|-y]
|
|
39
|
-
# @patterns Batch operations, skip-existing logic, auto-yes flag for non-interactive use
|
|
40
|
-
# @related piper-voice-manager.sh, piper-installer.sh
|
|
41
|
-
#
|
|
42
|
-
|
|
43
|
-
# REQUIRED: Bash strict mode for security and reliability (CLAUDE.md)
|
|
44
|
-
set -euo pipefail
|
|
45
|
-
|
|
46
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
47
|
-
source "$SCRIPT_DIR/piper-voice-manager.sh"
|
|
48
|
-
|
|
49
|
-
# Parse command line arguments
|
|
50
|
-
AUTO_YES=false
|
|
51
|
-
if [[ "$1" == "--yes" ]] || [[ "$1" == "-y" ]]; then
|
|
52
|
-
AUTO_YES=true
|
|
53
|
-
fi
|
|
54
|
-
|
|
55
|
-
# Common voice models to download
|
|
56
|
-
COMMON_VOICES=(
|
|
57
|
-
"en_US-ryan-high" # Default, expressive male (30MB) - BMAD: John (pm)
|
|
58
|
-
"en_US-amy-medium" # Warm female (13MB) - BMAD: Mary (analyst)
|
|
59
|
-
"en_US-hfc_female-medium" # Professional female (13MB) - BMAD: Amelia (dev)
|
|
60
|
-
"en_US-lessac-medium" # Clear female (13MB) - BMAD: Murat (tea) - NOTE: Female voice
|
|
61
|
-
"en_US-danny-low" # Calm male (13MB) - BMAD: Winston (architect)
|
|
62
|
-
"en_US-bryce-medium" # Professional male (13MB) - BMAD: Bob (sm)
|
|
63
|
-
"en_US-kathleen-low" # Clear female (13MB) - BMAD: Paige (tech-writer)
|
|
64
|
-
"en_US-kusal-medium" # Male voice (13MB) - BMAD: Saif (frame-expert)
|
|
65
|
-
"en_US-kristin-medium" # Female voice (13MB) - BMAD: Sally (ux-designer)
|
|
66
|
-
"en_US-libritts_r-medium" # Premium male (57MB) - BMAD: BMad Master (NOTE: Changed from -high to -medium, -high doesn't exist)
|
|
67
|
-
"en_US-libritts-high" # Premium quality (57MB)
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
echo "🎙️ Piper Voice Model Downloader"
|
|
71
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
72
|
-
echo ""
|
|
73
|
-
echo "This will download the most commonly used Piper voice models."
|
|
74
|
-
echo "Each voice is approximately 25MB."
|
|
75
|
-
echo ""
|
|
76
|
-
|
|
77
|
-
# Check if piper is installed
|
|
78
|
-
if ! command -v piper &> /dev/null; then
|
|
79
|
-
echo "❌ Error: Piper TTS not installed" >&2
|
|
80
|
-
echo "Install with: pipx install piper-tts" >&2
|
|
81
|
-
exit 1
|
|
82
|
-
fi
|
|
83
|
-
|
|
84
|
-
# Get storage directory
|
|
85
|
-
VOICE_DIR=$(get_voice_storage_dir)
|
|
86
|
-
|
|
87
|
-
echo "📂 Storage location: \"$VOICE_DIR\""
|
|
88
|
-
echo ""
|
|
89
|
-
|
|
90
|
-
# Count already downloaded
|
|
91
|
-
ALREADY_DOWNLOADED=0
|
|
92
|
-
ALREADY_DOWNLOADED_LIST=()
|
|
93
|
-
NEED_DOWNLOAD=()
|
|
94
|
-
|
|
95
|
-
for voice in "${COMMON_VOICES[@]}"; do
|
|
96
|
-
if verify_voice "$voice" 2>/dev/null; then
|
|
97
|
-
((ALREADY_DOWNLOADED++))
|
|
98
|
-
ALREADY_DOWNLOADED_LIST+=("$voice")
|
|
99
|
-
else
|
|
100
|
-
NEED_DOWNLOAD+=("$voice")
|
|
101
|
-
fi
|
|
102
|
-
done
|
|
103
|
-
|
|
104
|
-
echo "📊 Status:"
|
|
105
|
-
echo " Already downloaded: \"$ALREADY_DOWNLOADED\" voice(s)"
|
|
106
|
-
echo " Need to download: \"${#NEED_DOWNLOAD[@]}\" voice(s)"
|
|
107
|
-
echo ""
|
|
108
|
-
|
|
109
|
-
# Show already downloaded voices
|
|
110
|
-
if [[ $ALREADY_DOWNLOADED -gt 0 ]]; then
|
|
111
|
-
echo "✅ Already downloaded (skipped):"
|
|
112
|
-
for voice in "${ALREADY_DOWNLOADED_LIST[@]}"; do
|
|
113
|
-
echo " ✓ $voice"
|
|
114
|
-
done
|
|
115
|
-
echo ""
|
|
116
|
-
fi
|
|
117
|
-
|
|
118
|
-
if [[ ${#NEED_DOWNLOAD[@]} -eq 0 ]]; then
|
|
119
|
-
echo "🎉 All common voices ready to use!"
|
|
120
|
-
exit 0
|
|
121
|
-
fi
|
|
122
|
-
|
|
123
|
-
echo "Voices to download:"
|
|
124
|
-
for voice in "${NEED_DOWNLOAD[@]}"; do
|
|
125
|
-
echo " • $voice (~25MB)"
|
|
126
|
-
done
|
|
127
|
-
echo ""
|
|
128
|
-
|
|
129
|
-
# Ask for confirmation (skip if --yes flag provided)
|
|
130
|
-
if [[ "$AUTO_YES" == "false" ]]; then
|
|
131
|
-
read -p "Download ${#NEED_DOWNLOAD[@]} voice model(s)? [Y/n]: " -n 1 -r
|
|
132
|
-
echo
|
|
133
|
-
|
|
134
|
-
# Validate input is Y, y, N, n, or empty (default to Y)
|
|
135
|
-
if [[ ! $REPLY =~ ^[YyNn]?$ ]]; then
|
|
136
|
-
echo "❌ Invalid input. Please enter Y or N." >&2
|
|
137
|
-
exit 1
|
|
138
|
-
fi
|
|
139
|
-
|
|
140
|
-
if [[ $REPLY =~ ^[Nn]$ ]]; then
|
|
141
|
-
echo "❌ Download cancelled" >&2
|
|
142
|
-
exit 0
|
|
143
|
-
fi
|
|
144
|
-
else
|
|
145
|
-
echo "Auto-downloading ${#NEED_DOWNLOAD[@]} voice model(s)..."
|
|
146
|
-
echo ""
|
|
147
|
-
fi
|
|
148
|
-
|
|
149
|
-
# Download each voice
|
|
150
|
-
DOWNLOADED=0
|
|
151
|
-
FAILED=0
|
|
152
|
-
|
|
153
|
-
for voice in "${NEED_DOWNLOAD[@]}"; do
|
|
154
|
-
echo ""
|
|
155
|
-
echo "📥 Downloading: $voice..."
|
|
156
|
-
|
|
157
|
-
if download_voice "$voice"; then
|
|
158
|
-
((DOWNLOADED++))
|
|
159
|
-
voice_path="$VOICE_DIR/${voice}.onnx"
|
|
160
|
-
file_size=$(du -h "$voice_path" 2>/dev/null | cut -f1)
|
|
161
|
-
echo " ✓ Downloaded: $voice"
|
|
162
|
-
echo " 📁 Path: $voice_path"
|
|
163
|
-
echo " 📦 Size: $file_size"
|
|
164
|
-
else
|
|
165
|
-
((FAILED++))
|
|
166
|
-
echo " ✗ Failed: $voice"
|
|
167
|
-
fi
|
|
168
|
-
done
|
|
169
|
-
|
|
170
|
-
echo ""
|
|
171
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
172
|
-
echo "📊 Download Summary:"
|
|
173
|
-
echo ""
|
|
174
|
-
echo "Installed voices:"
|
|
175
|
-
for voice in "${ALREADY_DOWNLOADED_LIST[@]}"; do
|
|
176
|
-
voice_path="$VOICE_DIR/${voice}.onnx"
|
|
177
|
-
file_size=$(du -h "$voice_path" 2>/dev/null | cut -f1)
|
|
178
|
-
echo " ✓ $voice ($file_size)"
|
|
179
|
-
echo " $voice_path"
|
|
180
|
-
done
|
|
181
|
-
|
|
182
|
-
if [[ $DOWNLOADED -gt 0 ]]; then
|
|
183
|
-
echo ""
|
|
184
|
-
echo "Just downloaded:"
|
|
185
|
-
for voice in "${NEED_DOWNLOAD[@]}"; do
|
|
186
|
-
voice_path="$VOICE_DIR/${voice}.onnx"
|
|
187
|
-
if [[ -f "$voice_path" ]]; then
|
|
188
|
-
file_size=$(du -h "$voice_path" 2>/dev/null | cut -f1)
|
|
189
|
-
echo " ✓ $voice ($file_size)"
|
|
190
|
-
echo " $voice_path"
|
|
191
|
-
fi
|
|
192
|
-
done
|
|
193
|
-
fi
|
|
194
|
-
|
|
195
|
-
if [[ $FAILED -gt 0 ]]; then
|
|
196
|
-
echo ""
|
|
197
|
-
echo "Failed downloads:"
|
|
198
|
-
for voice in "${NEED_DOWNLOAD[@]}"; do
|
|
199
|
-
voice_path="$VOICE_DIR/${voice}.onnx"
|
|
200
|
-
if [[ ! -f "$voice_path" ]]; then
|
|
201
|
-
echo " ✗ $voice"
|
|
202
|
-
fi
|
|
203
|
-
done
|
|
204
|
-
fi
|
|
205
|
-
|
|
206
|
-
echo ""
|
|
207
|
-
echo "Total: $((ALREADY_DOWNLOADED + DOWNLOADED)) voices available"
|
|
208
|
-
echo ""
|
|
209
|
-
|
|
210
|
-
if [[ $DOWNLOADED -gt 0 ]]; then
|
|
211
|
-
echo "✨ Ready to use Piper TTS with downloaded voices!"
|
|
212
|
-
echo ""
|
|
213
|
-
echo "Try it:"
|
|
214
|
-
echo " /agent-vibes:provider switch piper"
|
|
215
|
-
echo " /agent-vibes:preview"
|
|
216
|
-
fi
|
|
217
|
-
|
|
218
|
-
# Exit with error code if any downloads failed (Unix convention)
|
|
219
|
-
if [[ $FAILED -gt 0 ]]; then
|
|
220
|
-
echo "" >&2
|
|
221
|
-
echo "⚠️ Warning: $FAILED download(s) failed. Some voices may not be available." >&2
|
|
222
|
-
exit 1
|
|
223
|
-
fi
|
|
224
|
-
|
|
225
|
-
exit 0
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# File: .claude/hooks/piper-download-voices.sh
|
|
4
|
+
#
|
|
5
|
+
# AgentVibes - Finally, your AI Agents can Talk Back! Text-to-Speech WITH personality for AI Assistants!
|
|
6
|
+
# Website: https://agentvibes.org
|
|
7
|
+
# Repository: https://github.com/paulpreibisch/AgentVibes
|
|
8
|
+
#
|
|
9
|
+
# Co-created by Paul Preibisch with Claude AI
|
|
10
|
+
# Copyright (c) 2025 Paul Preibisch
|
|
11
|
+
#
|
|
12
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
+
# you may not use this file except in compliance with the License.
|
|
14
|
+
# You may obtain a copy of the License at
|
|
15
|
+
#
|
|
16
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
+
#
|
|
18
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
19
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
+
# See the License for the specific language governing permissions and
|
|
22
|
+
# limitations under the License.
|
|
23
|
+
#
|
|
24
|
+
# DISCLAIMER: This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
25
|
+
# express or implied, including but not limited to the warranties of
|
|
26
|
+
# merchantability, fitness for a particular purpose and noninfringement.
|
|
27
|
+
# In no event shall the authors or copyright holders be liable for any claim,
|
|
28
|
+
# damages or other liability, whether in an action of contract, tort or
|
|
29
|
+
# otherwise, arising from, out of or in connection with the software or the
|
|
30
|
+
# use or other dealings in the software.
|
|
31
|
+
#
|
|
32
|
+
# ---
|
|
33
|
+
#
|
|
34
|
+
# @fileoverview Piper Voice Model Downloader - Batch downloads popular Piper TTS voices from HuggingFace
|
|
35
|
+
# @context Post-installation utility to download commonly used voices (~25MB each)
|
|
36
|
+
# @architecture Wrapper around piper-voice-manager.sh download functions with progress tracking
|
|
37
|
+
# @dependencies piper-voice-manager.sh (download logic), piper binary (for validation)
|
|
38
|
+
# @entrypoints Called by piper-installer.sh or manually via ./piper-download-voices.sh [--yes|-y]
|
|
39
|
+
# @patterns Batch operations, skip-existing logic, auto-yes flag for non-interactive use
|
|
40
|
+
# @related piper-voice-manager.sh, piper-installer.sh
|
|
41
|
+
#
|
|
42
|
+
|
|
43
|
+
# REQUIRED: Bash strict mode for security and reliability (CLAUDE.md)
|
|
44
|
+
set -euo pipefail
|
|
45
|
+
|
|
46
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
47
|
+
source "$SCRIPT_DIR/piper-voice-manager.sh"
|
|
48
|
+
|
|
49
|
+
# Parse command line arguments
|
|
50
|
+
AUTO_YES=false
|
|
51
|
+
if [[ "$1" == "--yes" ]] || [[ "$1" == "-y" ]]; then
|
|
52
|
+
AUTO_YES=true
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
# Common voice models to download
|
|
56
|
+
COMMON_VOICES=(
|
|
57
|
+
"en_US-ryan-high" # Default, expressive male (30MB) - BMAD: John (pm)
|
|
58
|
+
"en_US-amy-medium" # Warm female (13MB) - BMAD: Mary (analyst)
|
|
59
|
+
"en_US-hfc_female-medium" # Professional female (13MB) - BMAD: Amelia (dev)
|
|
60
|
+
"en_US-lessac-medium" # Clear female (13MB) - BMAD: Murat (tea) - NOTE: Female voice
|
|
61
|
+
"en_US-danny-low" # Calm male (13MB) - BMAD: Winston (architect)
|
|
62
|
+
"en_US-bryce-medium" # Professional male (13MB) - BMAD: Bob (sm)
|
|
63
|
+
"en_US-kathleen-low" # Clear female (13MB) - BMAD: Paige (tech-writer)
|
|
64
|
+
"en_US-kusal-medium" # Male voice (13MB) - BMAD: Saif (frame-expert)
|
|
65
|
+
"en_US-kristin-medium" # Female voice (13MB) - BMAD: Sally (ux-designer)
|
|
66
|
+
"en_US-libritts_r-medium" # Premium male (57MB) - BMAD: BMad Master (NOTE: Changed from -high to -medium, -high doesn't exist)
|
|
67
|
+
"en_US-libritts-high" # Premium quality (57MB)
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
echo "🎙️ Piper Voice Model Downloader"
|
|
71
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
72
|
+
echo ""
|
|
73
|
+
echo "This will download the most commonly used Piper voice models."
|
|
74
|
+
echo "Each voice is approximately 25MB."
|
|
75
|
+
echo ""
|
|
76
|
+
|
|
77
|
+
# Check if piper is installed
|
|
78
|
+
if ! command -v piper &> /dev/null; then
|
|
79
|
+
echo "❌ Error: Piper TTS not installed" >&2
|
|
80
|
+
echo "Install with: pipx install piper-tts" >&2
|
|
81
|
+
exit 1
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
# Get storage directory
|
|
85
|
+
VOICE_DIR=$(get_voice_storage_dir)
|
|
86
|
+
|
|
87
|
+
echo "📂 Storage location: \"$VOICE_DIR\""
|
|
88
|
+
echo ""
|
|
89
|
+
|
|
90
|
+
# Count already downloaded
|
|
91
|
+
ALREADY_DOWNLOADED=0
|
|
92
|
+
ALREADY_DOWNLOADED_LIST=()
|
|
93
|
+
NEED_DOWNLOAD=()
|
|
94
|
+
|
|
95
|
+
for voice in "${COMMON_VOICES[@]}"; do
|
|
96
|
+
if verify_voice "$voice" 2>/dev/null; then
|
|
97
|
+
((ALREADY_DOWNLOADED++))
|
|
98
|
+
ALREADY_DOWNLOADED_LIST+=("$voice")
|
|
99
|
+
else
|
|
100
|
+
NEED_DOWNLOAD+=("$voice")
|
|
101
|
+
fi
|
|
102
|
+
done
|
|
103
|
+
|
|
104
|
+
echo "📊 Status:"
|
|
105
|
+
echo " Already downloaded: \"$ALREADY_DOWNLOADED\" voice(s)"
|
|
106
|
+
echo " Need to download: \"${#NEED_DOWNLOAD[@]}\" voice(s)"
|
|
107
|
+
echo ""
|
|
108
|
+
|
|
109
|
+
# Show already downloaded voices
|
|
110
|
+
if [[ $ALREADY_DOWNLOADED -gt 0 ]]; then
|
|
111
|
+
echo "✅ Already downloaded (skipped):"
|
|
112
|
+
for voice in "${ALREADY_DOWNLOADED_LIST[@]}"; do
|
|
113
|
+
echo " ✓ $voice"
|
|
114
|
+
done
|
|
115
|
+
echo ""
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
if [[ ${#NEED_DOWNLOAD[@]} -eq 0 ]]; then
|
|
119
|
+
echo "🎉 All common voices ready to use!"
|
|
120
|
+
exit 0
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
echo "Voices to download:"
|
|
124
|
+
for voice in "${NEED_DOWNLOAD[@]}"; do
|
|
125
|
+
echo " • $voice (~25MB)"
|
|
126
|
+
done
|
|
127
|
+
echo ""
|
|
128
|
+
|
|
129
|
+
# Ask for confirmation (skip if --yes flag provided)
|
|
130
|
+
if [[ "$AUTO_YES" == "false" ]]; then
|
|
131
|
+
read -p "Download ${#NEED_DOWNLOAD[@]} voice model(s)? [Y/n]: " -n 1 -r
|
|
132
|
+
echo
|
|
133
|
+
|
|
134
|
+
# Validate input is Y, y, N, n, or empty (default to Y)
|
|
135
|
+
if [[ ! $REPLY =~ ^[YyNn]?$ ]]; then
|
|
136
|
+
echo "❌ Invalid input. Please enter Y or N." >&2
|
|
137
|
+
exit 1
|
|
138
|
+
fi
|
|
139
|
+
|
|
140
|
+
if [[ $REPLY =~ ^[Nn]$ ]]; then
|
|
141
|
+
echo "❌ Download cancelled" >&2
|
|
142
|
+
exit 0
|
|
143
|
+
fi
|
|
144
|
+
else
|
|
145
|
+
echo "Auto-downloading ${#NEED_DOWNLOAD[@]} voice model(s)..."
|
|
146
|
+
echo ""
|
|
147
|
+
fi
|
|
148
|
+
|
|
149
|
+
# Download each voice
|
|
150
|
+
DOWNLOADED=0
|
|
151
|
+
FAILED=0
|
|
152
|
+
|
|
153
|
+
for voice in "${NEED_DOWNLOAD[@]}"; do
|
|
154
|
+
echo ""
|
|
155
|
+
echo "📥 Downloading: $voice..."
|
|
156
|
+
|
|
157
|
+
if download_voice "$voice"; then
|
|
158
|
+
((DOWNLOADED++))
|
|
159
|
+
voice_path="$VOICE_DIR/${voice}.onnx"
|
|
160
|
+
file_size=$(du -h "$voice_path" 2>/dev/null | cut -f1)
|
|
161
|
+
echo " ✓ Downloaded: $voice"
|
|
162
|
+
echo " 📁 Path: $voice_path"
|
|
163
|
+
echo " 📦 Size: $file_size"
|
|
164
|
+
else
|
|
165
|
+
((FAILED++))
|
|
166
|
+
echo " ✗ Failed: $voice"
|
|
167
|
+
fi
|
|
168
|
+
done
|
|
169
|
+
|
|
170
|
+
echo ""
|
|
171
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
172
|
+
echo "📊 Download Summary:"
|
|
173
|
+
echo ""
|
|
174
|
+
echo "Installed voices:"
|
|
175
|
+
for voice in "${ALREADY_DOWNLOADED_LIST[@]}"; do
|
|
176
|
+
voice_path="$VOICE_DIR/${voice}.onnx"
|
|
177
|
+
file_size=$(du -h "$voice_path" 2>/dev/null | cut -f1)
|
|
178
|
+
echo " ✓ $voice ($file_size)"
|
|
179
|
+
echo " $voice_path"
|
|
180
|
+
done
|
|
181
|
+
|
|
182
|
+
if [[ $DOWNLOADED -gt 0 ]]; then
|
|
183
|
+
echo ""
|
|
184
|
+
echo "Just downloaded:"
|
|
185
|
+
for voice in "${NEED_DOWNLOAD[@]}"; do
|
|
186
|
+
voice_path="$VOICE_DIR/${voice}.onnx"
|
|
187
|
+
if [[ -f "$voice_path" ]]; then
|
|
188
|
+
file_size=$(du -h "$voice_path" 2>/dev/null | cut -f1)
|
|
189
|
+
echo " ✓ $voice ($file_size)"
|
|
190
|
+
echo " $voice_path"
|
|
191
|
+
fi
|
|
192
|
+
done
|
|
193
|
+
fi
|
|
194
|
+
|
|
195
|
+
if [[ $FAILED -gt 0 ]]; then
|
|
196
|
+
echo ""
|
|
197
|
+
echo "Failed downloads:"
|
|
198
|
+
for voice in "${NEED_DOWNLOAD[@]}"; do
|
|
199
|
+
voice_path="$VOICE_DIR/${voice}.onnx"
|
|
200
|
+
if [[ ! -f "$voice_path" ]]; then
|
|
201
|
+
echo " ✗ $voice"
|
|
202
|
+
fi
|
|
203
|
+
done
|
|
204
|
+
fi
|
|
205
|
+
|
|
206
|
+
echo ""
|
|
207
|
+
echo "Total: $((ALREADY_DOWNLOADED + DOWNLOADED)) voices available"
|
|
208
|
+
echo ""
|
|
209
|
+
|
|
210
|
+
if [[ $DOWNLOADED -gt 0 ]]; then
|
|
211
|
+
echo "✨ Ready to use Piper TTS with downloaded voices!"
|
|
212
|
+
echo ""
|
|
213
|
+
echo "Try it:"
|
|
214
|
+
echo " /agent-vibes:provider switch piper"
|
|
215
|
+
echo " /agent-vibes:preview"
|
|
216
|
+
fi
|
|
217
|
+
|
|
218
|
+
# Exit with error code if any downloads failed (Unix convention)
|
|
219
|
+
if [[ $FAILED -gt 0 ]]; then
|
|
220
|
+
echo "" >&2
|
|
221
|
+
echo "⚠️ Warning: $FAILED download(s) failed. Some voices may not be available." >&2
|
|
222
|
+
exit 1
|
|
223
|
+
fi
|
|
224
|
+
|
|
225
|
+
exit 0
|