agentvibes 2.0.20 → 2.0.22
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/.claude/agents/health-coach.md +154 -0
- package/.claude/agents/motivator.md +171 -0
- package/.claude/agents/negotiator.md +97 -0
- package/.claude/commands/agent-vibes/agent-health-coach.md +15 -0
- package/.claude/commands/agent-vibes/agent-motivator.md +15 -0
- package/.claude/commands/agent-vibes/agent-negotiator.md +15 -0
- package/.claude/commands/agent-vibes/agent.md +79 -0
- package/.claude/commands/agent-vibes/commands.json +4 -0
- package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -0
- package/.claude/github-star-reminder.txt +1 -1
- package/.claude/hooks/download-extra-voices.sh +244 -0
- package/.claude/hooks/personality-manager.sh +81 -0
- package/.claude/hooks/piper-download-voices.sh +3 -93
- package/.claude/hooks/piper-multispeaker-registry.sh +165 -0
- package/.claude/hooks/play-tts-elevenlabs.sh +5 -3
- package/.claude/hooks/play-tts-piper.sh +27 -44
- package/.claude/hooks/provider-manager.sh +24 -5
- package/.claude/hooks/speed-manager.sh +10 -12
- package/.claude/hooks/voice-manager.sh +94 -56
- package/README.md +0 -3
- package/RELEASE_NOTES.md +40 -247
- package/docs/agents.md +485 -0
- package/docs/commands.md +1 -21
- package/docs/extra-voices-implementation-summary.md +235 -0
- package/docs/voice-registration-fix.md +254 -0
- package/fix-vscode-colors.sh +88 -0
- package/fixcolors +88 -0
- package/generate-all-agent-voices.sh +174 -0
- package/generate-missing-elevenlabs-complete.sh +236 -0
- package/generate-missing-elevenlabs.sh +110 -0
- package/generate-new-voices.sh +108 -0
- package/generate-piper-agent-intros.sh +85 -0
- package/generate-provider-and-agent-intros.sh +136 -0
- package/logo/fav_icon_128x128.png +0 -0
- package/logo/fav_icon_128x128.png:Zone.Identifier +4 -0
- package/logo/logo1.webp +0 -0
- package/logo/logo1.webp:Zone.Identifier +4 -0
- package/logo/social.png +0 -0
- package/logo/social.png:Zone.Identifier +4 -0
- package/mcp-server/agentvibes.db +0 -0
- package/mcp-server/server.py +47 -14
- package/package.json +3 -3
- package/regenerate-agent-voices.sh +79 -0
- package/test/unit/provider-manager.bats +8 -5
- package/test/unit/speed-manager.bats +4 -4
- package/agentvibes.org/.claude/audio/tts-padded-1760744118.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760748535.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760748676.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760750748.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760750947.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760752718.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760752907.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753017.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753045.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753241.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753315.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753382.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753408.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753426.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753446.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753541.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753553.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753577.mp3 +0 -0
- package/agentvibes.org/.claude/commands/agent-vibes/add.md +0 -21
- package/agentvibes.org/.claude/commands/agent-vibes/agent-vibes.md +0 -68
- package/agentvibes.org/.claude/commands/agent-vibes/bmad.md +0 -196
- package/agentvibes.org/.claude/commands/agent-vibes/commands.json +0 -77
- package/agentvibes.org/.claude/commands/agent-vibes/get.md +0 -9
- package/agentvibes.org/.claude/commands/agent-vibes/language.md +0 -23
- package/agentvibes.org/.claude/commands/agent-vibes/learn.md +0 -67
- package/agentvibes.org/.claude/commands/agent-vibes/list.md +0 -13
- package/agentvibes.org/.claude/commands/agent-vibes/personality.md +0 -79
- package/agentvibes.org/.claude/commands/agent-vibes/preview.md +0 -17
- package/agentvibes.org/.claude/commands/agent-vibes/provider.md +0 -54
- package/agentvibes.org/.claude/commands/agent-vibes/replay-target.md +0 -14
- package/agentvibes.org/.claude/commands/agent-vibes/replay.md +0 -19
- package/agentvibes.org/.claude/commands/agent-vibes/sample.md +0 -12
- package/agentvibes.org/.claude/commands/agent-vibes/sentiment.md +0 -52
- package/agentvibes.org/.claude/commands/agent-vibes/set-language.md +0 -47
- package/agentvibes.org/.claude/commands/agent-vibes/set-pretext.md +0 -65
- package/agentvibes.org/.claude/commands/agent-vibes/set-speed.md +0 -41
- package/agentvibes.org/.claude/commands/agent-vibes/switch.md +0 -53
- package/agentvibes.org/.claude/commands/agent-vibes/target-voice.md +0 -26
- package/agentvibes.org/.claude/commands/agent-vibes/target.md +0 -30
- package/agentvibes.org/.claude/commands/agent-vibes/update.md +0 -20
- package/agentvibes.org/.claude/commands/agent-vibes/version.md +0 -10
- package/agentvibes.org/.claude/commands/agent-vibes/whoami.md +0 -7
- package/agentvibes.org/.claude/hooks/bmad-tts-injector.sh +0 -386
- package/agentvibes.org/.claude/hooks/bmad-voice-manager.sh +0 -375
- package/agentvibes.org/.claude/hooks/check-output-style.sh +0 -60
- package/agentvibes.org/.claude/hooks/github-star-reminder.sh +0 -94
- package/agentvibes.org/.claude/hooks/language-manager.sh +0 -360
- package/agentvibes.org/.claude/hooks/learn-manager.sh +0 -443
- package/agentvibes.org/.claude/hooks/personality-manager.sh +0 -324
- package/agentvibes.org/.claude/hooks/piper-download-voices.sh +0 -133
- package/agentvibes.org/.claude/hooks/piper-installer.sh +0 -144
- package/agentvibes.org/.claude/hooks/piper-voice-manager.sh +0 -227
- package/agentvibes.org/.claude/hooks/play-tts-elevenlabs.sh +0 -376
- package/agentvibes.org/.claude/hooks/play-tts-piper.sh +0 -281
- package/agentvibes.org/.claude/hooks/play-tts.sh +0 -69
- package/agentvibes.org/.claude/hooks/provider-commands.sh +0 -505
- package/agentvibes.org/.claude/hooks/provider-manager.sh +0 -248
- package/agentvibes.org/.claude/hooks/replay-target-audio.sh +0 -64
- package/agentvibes.org/.claude/hooks/sentiment-manager.sh +0 -163
- package/agentvibes.org/.claude/hooks/speed-manager.sh +0 -259
- package/agentvibes.org/.claude/hooks/voice-manager.sh +0 -477
- package/agentvibes.org/.claude/hooks/voices-config.sh +0 -33
- package/agentvibes.org/.claude/journal/2025-10-07.html +0 -373
- package/agentvibes.org/.claude/journal/index.html +0 -91
- package/agentvibes.org/.claude/output-styles/agent-vibes.md +0 -203
- package/agentvibes.org/.claude/personalities/angry.md +0 -17
- package/agentvibes.org/.claude/personalities/annoying.md +0 -17
- package/agentvibes.org/.claude/personalities/crass.md +0 -17
- package/agentvibes.org/.claude/personalities/dramatic.md +0 -17
- package/agentvibes.org/.claude/personalities/dry-humor.md +0 -53
- package/agentvibes.org/.claude/personalities/flirty.md +0 -23
- package/agentvibes.org/.claude/personalities/funny.md +0 -17
- package/agentvibes.org/.claude/personalities/grandpa.md +0 -35
- package/agentvibes.org/.claude/personalities/millennial.md +0 -17
- package/agentvibes.org/.claude/personalities/moody.md +0 -17
- package/agentvibes.org/.claude/personalities/normal.md +0 -19
- package/agentvibes.org/.claude/personalities/pirate.md +0 -17
- package/agentvibes.org/.claude/personalities/poetic.md +0 -17
- package/agentvibes.org/.claude/personalities/professional.md +0 -17
- package/agentvibes.org/.claude/personalities/robot.md +0 -17
- package/agentvibes.org/.claude/personalities/sarcastic.md +0 -41
- package/agentvibes.org/.claude/personalities/sassy.md +0 -17
- package/agentvibes.org/.claude/personalities/surfer-dude.md +0 -17
- package/agentvibes.org/.claude/personalities/zen.md +0 -17
- package/agentvibes.org/.claude/piper-voices-dir.txt +0 -1
- package/agentvibes.org/.claude/plugins/bmad-voices.md +0 -42
- package/agentvibes.org/.claude/tts-provider.txt +0 -1
- package/agentvibes.org/.mcp-minimal.json +0 -60
- package/agentvibes.org/CHANGELOG.md +0 -56
- package/agentvibes.org/README.md +0 -93
- package/agentvibes.org/app/(auth)/layout.tsx +0 -15
- package/agentvibes.org/app/(auth)/reset-password/page.tsx +0 -45
- package/agentvibes.org/app/(auth)/signin/page.tsx +0 -82
- package/agentvibes.org/app/(auth)/signup/page.tsx +0 -104
- package/agentvibes.org/app/(default)/blog/[slug]/page.tsx +0 -128
- package/agentvibes.org/app/(default)/blog/page.tsx +0 -95
- package/agentvibes.org/app/(default)/layout.tsx +0 -31
- package/agentvibes.org/app/(default)/page.tsx +0 -20
- package/agentvibes.org/app/api/hello/route.ts +0 -3
- package/agentvibes.org/app/css/additional-styles/theme.css +0 -82
- package/agentvibes.org/app/css/additional-styles/utility-patterns.css +0 -55
- package/agentvibes.org/app/css/style.css +0 -100
- package/agentvibes.org/app/layout.tsx +0 -63
- package/agentvibes.org/components/code-block.tsx +0 -27
- package/agentvibes.org/components/cta.tsx +0 -58
- package/agentvibes.org/components/features.tsx +0 -256
- package/agentvibes.org/components/hero-home.tsx +0 -133
- package/agentvibes.org/components/mdx-components.tsx +0 -128
- package/agentvibes.org/components/modal-video.tsx +0 -137
- package/agentvibes.org/components/page-illustration.tsx +0 -55
- package/agentvibes.org/components/spotlight.tsx +0 -77
- package/agentvibes.org/components/testimonials.tsx +0 -282
- package/agentvibes.org/components/ui/footer.tsx +0 -82
- package/agentvibes.org/components/ui/header.tsx +0 -68
- package/agentvibes.org/components/ui/logo.tsx +0 -10
- package/agentvibes.org/components/workflows.tsx +0 -176
- package/agentvibes.org/content/blog/discovering-new-piper-voices.mdx +0 -253
- package/agentvibes.org/content/blog/getting-started-agentvibes.mdx +0 -228
- package/agentvibes.org/content/blog/introducing-agentvibes-v2.mdx +0 -250
- package/agentvibes.org/content/blog/language-learning-with-agentvibes.mdx +0 -142
- package/agentvibes.org/content/blog/voice-personalities-guide.mdx +0 -119
- package/agentvibes.org/lib/blog.ts +0 -73
- package/agentvibes.org/next.config.js +0 -6
- package/agentvibes.org/package-lock.json +0 -4285
- package/agentvibes.org/package.json +0 -40
- package/agentvibes.org/pnpm-lock.yaml +0 -1141
- package/agentvibes.org/postcss.config.js +0 -5
- package/agentvibes.org/public/audio/02-sarcastic.mp3 +0 -0
- package/agentvibes.org/public/audio/03-angry.mp3 +0 -0
- package/agentvibes.org/public/audio/04-grandpa.mp3 +0 -0
- package/agentvibes.org/public/audio/05-sarcastic-example2.mp3 +0 -0
- package/agentvibes.org/public/audio/french-rachel.mp3 +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_0_Cori_Samuel.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_10_Steve_C.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_11_Owlivia.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_12_Paul_Hampton.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_13_Jennifer_Dorr.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_14_Emily_Cripps.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_15_Martin_Clifton.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_1_Kara_Shallenberg.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_2_Kristin_Hughes.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_3_Maria_Kasper.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_4_Mike_Pelton.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_5_Mark_Nelson.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_6_Michael_Scherer.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_7_James_K_White.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_8_Rose_Ibex.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_9_progressingamerica.wav +0 -0
- package/agentvibes.org/public/audio/spanish-antoni.mp3 +0 -0
- package/agentvibes.org/public/favicon.ico +0 -0
- package/agentvibes.org/public/fonts/nacelle-italic.woff2 +0 -0
- package/agentvibes.org/public/fonts/nacelle-regular.woff2 +0 -0
- package/agentvibes.org/public/fonts/nacelle-semibold.woff2 +0 -0
- package/agentvibes.org/public/fonts/nacelle-semibolditalic.woff2 +0 -0
- package/agentvibes.org/public/images/blurred-shape-gray.svg +0 -1
- package/agentvibes.org/public/images/blurred-shape.svg +0 -1
- package/agentvibes.org/public/images/client-logo-01.svg +0 -1
- package/agentvibes.org/public/images/client-logo-02.svg +0 -1
- package/agentvibes.org/public/images/client-logo-03.svg +0 -1
- package/agentvibes.org/public/images/client-logo-04.svg +0 -1
- package/agentvibes.org/public/images/client-logo-05.svg +0 -1
- package/agentvibes.org/public/images/client-logo-06.svg +0 -1
- package/agentvibes.org/public/images/client-logo-07.svg +0 -1
- package/agentvibes.org/public/images/client-logo-08.svg +0 -1
- package/agentvibes.org/public/images/client-logo-09.svg +0 -1
- package/agentvibes.org/public/images/features.png +0 -0
- package/agentvibes.org/public/images/footer-illustration.svg +0 -1
- package/agentvibes.org/public/images/hero-image-01.jpg +0 -0
- package/agentvibes.org/public/images/logo.svg +0 -1
- package/agentvibes.org/public/images/page-illustration.svg +0 -1
- package/agentvibes.org/public/images/secondary-illustration.svg +0 -1
- package/agentvibes.org/public/images/testimonial-01.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-02.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-03.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-04.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-05.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-06.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-07.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-08.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-09.jpg +0 -0
- package/agentvibes.org/public/images/workflow-01.png +0 -0
- package/agentvibes.org/public/images/workflow-02.png +0 -0
- package/agentvibes.org/public/images/workflow-03.png +0 -0
- package/agentvibes.org/public/videos/video.mp4 +0 -0
- package/agentvibes.org/tsconfig.json +0 -28
- package/agentvibes.org/utils/useMasonry.tsx +0 -67
- package/agentvibes.org/utils/useMousePosition.tsx +0 -27
- package/docs/bryce-beattie-voice-licensing.md +0 -131
|
@@ -1,477 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Voice Manager - Handle voice switching and listing
|
|
3
|
-
# Usage: voice-manager.sh [list|switch|get] [voice_name]
|
|
4
|
-
|
|
5
|
-
# Get script directory (physical path for sourcing files)
|
|
6
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
|
|
7
|
-
source "$SCRIPT_DIR/voices-config.sh"
|
|
8
|
-
|
|
9
|
-
# Determine target .claude directory based on context
|
|
10
|
-
# Priority:
|
|
11
|
-
# 1. CLAUDE_PROJECT_DIR env var (set by MCP for project-specific settings)
|
|
12
|
-
# 2. Script location (for direct slash command usage)
|
|
13
|
-
# 3. Global ~/.claude (fallback)
|
|
14
|
-
|
|
15
|
-
if [[ -n "$CLAUDE_PROJECT_DIR" ]] && [[ -d "$CLAUDE_PROJECT_DIR/.claude" ]]; then
|
|
16
|
-
# MCP context: Use the project directory where MCP was invoked
|
|
17
|
-
CLAUDE_DIR="$CLAUDE_PROJECT_DIR/.claude"
|
|
18
|
-
else
|
|
19
|
-
# Direct usage context: Use script location
|
|
20
|
-
SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
21
|
-
CLAUDE_DIR="$(dirname "$SCRIPT_PATH")"
|
|
22
|
-
|
|
23
|
-
# If script is in global ~/.claude, use that
|
|
24
|
-
if [[ "$CLAUDE_DIR" == "$HOME/.claude" ]]; then
|
|
25
|
-
CLAUDE_DIR="$HOME/.claude"
|
|
26
|
-
elif [[ ! -d "$CLAUDE_DIR" ]]; then
|
|
27
|
-
# Fallback to global if directory doesn't exist
|
|
28
|
-
CLAUDE_DIR="$HOME/.claude"
|
|
29
|
-
fi
|
|
30
|
-
fi
|
|
31
|
-
|
|
32
|
-
VOICE_FILE="$CLAUDE_DIR/tts-voice.txt"
|
|
33
|
-
|
|
34
|
-
case "$1" in
|
|
35
|
-
list)
|
|
36
|
-
# Get active provider
|
|
37
|
-
PROVIDER_FILE="$CLAUDE_DIR/tts-provider.txt"
|
|
38
|
-
if [[ ! -f "$PROVIDER_FILE" ]]; then
|
|
39
|
-
PROVIDER_FILE="$HOME/.claude/tts-provider.txt"
|
|
40
|
-
fi
|
|
41
|
-
|
|
42
|
-
ACTIVE_PROVIDER="elevenlabs" # default
|
|
43
|
-
if [ -f "$PROVIDER_FILE" ]; then
|
|
44
|
-
ACTIVE_PROVIDER=$(cat "$PROVIDER_FILE")
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
CURRENT_VOICE=$(cat "$VOICE_FILE" 2>/dev/null || echo "Cowboy Bob")
|
|
48
|
-
|
|
49
|
-
if [[ "$ACTIVE_PROVIDER" == "piper" ]]; then
|
|
50
|
-
echo "🎤 Available Piper TTS Voices:"
|
|
51
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
52
|
-
|
|
53
|
-
# List downloaded Piper voices
|
|
54
|
-
if [[ -f "$SCRIPT_DIR/piper-voice-manager.sh" ]]; then
|
|
55
|
-
source "$SCRIPT_DIR/piper-voice-manager.sh"
|
|
56
|
-
VOICE_DIR=$(get_voice_storage_dir)
|
|
57
|
-
VOICE_COUNT=0
|
|
58
|
-
for onnx_file in "$VOICE_DIR"/*.onnx; do
|
|
59
|
-
if [[ -f "$onnx_file" ]]; then
|
|
60
|
-
voice=$(basename "$onnx_file" .onnx)
|
|
61
|
-
if [ "$voice" = "$CURRENT_VOICE" ]; then
|
|
62
|
-
echo " ▶ $voice (current)"
|
|
63
|
-
else
|
|
64
|
-
echo " $voice"
|
|
65
|
-
fi
|
|
66
|
-
((VOICE_COUNT++))
|
|
67
|
-
fi
|
|
68
|
-
done | sort
|
|
69
|
-
|
|
70
|
-
if [[ $VOICE_COUNT -eq 0 ]]; then
|
|
71
|
-
echo " (No Piper voices downloaded yet)"
|
|
72
|
-
echo ""
|
|
73
|
-
echo "Download voices with: /agent-vibes:provider download <voice-name>"
|
|
74
|
-
echo "Examples: en_US-lessac-medium, en_GB-alba-medium"
|
|
75
|
-
fi
|
|
76
|
-
fi
|
|
77
|
-
else
|
|
78
|
-
echo "🎤 Available ElevenLabs TTS Voices:"
|
|
79
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
80
|
-
for voice in "${!VOICES[@]}"; do
|
|
81
|
-
if [ "$voice" = "$CURRENT_VOICE" ]; then
|
|
82
|
-
echo " ▶ $voice (current)"
|
|
83
|
-
else
|
|
84
|
-
echo " $voice"
|
|
85
|
-
fi
|
|
86
|
-
done | sort
|
|
87
|
-
fi
|
|
88
|
-
|
|
89
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
90
|
-
echo ""
|
|
91
|
-
echo "Usage: voice-manager.sh switch <name>"
|
|
92
|
-
echo " voice-manager.sh preview"
|
|
93
|
-
;;
|
|
94
|
-
|
|
95
|
-
preview)
|
|
96
|
-
# Get play-tts.sh path
|
|
97
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
98
|
-
TTS_SCRIPT="$SCRIPT_DIR/play-tts.sh"
|
|
99
|
-
|
|
100
|
-
# Check if a specific voice name was provided
|
|
101
|
-
if [[ -n "$2" ]] && [[ "$2" != "first" ]] && [[ "$2" != "last" ]] && ! [[ "$2" =~ ^[0-9]+$ ]]; then
|
|
102
|
-
# User specified a voice name
|
|
103
|
-
VOICE_NAME="$2"
|
|
104
|
-
|
|
105
|
-
# Check if voice exists
|
|
106
|
-
if [[ -n "${VOICES[$VOICE_NAME]}" ]]; then
|
|
107
|
-
echo "🎤 Previewing voice: ${VOICE_NAME}"
|
|
108
|
-
echo ""
|
|
109
|
-
"$TTS_SCRIPT" "Hello, this is ${VOICE_NAME}. How do you like my voice?" "${VOICE_NAME}"
|
|
110
|
-
else
|
|
111
|
-
echo "❌ Voice not found: ${VOICE_NAME}"
|
|
112
|
-
echo ""
|
|
113
|
-
echo "Available voices:"
|
|
114
|
-
for voice in "${!VOICES[@]}"; do
|
|
115
|
-
echo " • $voice"
|
|
116
|
-
done | sort
|
|
117
|
-
fi
|
|
118
|
-
exit 0
|
|
119
|
-
fi
|
|
120
|
-
|
|
121
|
-
# Original preview logic for first/last/number
|
|
122
|
-
echo "🎤 Voice Preview - Playing first 3 voices..."
|
|
123
|
-
echo ""
|
|
124
|
-
|
|
125
|
-
# Sort voices and preview first 3
|
|
126
|
-
VOICE_ARRAY=()
|
|
127
|
-
for voice in "${!VOICES[@]}"; do
|
|
128
|
-
VOICE_ARRAY+=("$voice")
|
|
129
|
-
done
|
|
130
|
-
|
|
131
|
-
# Sort the array
|
|
132
|
-
IFS=$'\n' SORTED_VOICES=($(sort <<<"${VOICE_ARRAY[*]}"))
|
|
133
|
-
unset IFS
|
|
134
|
-
|
|
135
|
-
# Play first 3 voices
|
|
136
|
-
COUNT=0
|
|
137
|
-
for voice in "${SORTED_VOICES[@]}"; do
|
|
138
|
-
if [ $COUNT -eq 3 ]; then
|
|
139
|
-
break
|
|
140
|
-
fi
|
|
141
|
-
echo "🔊 ${voice}..."
|
|
142
|
-
"$TTS_SCRIPT" "Hi, I'm ${voice}" "${VOICES[$voice]}"
|
|
143
|
-
sleep 0.5
|
|
144
|
-
COUNT=$((COUNT + 1))
|
|
145
|
-
done
|
|
146
|
-
|
|
147
|
-
echo ""
|
|
148
|
-
echo "Would you like to hear more? Reply 'yes' to continue."
|
|
149
|
-
;;
|
|
150
|
-
|
|
151
|
-
switch)
|
|
152
|
-
VOICE_NAME="$2"
|
|
153
|
-
SILENT_MODE=false
|
|
154
|
-
|
|
155
|
-
# Check for --silent flag
|
|
156
|
-
if [[ "$2" == "--silent" ]] || [[ "$3" == "--silent" ]]; then
|
|
157
|
-
SILENT_MODE=true
|
|
158
|
-
# If --silent is first arg, voice name is in $3
|
|
159
|
-
[[ "$2" == "--silent" ]] && VOICE_NAME="$3"
|
|
160
|
-
fi
|
|
161
|
-
|
|
162
|
-
if [[ -z "$VOICE_NAME" ]]; then
|
|
163
|
-
# Show numbered list for selection
|
|
164
|
-
echo "🎤 Select a voice by number:"
|
|
165
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
166
|
-
|
|
167
|
-
# Get current voice
|
|
168
|
-
CURRENT="Cowboy Bob"
|
|
169
|
-
if [ -f "$VOICE_FILE" ]; then
|
|
170
|
-
CURRENT=$(cat "$VOICE_FILE")
|
|
171
|
-
fi
|
|
172
|
-
|
|
173
|
-
# Create array of voice names
|
|
174
|
-
VOICE_ARRAY=()
|
|
175
|
-
for voice in "${!VOICES[@]}"; do
|
|
176
|
-
VOICE_ARRAY+=("$voice")
|
|
177
|
-
done
|
|
178
|
-
|
|
179
|
-
# Sort the array
|
|
180
|
-
IFS=$'\n' SORTED_VOICES=($(sort <<<"${VOICE_ARRAY[*]}"))
|
|
181
|
-
unset IFS
|
|
182
|
-
|
|
183
|
-
# Display numbered list in two columns for compactness
|
|
184
|
-
HALF=$(( (${#SORTED_VOICES[@]} + 1) / 2 ))
|
|
185
|
-
|
|
186
|
-
for i in $(seq 0 $((HALF - 1))); do
|
|
187
|
-
NUM1=$((i + 1))
|
|
188
|
-
VOICE1="${SORTED_VOICES[$i]}"
|
|
189
|
-
|
|
190
|
-
# Format first column
|
|
191
|
-
if [[ "$VOICE1" == "$CURRENT" ]]; then
|
|
192
|
-
COL1=$(printf "%2d. %-20s ✓" "$NUM1" "$VOICE1")
|
|
193
|
-
else
|
|
194
|
-
COL1=$(printf "%2d. %-20s " "$NUM1" "$VOICE1")
|
|
195
|
-
fi
|
|
196
|
-
|
|
197
|
-
# Format second column if it exists
|
|
198
|
-
NUM2=$((i + HALF + 1))
|
|
199
|
-
if [[ $((i + HALF)) -lt ${#SORTED_VOICES[@]} ]]; then
|
|
200
|
-
VOICE2="${SORTED_VOICES[$((i + HALF))]}"
|
|
201
|
-
if [[ "$VOICE2" == "$CURRENT" ]]; then
|
|
202
|
-
COL2=$(printf "%2d. %-20s ✓" "$NUM2" "$VOICE2")
|
|
203
|
-
else
|
|
204
|
-
COL2=$(printf "%2d. %-20s " "$NUM2" "$VOICE2")
|
|
205
|
-
fi
|
|
206
|
-
echo " $COL1 $COL2"
|
|
207
|
-
else
|
|
208
|
-
echo " $COL1"
|
|
209
|
-
fi
|
|
210
|
-
done
|
|
211
|
-
|
|
212
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
213
|
-
echo ""
|
|
214
|
-
echo "Enter number (1-${#SORTED_VOICES[@]}) or voice name:"
|
|
215
|
-
echo "Usage: /agent-vibes:switch 5"
|
|
216
|
-
echo " /agent-vibes:switch \"Northern Terry\""
|
|
217
|
-
exit 0
|
|
218
|
-
fi
|
|
219
|
-
|
|
220
|
-
# Detect active TTS provider
|
|
221
|
-
PROVIDER_FILE=""
|
|
222
|
-
if [[ -f "$CLAUDE_DIR/tts-provider.txt" ]]; then
|
|
223
|
-
PROVIDER_FILE="$CLAUDE_DIR/tts-provider.txt"
|
|
224
|
-
elif [[ -f "$HOME/.claude/tts-provider.txt" ]]; then
|
|
225
|
-
PROVIDER_FILE="$HOME/.claude/tts-provider.txt"
|
|
226
|
-
fi
|
|
227
|
-
|
|
228
|
-
ACTIVE_PROVIDER="elevenlabs" # default
|
|
229
|
-
if [[ -n "$PROVIDER_FILE" ]]; then
|
|
230
|
-
ACTIVE_PROVIDER=$(cat "$PROVIDER_FILE")
|
|
231
|
-
fi
|
|
232
|
-
|
|
233
|
-
# If using Piper and voice name looks like a Piper model (contains underscore and dash)
|
|
234
|
-
# then skip ElevenLabs voice validation
|
|
235
|
-
if [[ "$ACTIVE_PROVIDER" == "piper" ]] && [[ "$VOICE_NAME" == *"_"*"-"* ]]; then
|
|
236
|
-
# This is a Piper model name, use it directly
|
|
237
|
-
FOUND="$VOICE_NAME"
|
|
238
|
-
else
|
|
239
|
-
# ElevenLabs voice lookup
|
|
240
|
-
# Check if input is a number
|
|
241
|
-
if [[ "$VOICE_NAME" =~ ^[0-9]+$ ]]; then
|
|
242
|
-
# Get voice array
|
|
243
|
-
VOICE_ARRAY=()
|
|
244
|
-
for voice in "${!VOICES[@]}"; do
|
|
245
|
-
VOICE_ARRAY+=("$voice")
|
|
246
|
-
done
|
|
247
|
-
|
|
248
|
-
# Sort the array
|
|
249
|
-
IFS=$'\n' SORTED_VOICES=($(sort <<<"${VOICE_ARRAY[*]}"))
|
|
250
|
-
unset IFS
|
|
251
|
-
|
|
252
|
-
# Get voice by number (adjust for 0-based index)
|
|
253
|
-
INDEX=$((VOICE_NAME - 1))
|
|
254
|
-
|
|
255
|
-
if [[ $INDEX -ge 0 && $INDEX -lt ${#SORTED_VOICES[@]} ]]; then
|
|
256
|
-
VOICE_NAME="${SORTED_VOICES[$INDEX]}"
|
|
257
|
-
FOUND="${SORTED_VOICES[$INDEX]}"
|
|
258
|
-
else
|
|
259
|
-
echo "❌ Invalid number. Please choose between 1 and ${#SORTED_VOICES[@]}"
|
|
260
|
-
exit 1
|
|
261
|
-
fi
|
|
262
|
-
else
|
|
263
|
-
# Check if voice exists (case-insensitive)
|
|
264
|
-
FOUND=""
|
|
265
|
-
for voice in "${!VOICES[@]}"; do
|
|
266
|
-
if [[ "${voice,,}" == "${VOICE_NAME,,}" ]]; then
|
|
267
|
-
FOUND="$voice"
|
|
268
|
-
break
|
|
269
|
-
fi
|
|
270
|
-
done
|
|
271
|
-
fi
|
|
272
|
-
|
|
273
|
-
if [[ -z "$FOUND" ]]; then
|
|
274
|
-
echo "❌ Unknown voice: $VOICE_NAME"
|
|
275
|
-
echo ""
|
|
276
|
-
echo "Available voices:"
|
|
277
|
-
for voice in "${!VOICES[@]}"; do
|
|
278
|
-
echo " - $voice"
|
|
279
|
-
done | sort
|
|
280
|
-
exit 1
|
|
281
|
-
fi
|
|
282
|
-
fi
|
|
283
|
-
|
|
284
|
-
echo "$FOUND" > "$VOICE_FILE"
|
|
285
|
-
echo "✅ Voice switched to: $FOUND"
|
|
286
|
-
|
|
287
|
-
# Show voice ID only for ElevenLabs voices
|
|
288
|
-
if [[ "$ACTIVE_PROVIDER" != "piper" ]] && [[ -n "${VOICES[$FOUND]}" ]]; then
|
|
289
|
-
echo "🎤 Voice ID: ${VOICES[$FOUND]}"
|
|
290
|
-
fi
|
|
291
|
-
|
|
292
|
-
# Have the new voice introduce itself (unless silent mode)
|
|
293
|
-
if [[ "$SILENT_MODE" != "true" ]]; then
|
|
294
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
295
|
-
PLAY_TTS="$SCRIPT_DIR/play-tts.sh"
|
|
296
|
-
if [ -x "$PLAY_TTS" ]; then
|
|
297
|
-
"$PLAY_TTS" "Hi, I'm $FOUND. I'll be your voice assistant moving forward." "$FOUND" > /dev/null 2>&1 &
|
|
298
|
-
fi
|
|
299
|
-
|
|
300
|
-
echo ""
|
|
301
|
-
echo "💡 Tip: To hear automatic TTS narration, enable the Agent Vibes output style:"
|
|
302
|
-
echo " /output-style Agent Vibes"
|
|
303
|
-
fi
|
|
304
|
-
;;
|
|
305
|
-
|
|
306
|
-
get)
|
|
307
|
-
if [ -f "$VOICE_FILE" ]; then
|
|
308
|
-
cat "$VOICE_FILE"
|
|
309
|
-
else
|
|
310
|
-
echo "Cowboy Bob"
|
|
311
|
-
fi
|
|
312
|
-
;;
|
|
313
|
-
|
|
314
|
-
whoami)
|
|
315
|
-
echo "🎤 Current Voice Configuration"
|
|
316
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
317
|
-
|
|
318
|
-
# Get active TTS provider
|
|
319
|
-
PROVIDER_FILE="$CLAUDE_DIR/tts-provider.txt"
|
|
320
|
-
if [[ ! -f "$PROVIDER_FILE" ]]; then
|
|
321
|
-
PROVIDER_FILE="$HOME/.claude/tts-provider.txt"
|
|
322
|
-
fi
|
|
323
|
-
|
|
324
|
-
if [ -f "$PROVIDER_FILE" ]; then
|
|
325
|
-
ACTIVE_PROVIDER=$(cat "$PROVIDER_FILE")
|
|
326
|
-
if [[ "$ACTIVE_PROVIDER" == "elevenlabs" ]]; then
|
|
327
|
-
echo "Provider: ElevenLabs (Premium AI)"
|
|
328
|
-
elif [[ "$ACTIVE_PROVIDER" == "piper" ]]; then
|
|
329
|
-
echo "Provider: Piper TTS (Free, Offline)"
|
|
330
|
-
else
|
|
331
|
-
echo "Provider: $ACTIVE_PROVIDER"
|
|
332
|
-
fi
|
|
333
|
-
else
|
|
334
|
-
# Default to ElevenLabs if no provider file
|
|
335
|
-
echo "Provider: ElevenLabs (Premium AI)"
|
|
336
|
-
fi
|
|
337
|
-
|
|
338
|
-
# Get current voice
|
|
339
|
-
if [ -f "$VOICE_FILE" ]; then
|
|
340
|
-
CURRENT_VOICE=$(cat "$VOICE_FILE")
|
|
341
|
-
else
|
|
342
|
-
CURRENT_VOICE="Cowboy Bob"
|
|
343
|
-
fi
|
|
344
|
-
echo "Voice: $CURRENT_VOICE"
|
|
345
|
-
|
|
346
|
-
# Get current sentiment (priority)
|
|
347
|
-
if [ -f "$HOME/.claude/tts-sentiment.txt" ]; then
|
|
348
|
-
SENTIMENT=$(cat "$HOME/.claude/tts-sentiment.txt")
|
|
349
|
-
echo "Sentiment: $SENTIMENT (active)"
|
|
350
|
-
|
|
351
|
-
# Also show personality if set
|
|
352
|
-
if [ -f "$HOME/.claude/tts-personality.txt" ]; then
|
|
353
|
-
PERSONALITY=$(cat "$HOME/.claude/tts-personality.txt")
|
|
354
|
-
echo "Personality: $PERSONALITY (overridden by sentiment)"
|
|
355
|
-
fi
|
|
356
|
-
else
|
|
357
|
-
# No sentiment, check personality
|
|
358
|
-
if [ -f "$HOME/.claude/tts-personality.txt" ]; then
|
|
359
|
-
PERSONALITY=$(cat "$HOME/.claude/tts-personality.txt")
|
|
360
|
-
echo "Personality: $PERSONALITY (active)"
|
|
361
|
-
else
|
|
362
|
-
echo "Personality: normal"
|
|
363
|
-
fi
|
|
364
|
-
fi
|
|
365
|
-
|
|
366
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
367
|
-
;;
|
|
368
|
-
|
|
369
|
-
list-simple)
|
|
370
|
-
# Simple list for AI to parse and display
|
|
371
|
-
# Get active provider
|
|
372
|
-
PROVIDER_FILE="$CLAUDE_DIR/tts-provider.txt"
|
|
373
|
-
if [[ ! -f "$PROVIDER_FILE" ]]; then
|
|
374
|
-
PROVIDER_FILE="$HOME/.claude/tts-provider.txt"
|
|
375
|
-
fi
|
|
376
|
-
|
|
377
|
-
ACTIVE_PROVIDER="elevenlabs" # default
|
|
378
|
-
if [ -f "$PROVIDER_FILE" ]; then
|
|
379
|
-
ACTIVE_PROVIDER=$(cat "$PROVIDER_FILE")
|
|
380
|
-
fi
|
|
381
|
-
|
|
382
|
-
if [[ "$ACTIVE_PROVIDER" == "piper" ]]; then
|
|
383
|
-
# List downloaded Piper voices
|
|
384
|
-
if [[ -f "$SCRIPT_DIR/piper-voice-manager.sh" ]]; then
|
|
385
|
-
source "$SCRIPT_DIR/piper-voice-manager.sh"
|
|
386
|
-
VOICE_DIR=$(get_voice_storage_dir)
|
|
387
|
-
for onnx_file in "$VOICE_DIR"/*.onnx; do
|
|
388
|
-
if [[ -f "$onnx_file" ]]; then
|
|
389
|
-
basename "$onnx_file" .onnx
|
|
390
|
-
fi
|
|
391
|
-
done | sort
|
|
392
|
-
fi
|
|
393
|
-
else
|
|
394
|
-
# List ElevenLabs voices
|
|
395
|
-
for voice in "${!VOICES[@]}"; do
|
|
396
|
-
echo "$voice"
|
|
397
|
-
done | sort
|
|
398
|
-
fi
|
|
399
|
-
;;
|
|
400
|
-
|
|
401
|
-
replay)
|
|
402
|
-
# Replay recent TTS audio from history
|
|
403
|
-
# Use project-local directory with same logic as play-tts.sh
|
|
404
|
-
if [[ -n "$CLAUDE_PROJECT_DIR" ]]; then
|
|
405
|
-
AUDIO_DIR="$CLAUDE_PROJECT_DIR/.claude/audio"
|
|
406
|
-
else
|
|
407
|
-
# Fallback: try to find .claude directory in current path
|
|
408
|
-
CURRENT_DIR="$PWD"
|
|
409
|
-
while [[ "$CURRENT_DIR" != "/" ]]; do
|
|
410
|
-
if [[ -d "$CURRENT_DIR/.claude" ]]; then
|
|
411
|
-
AUDIO_DIR="$CURRENT_DIR/.claude/audio"
|
|
412
|
-
break
|
|
413
|
-
fi
|
|
414
|
-
CURRENT_DIR=$(dirname "$CURRENT_DIR")
|
|
415
|
-
done
|
|
416
|
-
# Final fallback to global if no project .claude found
|
|
417
|
-
if [[ -z "$AUDIO_DIR" ]]; then
|
|
418
|
-
AUDIO_DIR="$HOME/.claude/audio"
|
|
419
|
-
fi
|
|
420
|
-
fi
|
|
421
|
-
|
|
422
|
-
# Default to replay last audio (N=1)
|
|
423
|
-
N="${2:-1}"
|
|
424
|
-
|
|
425
|
-
# Validate N is a number
|
|
426
|
-
if ! [[ "$N" =~ ^[0-9]+$ ]]; then
|
|
427
|
-
echo "❌ Invalid argument. Please use a number (1-10)"
|
|
428
|
-
echo "Usage: /agent-vibes:replay [N]"
|
|
429
|
-
echo " N=1 - Last audio (default)"
|
|
430
|
-
echo " N=2 - Second-to-last"
|
|
431
|
-
echo " N=3 - Third-to-last"
|
|
432
|
-
exit 1
|
|
433
|
-
fi
|
|
434
|
-
|
|
435
|
-
# Check bounds
|
|
436
|
-
if [[ $N -lt 1 || $N -gt 10 ]]; then
|
|
437
|
-
echo "❌ Number out of range. Please choose 1-10"
|
|
438
|
-
exit 1
|
|
439
|
-
fi
|
|
440
|
-
|
|
441
|
-
# Get list of audio files sorted by time (newest first)
|
|
442
|
-
if [[ ! -d "$AUDIO_DIR" ]]; then
|
|
443
|
-
echo "❌ No audio history found"
|
|
444
|
-
echo "Audio files are stored in: $AUDIO_DIR"
|
|
445
|
-
exit 1
|
|
446
|
-
fi
|
|
447
|
-
|
|
448
|
-
# Get the Nth most recent file
|
|
449
|
-
AUDIO_FILE=$(ls -t "$AUDIO_DIR"/tts-*.mp3 2>/dev/null | sed -n "${N}p")
|
|
450
|
-
|
|
451
|
-
if [[ -z "$AUDIO_FILE" ]]; then
|
|
452
|
-
TOTAL=$(ls -t "$AUDIO_DIR"/tts-*.mp3 2>/dev/null | wc -l)
|
|
453
|
-
echo "❌ Audio #$N not found in history"
|
|
454
|
-
echo "Total audio files available: $TOTAL"
|
|
455
|
-
exit 1
|
|
456
|
-
fi
|
|
457
|
-
|
|
458
|
-
echo "🔊 Replaying audio #$N:"
|
|
459
|
-
echo " File: $(basename "$AUDIO_FILE")"
|
|
460
|
-
echo " Path: $AUDIO_FILE"
|
|
461
|
-
|
|
462
|
-
# Play the audio file in background
|
|
463
|
-
(paplay "$AUDIO_FILE" 2>/dev/null || aplay "$AUDIO_FILE" 2>/dev/null || mpg123 "$AUDIO_FILE" 2>/dev/null) &
|
|
464
|
-
;;
|
|
465
|
-
|
|
466
|
-
*)
|
|
467
|
-
echo "Usage: voice-manager.sh [list|switch|get|replay|whoami] [voice_name]"
|
|
468
|
-
echo ""
|
|
469
|
-
echo "Commands:"
|
|
470
|
-
echo " list - List all available voices"
|
|
471
|
-
echo " switch <voice_name> - Switch to a different voice"
|
|
472
|
-
echo " get - Get current voice name"
|
|
473
|
-
echo " replay [N] - Replay Nth most recent audio (default: 1)"
|
|
474
|
-
echo " whoami - Show current voice and personality"
|
|
475
|
-
exit 1
|
|
476
|
-
;;
|
|
477
|
-
esac
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Single source of truth for ElevenLabs voice IDs
|
|
3
|
-
# This file is sourced by both voice-manager.sh and play-tts.sh
|
|
4
|
-
|
|
5
|
-
declare -A VOICES=(
|
|
6
|
-
["Amy"]="bhJUNIXWQQ94l8eI2VUf"
|
|
7
|
-
["Antoni"]="ErXwobaYiN019PkySvjV"
|
|
8
|
-
["Archer"]="L0Dsvb3SLTyegXwtm47J"
|
|
9
|
-
["Aria"]="TC0Zp7WVFzhA8zpTlRqV"
|
|
10
|
-
["Bella"]="EXAVITQu4vr4xnSDxMaL"
|
|
11
|
-
["Burt Reynolds"]="4YYIPFl9wE5c4L2eu2Gb"
|
|
12
|
-
["Charlotte"]="XB0fDUnXU5powFXDhCwa"
|
|
13
|
-
["Cowboy Bob"]="KTPVrSVAEUSJRClDzBw7"
|
|
14
|
-
["Demon Monster"]="vfaqCOvlrKi4Zp7C2IAm"
|
|
15
|
-
["Domi"]="AZnzlk1XvdvUeBnXmlld"
|
|
16
|
-
["Dr. Von Fusion"]="yjJ45q8TVCrtMhEKurxY"
|
|
17
|
-
["Drill Sergeant"]="vfaqCOvlrKi4Zp7C2IAm"
|
|
18
|
-
["Grandpa Spuds Oxley"]="NOpBlnGInO9m6vDvFkFC"
|
|
19
|
-
["Grandpa Werthers"]="MKlLqCItoCkvdhrxgtLv"
|
|
20
|
-
["Jessica Anne Bogart"]="flHkNRp1BlvT73UL6gyz"
|
|
21
|
-
["Juniper"]="aMSt68OGf4xUZAnLpTU8"
|
|
22
|
-
["Lutz Laugh"]="9yzdeviXkFddZ4Oz8Mok"
|
|
23
|
-
["Matilda"]="XrExE9yKIg1WjnnlVkGX"
|
|
24
|
-
["Matthew Schmitz"]="0SpgpJ4D3MpHCiWdyTg3"
|
|
25
|
-
["Michael"]="U1Vk2oyatMdYs096Ety7"
|
|
26
|
-
["Ms. Walker"]="DLsHlh26Ugcm6ELvS0qi"
|
|
27
|
-
["Northern Terry"]="wo6udizrrtpIxWGp2qJk"
|
|
28
|
-
["Pirate Marshal"]="PPzYpIqttlTYA83688JI"
|
|
29
|
-
["Rachel"]="21m00Tcm4TlvDq8ikWAM"
|
|
30
|
-
["Ralf Eisend"]="A9evEp8yGjv4c3WsIKuY"
|
|
31
|
-
["Tiffany"]="6aDn1KB0hjpdcocrUkmq"
|
|
32
|
-
["Tom"]="DYkrAHD8iwork3YSUBbs"
|
|
33
|
-
)
|