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,291 +1,291 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# File: .claude/hooks/speed-manager.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 Speech Speed Manager for Multi-Provider TTS
|
|
35
|
-
# @context Manage speech rate for main and target language voices
|
|
36
|
-
# @architecture Simple config file manager supporting Piper (length-scale) and macOS (speed API parameter)
|
|
37
|
-
# @dependencies .claude/config/tts-speech-rate.txt, .claude/config/tts-target-speech-rate.txt
|
|
38
|
-
# @entrypoints Called by /agent-vibes:set-speed slash command
|
|
39
|
-
# @patterns Provider-agnostic speed config, legacy file migration, random tongue twisters for testing
|
|
40
|
-
# @related play-tts.sh, play-tts-piper.sh, play-tts-macos.sh, learn-manager.sh
|
|
41
|
-
#
|
|
42
|
-
|
|
43
|
-
# Get script directory
|
|
44
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
45
|
-
|
|
46
|
-
# Determine config directory (project-local first, then global)
|
|
47
|
-
if [[ -n "$CLAUDE_PROJECT_DIR" ]] && [[ -d "$CLAUDE_PROJECT_DIR/.claude" ]]; then
|
|
48
|
-
CONFIG_DIR="$CLAUDE_PROJECT_DIR/.claude/config"
|
|
49
|
-
else
|
|
50
|
-
# Try to find .claude in current path
|
|
51
|
-
CURRENT_DIR="$PWD"
|
|
52
|
-
while [[ "$CURRENT_DIR" != "/" ]]; do
|
|
53
|
-
if [[ -d "$CURRENT_DIR/.claude" ]]; then
|
|
54
|
-
CONFIG_DIR="$CURRENT_DIR/.claude/config"
|
|
55
|
-
break
|
|
56
|
-
fi
|
|
57
|
-
CURRENT_DIR=$(dirname "$CURRENT_DIR")
|
|
58
|
-
done
|
|
59
|
-
# Fallback to global
|
|
60
|
-
if [[ -z "$CONFIG_DIR" ]]; then
|
|
61
|
-
CONFIG_DIR="$HOME/.claude/config"
|
|
62
|
-
fi
|
|
63
|
-
fi
|
|
64
|
-
|
|
65
|
-
mkdir -p "$CONFIG_DIR"
|
|
66
|
-
|
|
67
|
-
MAIN_SPEED_FILE="$CONFIG_DIR/tts-speech-rate.txt"
|
|
68
|
-
TARGET_SPEED_FILE="$CONFIG_DIR/tts-target-speech-rate.txt"
|
|
69
|
-
|
|
70
|
-
# Legacy file paths for backward compatibility (Piper-specific naming)
|
|
71
|
-
LEGACY_MAIN_SPEED_FILE="$CONFIG_DIR/piper-speech-rate.txt"
|
|
72
|
-
LEGACY_TARGET_SPEED_FILE="$CONFIG_DIR/piper-target-speech-rate.txt"
|
|
73
|
-
|
|
74
|
-
# @function parse_speed_value
|
|
75
|
-
# @intent Convert user-friendly speed notation to normalized speed multiplier
|
|
76
|
-
# @param $1 Speed string (e.g., "2x", "0.5x", "normal")
|
|
77
|
-
# @returns Numeric speed value (0.5=slower, 1.0=normal, 2.0=faster, 3.0=very fast)
|
|
78
|
-
# @note This is the user-facing scale - provider scripts will convert as needed
|
|
79
|
-
parse_speed_value() {
|
|
80
|
-
local input="$1"
|
|
81
|
-
|
|
82
|
-
# Handle special cases
|
|
83
|
-
case "$input" in
|
|
84
|
-
normal|1x|1.0)
|
|
85
|
-
echo "1.0"
|
|
86
|
-
return
|
|
87
|
-
;;
|
|
88
|
-
slow|slower|0.5x)
|
|
89
|
-
echo "0.5"
|
|
90
|
-
return
|
|
91
|
-
;;
|
|
92
|
-
fast|2x|2.0)
|
|
93
|
-
echo "2.0"
|
|
94
|
-
return
|
|
95
|
-
;;
|
|
96
|
-
faster|3x|3.0)
|
|
97
|
-
echo "3.0"
|
|
98
|
-
return
|
|
99
|
-
;;
|
|
100
|
-
esac
|
|
101
|
-
|
|
102
|
-
# Strip leading '+' or '-' if present
|
|
103
|
-
input="${input#+}"
|
|
104
|
-
input="${input#-}"
|
|
105
|
-
|
|
106
|
-
# Strip trailing 'x' if present
|
|
107
|
-
input="${input%x}"
|
|
108
|
-
|
|
109
|
-
# Validate it's a number
|
|
110
|
-
if [[ "$input" =~ ^[0-9]+\.?[0-9]*$ ]]; then
|
|
111
|
-
echo "$input"
|
|
112
|
-
else
|
|
113
|
-
echo "ERROR"
|
|
114
|
-
fi
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
# @function set_speed
|
|
118
|
-
# @intent Set speech speed for main or target voice
|
|
119
|
-
# @param $1 Target ("target" or empty for main)
|
|
120
|
-
# @param $2 Speed value
|
|
121
|
-
set_speed() {
|
|
122
|
-
local is_target=false
|
|
123
|
-
local speed_input=""
|
|
124
|
-
|
|
125
|
-
# Parse arguments
|
|
126
|
-
if [[ "$1" == "target" ]]; then
|
|
127
|
-
is_target=true
|
|
128
|
-
speed_input="$2"
|
|
129
|
-
else
|
|
130
|
-
speed_input="$1"
|
|
131
|
-
fi
|
|
132
|
-
|
|
133
|
-
if [[ -z "$speed_input" ]]; then
|
|
134
|
-
echo "❌ Error: Speed value required"
|
|
135
|
-
echo "Usage: /agent-vibes:set-speed [target] <speed>"
|
|
136
|
-
echo "Examples: 2x, 0.5x, normal, +3x"
|
|
137
|
-
return 1
|
|
138
|
-
fi
|
|
139
|
-
|
|
140
|
-
# Parse speed value
|
|
141
|
-
local speed_value
|
|
142
|
-
speed_value=$(parse_speed_value "$speed_input")
|
|
143
|
-
|
|
144
|
-
if [[ "$speed_value" == "ERROR" ]]; then
|
|
145
|
-
echo "❌ Invalid speed value: $speed_input"
|
|
146
|
-
echo "Valid values: normal, 0.5x, 1x, 2x, 3x, +2x, -2x"
|
|
147
|
-
return 1
|
|
148
|
-
fi
|
|
149
|
-
|
|
150
|
-
# Determine which file to write to
|
|
151
|
-
local config_file
|
|
152
|
-
local voice_type
|
|
153
|
-
if [[ "$is_target" == true ]]; then
|
|
154
|
-
config_file="$TARGET_SPEED_FILE"
|
|
155
|
-
voice_type="target language"
|
|
156
|
-
else
|
|
157
|
-
config_file="$MAIN_SPEED_FILE"
|
|
158
|
-
voice_type="main voice"
|
|
159
|
-
fi
|
|
160
|
-
|
|
161
|
-
# Write speed value
|
|
162
|
-
echo "$speed_value" > "$config_file"
|
|
163
|
-
|
|
164
|
-
# Show confirmation
|
|
165
|
-
echo "✓ Speech speed set for $voice_type"
|
|
166
|
-
echo ""
|
|
167
|
-
echo "Speed: ${speed_value}x"
|
|
168
|
-
|
|
169
|
-
case "$speed_value" in
|
|
170
|
-
0.5)
|
|
171
|
-
echo "Effect: Half speed (slower)"
|
|
172
|
-
;;
|
|
173
|
-
1.0)
|
|
174
|
-
echo "Effect: Normal speed"
|
|
175
|
-
;;
|
|
176
|
-
2.0)
|
|
177
|
-
echo "Effect: Double speed (faster)"
|
|
178
|
-
;;
|
|
179
|
-
3.0)
|
|
180
|
-
echo "Effect: Triple speed (very fast)"
|
|
181
|
-
;;
|
|
182
|
-
*)
|
|
183
|
-
if (( $(echo "$speed_value > 1.0" | bc -l) )); then
|
|
184
|
-
echo "Effect: Faster speech"
|
|
185
|
-
else
|
|
186
|
-
echo "Effect: Slower speech"
|
|
187
|
-
fi
|
|
188
|
-
;;
|
|
189
|
-
esac
|
|
190
|
-
|
|
191
|
-
echo ""
|
|
192
|
-
echo "Note: Speed control works with Piper and macOS providers"
|
|
193
|
-
|
|
194
|
-
# Array of simple test messages to demonstrate speed
|
|
195
|
-
local test_messages=(
|
|
196
|
-
"Testing speed change"
|
|
197
|
-
"Speed test in progress"
|
|
198
|
-
"Checking audio speed"
|
|
199
|
-
"Speed configuration test"
|
|
200
|
-
"Audio speed test"
|
|
201
|
-
)
|
|
202
|
-
|
|
203
|
-
# Pick a random test message
|
|
204
|
-
local random_index=$((RANDOM % ${#test_messages[@]}))
|
|
205
|
-
local test_msg="${test_messages[$random_index]}"
|
|
206
|
-
|
|
207
|
-
echo ""
|
|
208
|
-
echo "🔊 Testing new speed with: \"$test_msg\""
|
|
209
|
-
"$SCRIPT_DIR/play-tts.sh" "$test_msg" &
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
# @function migrate_legacy_files
|
|
213
|
-
# @intent Migrate from old piper-specific files to provider-agnostic files
|
|
214
|
-
# @why Ensure backward compatibility when upgrading from Piper-only to multi-provider
|
|
215
|
-
migrate_legacy_files() {
|
|
216
|
-
# Migrate main speed file
|
|
217
|
-
if [[ -f "$LEGACY_MAIN_SPEED_FILE" ]] && [[ ! -f "$MAIN_SPEED_FILE" ]]; then
|
|
218
|
-
cp "$LEGACY_MAIN_SPEED_FILE" "$MAIN_SPEED_FILE"
|
|
219
|
-
fi
|
|
220
|
-
|
|
221
|
-
# Migrate target speed file
|
|
222
|
-
if [[ -f "$LEGACY_TARGET_SPEED_FILE" ]] && [[ ! -f "$TARGET_SPEED_FILE" ]]; then
|
|
223
|
-
cp "$LEGACY_TARGET_SPEED_FILE" "$TARGET_SPEED_FILE"
|
|
224
|
-
fi
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
# @function get_speed
|
|
228
|
-
# @intent Display current speech speed settings
|
|
229
|
-
get_speed() {
|
|
230
|
-
# Migrate legacy files if needed
|
|
231
|
-
migrate_legacy_files
|
|
232
|
-
|
|
233
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
234
|
-
echo " Current Speech Speed Settings"
|
|
235
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
236
|
-
echo ""
|
|
237
|
-
|
|
238
|
-
# Main voice speed
|
|
239
|
-
if [[ -f "$MAIN_SPEED_FILE" ]]; then
|
|
240
|
-
local main_speed=$(grep -v '^#' "$MAIN_SPEED_FILE" 2>/dev/null | grep -v '^$' | tail -1)
|
|
241
|
-
echo "Main voice: ${main_speed}x"
|
|
242
|
-
else
|
|
243
|
-
echo "Main voice: 1.0x (default, normal speed)"
|
|
244
|
-
fi
|
|
245
|
-
|
|
246
|
-
# Target voice speed
|
|
247
|
-
if [[ -f "$TARGET_SPEED_FILE" ]]; then
|
|
248
|
-
local target_speed=$(cat "$TARGET_SPEED_FILE" 2>/dev/null)
|
|
249
|
-
echo "Target language: ${target_speed}x"
|
|
250
|
-
else
|
|
251
|
-
echo "Target language: 0.5x (default, slower for learning)"
|
|
252
|
-
fi
|
|
253
|
-
|
|
254
|
-
echo ""
|
|
255
|
-
echo "Scale: 0.5x=slower, 1.0x=normal, 2.0x=faster, 3.0x=very fast"
|
|
256
|
-
echo "Works with: Piper TTS and macOS"
|
|
257
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
# Main command handler
|
|
261
|
-
case "${1:-}" in
|
|
262
|
-
target)
|
|
263
|
-
set_speed "target" "$2"
|
|
264
|
-
;;
|
|
265
|
-
get|status)
|
|
266
|
-
get_speed
|
|
267
|
-
;;
|
|
268
|
-
normal|fast|slow|slower|*x|*.*|+*|-*)
|
|
269
|
-
set_speed "$1"
|
|
270
|
-
;;
|
|
271
|
-
*)
|
|
272
|
-
echo "Speech Speed Manager"
|
|
273
|
-
echo ""
|
|
274
|
-
echo "Usage:"
|
|
275
|
-
echo " /agent-vibes:set-speed <speed> Set main voice speed"
|
|
276
|
-
echo " /agent-vibes:set-speed target <speed> Set target language speed"
|
|
277
|
-
echo " /agent-vibes:set-speed get Show current speeds"
|
|
278
|
-
echo ""
|
|
279
|
-
echo "Speed values:"
|
|
280
|
-
echo " 0.5x or slow/slower = Half speed (slower)"
|
|
281
|
-
echo " 1x or normal = Normal speed"
|
|
282
|
-
echo " 2x or fast = Double speed (faster)"
|
|
283
|
-
echo " 3x or faster = Triple speed (very fast)"
|
|
284
|
-
echo ""
|
|
285
|
-
echo "Examples:"
|
|
286
|
-
echo " /agent-vibes:set-speed 2x # Make voice faster"
|
|
287
|
-
echo " /agent-vibes:set-speed 0.5x # Make voice slower"
|
|
288
|
-
echo " /agent-vibes:set-speed target 0.5x # Slow down target language for learning"
|
|
289
|
-
echo " /agent-vibes:set-speed normal # Reset to normal"
|
|
290
|
-
;;
|
|
291
|
-
esac
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# File: .claude/hooks/speed-manager.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 Speech Speed Manager for Multi-Provider TTS
|
|
35
|
+
# @context Manage speech rate for main and target language voices
|
|
36
|
+
# @architecture Simple config file manager supporting Piper (length-scale) and macOS (speed API parameter)
|
|
37
|
+
# @dependencies .claude/config/tts-speech-rate.txt, .claude/config/tts-target-speech-rate.txt
|
|
38
|
+
# @entrypoints Called by /agent-vibes:set-speed slash command
|
|
39
|
+
# @patterns Provider-agnostic speed config, legacy file migration, random tongue twisters for testing
|
|
40
|
+
# @related play-tts.sh, play-tts-piper.sh, play-tts-macos.sh, learn-manager.sh
|
|
41
|
+
#
|
|
42
|
+
|
|
43
|
+
# Get script directory
|
|
44
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
45
|
+
|
|
46
|
+
# Determine config directory (project-local first, then global)
|
|
47
|
+
if [[ -n "$CLAUDE_PROJECT_DIR" ]] && [[ -d "$CLAUDE_PROJECT_DIR/.claude" ]]; then
|
|
48
|
+
CONFIG_DIR="$CLAUDE_PROJECT_DIR/.claude/config"
|
|
49
|
+
else
|
|
50
|
+
# Try to find .claude in current path
|
|
51
|
+
CURRENT_DIR="$PWD"
|
|
52
|
+
while [[ "$CURRENT_DIR" != "/" ]]; do
|
|
53
|
+
if [[ -d "$CURRENT_DIR/.claude" ]]; then
|
|
54
|
+
CONFIG_DIR="$CURRENT_DIR/.claude/config"
|
|
55
|
+
break
|
|
56
|
+
fi
|
|
57
|
+
CURRENT_DIR=$(dirname "$CURRENT_DIR")
|
|
58
|
+
done
|
|
59
|
+
# Fallback to global
|
|
60
|
+
if [[ -z "$CONFIG_DIR" ]]; then
|
|
61
|
+
CONFIG_DIR="$HOME/.claude/config"
|
|
62
|
+
fi
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
mkdir -p "$CONFIG_DIR"
|
|
66
|
+
|
|
67
|
+
MAIN_SPEED_FILE="$CONFIG_DIR/tts-speech-rate.txt"
|
|
68
|
+
TARGET_SPEED_FILE="$CONFIG_DIR/tts-target-speech-rate.txt"
|
|
69
|
+
|
|
70
|
+
# Legacy file paths for backward compatibility (Piper-specific naming)
|
|
71
|
+
LEGACY_MAIN_SPEED_FILE="$CONFIG_DIR/piper-speech-rate.txt"
|
|
72
|
+
LEGACY_TARGET_SPEED_FILE="$CONFIG_DIR/piper-target-speech-rate.txt"
|
|
73
|
+
|
|
74
|
+
# @function parse_speed_value
|
|
75
|
+
# @intent Convert user-friendly speed notation to normalized speed multiplier
|
|
76
|
+
# @param $1 Speed string (e.g., "2x", "0.5x", "normal")
|
|
77
|
+
# @returns Numeric speed value (0.5=slower, 1.0=normal, 2.0=faster, 3.0=very fast)
|
|
78
|
+
# @note This is the user-facing scale - provider scripts will convert as needed
|
|
79
|
+
parse_speed_value() {
|
|
80
|
+
local input="$1"
|
|
81
|
+
|
|
82
|
+
# Handle special cases
|
|
83
|
+
case "$input" in
|
|
84
|
+
normal|1x|1.0)
|
|
85
|
+
echo "1.0"
|
|
86
|
+
return
|
|
87
|
+
;;
|
|
88
|
+
slow|slower|0.5x)
|
|
89
|
+
echo "0.5"
|
|
90
|
+
return
|
|
91
|
+
;;
|
|
92
|
+
fast|2x|2.0)
|
|
93
|
+
echo "2.0"
|
|
94
|
+
return
|
|
95
|
+
;;
|
|
96
|
+
faster|3x|3.0)
|
|
97
|
+
echo "3.0"
|
|
98
|
+
return
|
|
99
|
+
;;
|
|
100
|
+
esac
|
|
101
|
+
|
|
102
|
+
# Strip leading '+' or '-' if present
|
|
103
|
+
input="${input#+}"
|
|
104
|
+
input="${input#-}"
|
|
105
|
+
|
|
106
|
+
# Strip trailing 'x' if present
|
|
107
|
+
input="${input%x}"
|
|
108
|
+
|
|
109
|
+
# Validate it's a number
|
|
110
|
+
if [[ "$input" =~ ^[0-9]+\.?[0-9]*$ ]]; then
|
|
111
|
+
echo "$input"
|
|
112
|
+
else
|
|
113
|
+
echo "ERROR"
|
|
114
|
+
fi
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
# @function set_speed
|
|
118
|
+
# @intent Set speech speed for main or target voice
|
|
119
|
+
# @param $1 Target ("target" or empty for main)
|
|
120
|
+
# @param $2 Speed value
|
|
121
|
+
set_speed() {
|
|
122
|
+
local is_target=false
|
|
123
|
+
local speed_input=""
|
|
124
|
+
|
|
125
|
+
# Parse arguments
|
|
126
|
+
if [[ "$1" == "target" ]]; then
|
|
127
|
+
is_target=true
|
|
128
|
+
speed_input="$2"
|
|
129
|
+
else
|
|
130
|
+
speed_input="$1"
|
|
131
|
+
fi
|
|
132
|
+
|
|
133
|
+
if [[ -z "$speed_input" ]]; then
|
|
134
|
+
echo "❌ Error: Speed value required"
|
|
135
|
+
echo "Usage: /agent-vibes:set-speed [target] <speed>"
|
|
136
|
+
echo "Examples: 2x, 0.5x, normal, +3x"
|
|
137
|
+
return 1
|
|
138
|
+
fi
|
|
139
|
+
|
|
140
|
+
# Parse speed value
|
|
141
|
+
local speed_value
|
|
142
|
+
speed_value=$(parse_speed_value "$speed_input")
|
|
143
|
+
|
|
144
|
+
if [[ "$speed_value" == "ERROR" ]]; then
|
|
145
|
+
echo "❌ Invalid speed value: $speed_input"
|
|
146
|
+
echo "Valid values: normal, 0.5x, 1x, 2x, 3x, +2x, -2x"
|
|
147
|
+
return 1
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
# Determine which file to write to
|
|
151
|
+
local config_file
|
|
152
|
+
local voice_type
|
|
153
|
+
if [[ "$is_target" == true ]]; then
|
|
154
|
+
config_file="$TARGET_SPEED_FILE"
|
|
155
|
+
voice_type="target language"
|
|
156
|
+
else
|
|
157
|
+
config_file="$MAIN_SPEED_FILE"
|
|
158
|
+
voice_type="main voice"
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
# Write speed value
|
|
162
|
+
echo "$speed_value" > "$config_file"
|
|
163
|
+
|
|
164
|
+
# Show confirmation
|
|
165
|
+
echo "✓ Speech speed set for $voice_type"
|
|
166
|
+
echo ""
|
|
167
|
+
echo "Speed: ${speed_value}x"
|
|
168
|
+
|
|
169
|
+
case "$speed_value" in
|
|
170
|
+
0.5)
|
|
171
|
+
echo "Effect: Half speed (slower)"
|
|
172
|
+
;;
|
|
173
|
+
1.0)
|
|
174
|
+
echo "Effect: Normal speed"
|
|
175
|
+
;;
|
|
176
|
+
2.0)
|
|
177
|
+
echo "Effect: Double speed (faster)"
|
|
178
|
+
;;
|
|
179
|
+
3.0)
|
|
180
|
+
echo "Effect: Triple speed (very fast)"
|
|
181
|
+
;;
|
|
182
|
+
*)
|
|
183
|
+
if (( $(echo "$speed_value > 1.0" | bc -l) )); then
|
|
184
|
+
echo "Effect: Faster speech"
|
|
185
|
+
else
|
|
186
|
+
echo "Effect: Slower speech"
|
|
187
|
+
fi
|
|
188
|
+
;;
|
|
189
|
+
esac
|
|
190
|
+
|
|
191
|
+
echo ""
|
|
192
|
+
echo "Note: Speed control works with Piper and macOS providers"
|
|
193
|
+
|
|
194
|
+
# Array of simple test messages to demonstrate speed
|
|
195
|
+
local test_messages=(
|
|
196
|
+
"Testing speed change"
|
|
197
|
+
"Speed test in progress"
|
|
198
|
+
"Checking audio speed"
|
|
199
|
+
"Speed configuration test"
|
|
200
|
+
"Audio speed test"
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
# Pick a random test message
|
|
204
|
+
local random_index=$((RANDOM % ${#test_messages[@]}))
|
|
205
|
+
local test_msg="${test_messages[$random_index]}"
|
|
206
|
+
|
|
207
|
+
echo ""
|
|
208
|
+
echo "🔊 Testing new speed with: \"$test_msg\""
|
|
209
|
+
"$SCRIPT_DIR/play-tts.sh" "$test_msg" &
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
# @function migrate_legacy_files
|
|
213
|
+
# @intent Migrate from old piper-specific files to provider-agnostic files
|
|
214
|
+
# @why Ensure backward compatibility when upgrading from Piper-only to multi-provider
|
|
215
|
+
migrate_legacy_files() {
|
|
216
|
+
# Migrate main speed file
|
|
217
|
+
if [[ -f "$LEGACY_MAIN_SPEED_FILE" ]] && [[ ! -f "$MAIN_SPEED_FILE" ]]; then
|
|
218
|
+
cp "$LEGACY_MAIN_SPEED_FILE" "$MAIN_SPEED_FILE"
|
|
219
|
+
fi
|
|
220
|
+
|
|
221
|
+
# Migrate target speed file
|
|
222
|
+
if [[ -f "$LEGACY_TARGET_SPEED_FILE" ]] && [[ ! -f "$TARGET_SPEED_FILE" ]]; then
|
|
223
|
+
cp "$LEGACY_TARGET_SPEED_FILE" "$TARGET_SPEED_FILE"
|
|
224
|
+
fi
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
# @function get_speed
|
|
228
|
+
# @intent Display current speech speed settings
|
|
229
|
+
get_speed() {
|
|
230
|
+
# Migrate legacy files if needed
|
|
231
|
+
migrate_legacy_files
|
|
232
|
+
|
|
233
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
234
|
+
echo " Current Speech Speed Settings"
|
|
235
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
236
|
+
echo ""
|
|
237
|
+
|
|
238
|
+
# Main voice speed
|
|
239
|
+
if [[ -f "$MAIN_SPEED_FILE" ]]; then
|
|
240
|
+
local main_speed=$(grep -v '^#' "$MAIN_SPEED_FILE" 2>/dev/null | grep -v '^$' | tail -1)
|
|
241
|
+
echo "Main voice: ${main_speed}x"
|
|
242
|
+
else
|
|
243
|
+
echo "Main voice: 1.0x (default, normal speed)"
|
|
244
|
+
fi
|
|
245
|
+
|
|
246
|
+
# Target voice speed
|
|
247
|
+
if [[ -f "$TARGET_SPEED_FILE" ]]; then
|
|
248
|
+
local target_speed=$(cat "$TARGET_SPEED_FILE" 2>/dev/null)
|
|
249
|
+
echo "Target language: ${target_speed}x"
|
|
250
|
+
else
|
|
251
|
+
echo "Target language: 0.5x (default, slower for learning)"
|
|
252
|
+
fi
|
|
253
|
+
|
|
254
|
+
echo ""
|
|
255
|
+
echo "Scale: 0.5x=slower, 1.0x=normal, 2.0x=faster, 3.0x=very fast"
|
|
256
|
+
echo "Works with: Piper TTS and macOS"
|
|
257
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
# Main command handler
|
|
261
|
+
case "${1:-}" in
|
|
262
|
+
target)
|
|
263
|
+
set_speed "target" "$2"
|
|
264
|
+
;;
|
|
265
|
+
get|status)
|
|
266
|
+
get_speed
|
|
267
|
+
;;
|
|
268
|
+
normal|fast|slow|slower|*x|*.*|+*|-*)
|
|
269
|
+
set_speed "$1"
|
|
270
|
+
;;
|
|
271
|
+
*)
|
|
272
|
+
echo "Speech Speed Manager"
|
|
273
|
+
echo ""
|
|
274
|
+
echo "Usage:"
|
|
275
|
+
echo " /agent-vibes:set-speed <speed> Set main voice speed"
|
|
276
|
+
echo " /agent-vibes:set-speed target <speed> Set target language speed"
|
|
277
|
+
echo " /agent-vibes:set-speed get Show current speeds"
|
|
278
|
+
echo ""
|
|
279
|
+
echo "Speed values:"
|
|
280
|
+
echo " 0.5x or slow/slower = Half speed (slower)"
|
|
281
|
+
echo " 1x or normal = Normal speed"
|
|
282
|
+
echo " 2x or fast = Double speed (faster)"
|
|
283
|
+
echo " 3x or faster = Triple speed (very fast)"
|
|
284
|
+
echo ""
|
|
285
|
+
echo "Examples:"
|
|
286
|
+
echo " /agent-vibes:set-speed 2x # Make voice faster"
|
|
287
|
+
echo " /agent-vibes:set-speed 0.5x # Make voice slower"
|
|
288
|
+
echo " /agent-vibes:set-speed target 0.5x # Slow down target language for learning"
|
|
289
|
+
echo " /agent-vibes:set-speed normal # Reset to normal"
|
|
290
|
+
;;
|
|
291
|
+
esac
|