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.
Files changed (219) hide show
  1. package/.agentvibes/bmad/bmad-voices.md +69 -69
  2. package/.agentvibes/config.json +12 -0
  3. package/.claude/activation-instructions +54 -54
  4. package/.claude/audio/tracks/README.md +52 -52
  5. package/.claude/commands/agent-vibes/add.md +21 -21
  6. package/.claude/commands/agent-vibes/agent-vibes.md +101 -101
  7. package/.claude/commands/agent-vibes/agent.md +79 -79
  8. package/.claude/commands/agent-vibes/background-music.md +111 -111
  9. package/.claude/commands/agent-vibes/bmad.md +198 -198
  10. package/.claude/commands/agent-vibes/clean.md +18 -18
  11. package/.claude/commands/agent-vibes/cleanup.md +18 -18
  12. package/.claude/commands/agent-vibes/commands.json +145 -145
  13. package/.claude/commands/agent-vibes/effects.md +97 -97
  14. package/.claude/commands/agent-vibes/get.md +9 -9
  15. package/.claude/commands/agent-vibes/hide.md +91 -91
  16. package/.claude/commands/agent-vibes/language.md +23 -23
  17. package/.claude/commands/agent-vibes/learn.md +67 -67
  18. package/.claude/commands/agent-vibes/list.md +13 -13
  19. package/.claude/commands/agent-vibes/mute.md +37 -37
  20. package/.claude/commands/agent-vibes/preview.md +17 -17
  21. package/.claude/commands/agent-vibes/provider.md +68 -68
  22. package/.claude/commands/agent-vibes/replay-target.md +14 -14
  23. package/.claude/commands/agent-vibes/sample.md +12 -12
  24. package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -84
  25. package/.claude/commands/agent-vibes/set-pretext.md +65 -65
  26. package/.claude/commands/agent-vibes/set-speed.md +41 -41
  27. package/.claude/commands/agent-vibes/show.md +84 -84
  28. package/.claude/commands/agent-vibes/switch.md +87 -87
  29. package/.claude/commands/agent-vibes/target-voice.md +26 -26
  30. package/.claude/commands/agent-vibes/target.md +30 -30
  31. package/.claude/commands/agent-vibes/translate.md +68 -68
  32. package/.claude/commands/agent-vibes/unmute.md +45 -45
  33. package/.claude/commands/agent-vibes/verbosity.md +89 -89
  34. package/.claude/commands/agent-vibes/whoami.md +7 -7
  35. package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
  36. package/.claude/commands/agent-vibes-rdp.md +24 -24
  37. package/.claude/config/agentvibes.json +1 -0
  38. package/.claude/config/audio-effects.cfg +2 -2
  39. package/.claude/config/audio-effects.cfg.sample +52 -52
  40. package/.claude/config/background-music-volume.txt +1 -0
  41. package/.claude/config/intro-text.txt +1 -0
  42. package/.claude/config/piper-speech-rate.txt +4 -0
  43. package/.claude/config/piper-target-speech-rate.txt +1 -0
  44. package/.claude/config/reverb-level.txt +1 -0
  45. package/.claude/config/tts-speech-rate.txt +4 -0
  46. package/.claude/config/tts-target-speech-rate.txt +1 -0
  47. package/.claude/docs/TERMUX_SETUP.md +408 -408
  48. package/.claude/github-star-reminder.txt +1 -1
  49. package/.claude/hooks/README-TTS-QUEUE.md +135 -135
  50. package/.claude/hooks/audio-cache-utils.sh +246 -246
  51. package/.claude/hooks/audio-processor.sh +433 -433
  52. package/.claude/hooks/background-music-manager.sh +404 -404
  53. package/.claude/hooks/bmad-speak-enhanced.sh +165 -165
  54. package/.claude/hooks/bmad-speak.sh +269 -269
  55. package/.claude/hooks/bmad-tts-injector.sh +568 -568
  56. package/.claude/hooks/bmad-voice-manager.sh +928 -928
  57. package/.claude/hooks/clawdbot-receiver-SECURE.sh +129 -129
  58. package/.claude/hooks/clawdbot-receiver.sh +107 -107
  59. package/.claude/hooks/clean-audio-cache.sh +22 -22
  60. package/.claude/hooks/cleanup-cache.sh +106 -106
  61. package/.claude/hooks/configure-rdp-mode.sh +137 -137
  62. package/.claude/hooks/download-extra-voices.sh +244 -244
  63. package/.claude/hooks/effects-manager.sh +268 -268
  64. package/.claude/hooks/github-star-reminder.sh +154 -154
  65. package/.claude/hooks/language-manager.sh +362 -362
  66. package/.claude/hooks/learn-manager.sh +492 -492
  67. package/.claude/hooks/macos-voice-manager.sh +205 -205
  68. package/.claude/hooks/migrate-background-music.sh +125 -125
  69. package/.claude/hooks/migrate-to-agentvibes.sh +161 -161
  70. package/.claude/hooks/optimize-background-music.sh +87 -87
  71. package/.claude/hooks/path-resolver.sh +60 -60
  72. package/.claude/hooks/personality-manager.sh +448 -448
  73. package/.claude/hooks/piper-download-voices.sh +225 -225
  74. package/.claude/hooks/piper-installer.sh +292 -292
  75. package/.claude/hooks/piper-multispeaker-registry.sh +171 -171
  76. package/.claude/hooks/piper-voice-manager.sh +24 -3
  77. package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +90 -90
  78. package/.claude/hooks/play-tts-enhanced.sh +105 -105
  79. package/.claude/hooks/play-tts-macos.sh +368 -368
  80. package/.claude/hooks/play-tts-piper.sh +679 -679
  81. package/.claude/hooks/play-tts-soprano.sh +356 -356
  82. package/.claude/hooks/play-tts-ssh-remote.sh +167 -167
  83. package/.claude/hooks/play-tts-termux-ssh.sh +169 -169
  84. package/.claude/hooks/play-tts.sh +301 -301
  85. package/.claude/hooks/prepare-release.sh +54 -54
  86. package/.claude/hooks/provider-commands.sh +617 -617
  87. package/.claude/hooks/provider-manager.sh +399 -399
  88. package/.claude/hooks/replay-target-audio.sh +95 -95
  89. package/.claude/hooks/requirements.txt +6 -6
  90. package/.claude/hooks/sentiment-manager.sh +201 -201
  91. package/.claude/hooks/session-start-tts.sh +81 -81
  92. package/.claude/hooks/soprano-gradio-synth.py +139 -139
  93. package/.claude/hooks/speed-manager.sh +291 -291
  94. package/.claude/hooks/stop-tts.sh +84 -84
  95. package/.claude/hooks/termux-installer.sh +261 -261
  96. package/.claude/hooks/translate-manager.sh +341 -341
  97. package/.claude/hooks/translator.py +237 -237
  98. package/.claude/hooks/tts-queue-worker.sh +145 -145
  99. package/.claude/hooks/tts-queue.sh +165 -165
  100. package/.claude/hooks/verbosity-manager.sh +178 -178
  101. package/.claude/hooks/voice-manager.sh +548 -548
  102. package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
  103. package/.claude/hooks-windows/background-music-manager.ps1 +348 -0
  104. package/.claude/hooks-windows/clean-audio-cache.ps1 +53 -0
  105. package/.claude/hooks-windows/download-extra-voices.ps1 +185 -0
  106. package/.claude/hooks-windows/effects-manager.ps1 +294 -0
  107. package/.claude/hooks-windows/language-manager.ps1 +193 -0
  108. package/.claude/hooks-windows/learn-manager.ps1 +241 -0
  109. package/.claude/hooks-windows/personality-manager.ps1 +266 -0
  110. package/.claude/hooks-windows/play-tts-piper.ps1 +209 -0
  111. package/.claude/hooks-windows/play-tts-sapi.ps1 +108 -0
  112. package/.claude/hooks-windows/play-tts-soprano.ps1 +159 -158
  113. package/.claude/hooks-windows/play-tts-windows-piper.ps1 +50 -5
  114. package/.claude/hooks-windows/play-tts-windows-sapi.ps1 +108 -108
  115. package/.claude/hooks-windows/play-tts.ps1 +344 -266
  116. package/.claude/hooks-windows/provider-manager.ps1 +29 -10
  117. package/.claude/hooks-windows/session-start-tts.ps1 +124 -124
  118. package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
  119. package/.claude/hooks-windows/speed-manager.ps1 +166 -0
  120. package/.claude/hooks-windows/verbosity-manager.ps1 +119 -0
  121. package/.claude/hooks-windows/voice-manager-windows.ps1 +92 -8
  122. package/.claude/output-styles/agent-vibes.md +202 -202
  123. package/.claude/personalities/angry.md +14 -14
  124. package/.claude/personalities/annoying.md +14 -14
  125. package/.claude/personalities/crass.md +14 -14
  126. package/.claude/personalities/dramatic.md +14 -14
  127. package/.claude/personalities/dry-humor.md +50 -50
  128. package/.claude/personalities/flirty.md +20 -20
  129. package/.claude/personalities/funny.md +14 -14
  130. package/.claude/personalities/grandpa.md +32 -32
  131. package/.claude/personalities/millennial.md +14 -14
  132. package/.claude/personalities/moody.md +14 -14
  133. package/.claude/personalities/normal.md +16 -16
  134. package/.claude/personalities/pirate.md +14 -14
  135. package/.claude/personalities/poetic.md +14 -14
  136. package/.claude/personalities/professional.md +14 -14
  137. package/.claude/personalities/rapper.md +55 -55
  138. package/.claude/personalities/robot.md +14 -14
  139. package/.claude/personalities/sarcastic.md +38 -38
  140. package/.claude/personalities/sassy.md +14 -14
  141. package/.claude/personalities/surfer-dude.md +14 -14
  142. package/.claude/personalities/zen.md +14 -14
  143. package/.claude/settings.json +15 -15
  144. package/.claude/verbosity.txt +1 -1
  145. package/.clawdbot/README.md +105 -105
  146. package/.clawdbot/skill/SKILL.md +241 -241
  147. package/.mcp.json +12 -0
  148. package/CLAUDE.md +170 -170
  149. package/README.md +2029 -2007
  150. package/RELEASE_NOTES.md +1310 -1203
  151. package/WINDOWS-SETUP.md +208 -208
  152. package/bin/agent-vibes +39 -39
  153. package/bin/agentvibes-voice-browser.js +1840 -1840
  154. package/bin/agentvibes.js +48 -2
  155. package/bin/mcp-server.js +121 -121
  156. package/bin/mcp-server.sh +206 -206
  157. package/bin/test-bmad-pr +78 -78
  158. package/mcp-server/QUICK_START.md +203 -203
  159. package/mcp-server/README.md +345 -345
  160. package/mcp-server/WINDOWS_SETUP.md +260 -260
  161. package/mcp-server/docs/troubleshooting-audio.md +313 -313
  162. package/mcp-server/examples/claude_desktop_config.json +11 -11
  163. package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
  164. package/mcp-server/examples/custom_instructions.md +169 -169
  165. package/mcp-server/install-deps.js +130 -130
  166. package/mcp-server/pyproject.toml +52 -52
  167. package/mcp-server/requirements.txt +2 -2
  168. package/mcp-server/server.py +1465 -1453
  169. package/mcp-server/test_server.py +395 -395
  170. package/mcp-server/test_windows_script_parity.py +336 -0
  171. package/package.json +110 -110
  172. package/setup-windows.ps1 +815 -815
  173. package/src/bmad-detector.js +71 -71
  174. package/src/cli/list-personalities.js +110 -110
  175. package/src/cli/list-voices.js +114 -114
  176. package/src/commands/bmad-voices.js +394 -394
  177. package/src/commands/install-mcp.js +476 -476
  178. package/src/console/app.js +824 -824
  179. package/src/console/audio-env.js +20 -1
  180. package/src/console/brand-colors.js +13 -13
  181. package/src/console/constants/personalities.js +44 -44
  182. package/src/console/footer-config.js +50 -50
  183. package/src/console/modals/modal-overlay.js +247 -247
  184. package/src/console/navigation.js +62 -62
  185. package/src/console/tabs/agents-tab.js +1684 -1516
  186. package/src/console/tabs/help-tab.js +261 -261
  187. package/src/console/tabs/install-tab.js +1007 -991
  188. package/src/console/tabs/music-tab.js +22 -8
  189. package/src/console/tabs/placeholder-tab.js +53 -53
  190. package/src/console/tabs/readme-tab.js +267 -267
  191. package/src/console/tabs/receiver-tab.js +1472 -1212
  192. package/src/console/tabs/settings-tab.js +208 -84
  193. package/src/console/tabs/voices-tab.js +100 -21
  194. package/src/console/widgets/destroy-list.js +25 -25
  195. package/src/console/widgets/format-utils.js +89 -89
  196. package/src/console/widgets/notice.js +55 -55
  197. package/src/console/widgets/personality-picker.js +185 -185
  198. package/src/console/widgets/reverb-picker.js +94 -94
  199. package/src/console/widgets/track-picker.js +285 -285
  200. package/src/installer/music-file-input.js +304 -304
  201. package/src/installer.js +5895 -5829
  202. package/src/services/agent-voice-store.js +423 -423
  203. package/src/services/config-service.js +264 -264
  204. package/src/services/navigation-service.js +123 -123
  205. package/src/services/provider-service.js +143 -132
  206. package/src/services/verbosity-service.js +157 -157
  207. package/src/utils/audio-duration-validator.js +298 -298
  208. package/src/utils/audio-format-validator.js +277 -277
  209. package/src/utils/dependency-checker.js +469 -466
  210. package/src/utils/file-ownership-verifier.js +358 -358
  211. package/src/utils/list-formatter.js +194 -194
  212. package/src/utils/music-file-validator.js +285 -285
  213. package/src/utils/preview-list-prompt.js +136 -136
  214. package/src/utils/provider-validator.js +96 -12
  215. package/src/utils/secure-music-storage.js +412 -412
  216. package/templates/agentvibes-receiver.sh +482 -482
  217. package/templates/audio/welcome-music.mp3 +0 -0
  218. package/voice-assignments.json +8244 -8244
  219. 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 "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"