agentvibes 5.3.0 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/.agentvibes/LITE-MODE.md +236 -0
  2. package/.agentvibes/README.md +136 -0
  3. package/.agentvibes/backup/session-start-tts.sh.20251210_212814 +141 -0
  4. package/.agentvibes/backups/agents/analyst_20260204_144958.md +78 -0
  5. package/.agentvibes/backups/agents/architect_20260204_144958.md +72 -0
  6. package/.agentvibes/backups/agents/dev_20260204_144958.md +74 -0
  7. package/.agentvibes/backups/agents/pm_20260204_144958.md +72 -0
  8. package/.agentvibes/backups/agents/quick-flow-solo-dev_20260204_144958.md +64 -0
  9. package/.agentvibes/backups/agents/sm_20260204_144958.md +87 -0
  10. package/.agentvibes/backups/agents/tea_20260204_144958.md +79 -0
  11. package/.agentvibes/backups/agents/tech-writer_20260204_144958.md +82 -0
  12. package/.agentvibes/backups/agents/ux-designer_20260204_144958.md +80 -0
  13. package/.agentvibes/bmad/bmad-voices.md +69 -69
  14. package/.agentvibes/config/README-personality-defaults.md +162 -0
  15. package/.agentvibes/config/mode.txt +1 -0
  16. package/.agentvibes/config/personality-voice-defaults.default.json +21 -0
  17. package/.agentvibes/config/save-audio.txt +1 -0
  18. package/.agentvibes/config/voice-metadata.json +160 -0
  19. package/.agentvibes/config.json +24 -15
  20. package/.agentvibes/hooks/help.sh +191 -0
  21. package/.agentvibes/hooks/post-tool-use-lite.sh +111 -0
  22. package/.agentvibes/hooks/save-audio-manager.sh +162 -0
  23. package/.agentvibes/hooks/session-start-full-optimized.sh +102 -0
  24. package/.agentvibes/hooks/session-start-full.sh +142 -0
  25. package/.agentvibes/hooks/session-start-lite-v2.sh +34 -0
  26. package/.agentvibes/hooks/session-start-lite.sh +29 -0
  27. package/.agentvibes/hooks/stop-lite.sh +115 -0
  28. package/.agentvibes/hooks/switch-mode.sh +215 -0
  29. package/.agentvibes/output-styles/audio-summary.md +30 -0
  30. package/.claude/activation-instructions +54 -54
  31. package/.claude/audio/voice-samples/piper/alan.wav +0 -0
  32. package/.claude/audio/voice-samples/piper/amy.wav +0 -0
  33. package/.claude/audio/voice-samples/piper/charlotte.wav +0 -0
  34. package/.claude/audio/voice-samples/piper/joe.wav +0 -0
  35. package/.claude/audio/voice-samples/piper/john.wav +0 -0
  36. package/.claude/audio/voice-samples/piper/katherine.wav +0 -0
  37. package/.claude/audio/voice-samples/piper/kristin.wav +0 -0
  38. package/.claude/audio/voice-samples/piper/linda.wav +0 -0
  39. package/.claude/audio/voice-samples/piper/marcus.wav +0 -0
  40. package/.claude/audio/voice-samples/piper/ryan.wav +0 -0
  41. package/.claude/commands/agent-vibes/add.md +21 -21
  42. package/.claude/commands/agent-vibes/agent-vibes.md +101 -101
  43. package/.claude/commands/agent-vibes/agent.md +79 -79
  44. package/.claude/commands/agent-vibes/background-music.md +111 -111
  45. package/.claude/commands/agent-vibes/bmad.md +198 -198
  46. package/.claude/commands/agent-vibes/clean.md +18 -18
  47. package/.claude/commands/agent-vibes/cleanup.md +18 -18
  48. package/.claude/commands/agent-vibes/commands.json +145 -145
  49. package/.claude/commands/agent-vibes/effects.md +97 -97
  50. package/.claude/commands/agent-vibes/get.md +9 -9
  51. package/.claude/commands/agent-vibes/hide.md +91 -91
  52. package/.claude/commands/agent-vibes/language.md +23 -23
  53. package/.claude/commands/agent-vibes/learn.md +67 -67
  54. package/.claude/commands/agent-vibes/list.md +13 -13
  55. package/.claude/commands/agent-vibes/mute.md +37 -37
  56. package/.claude/commands/agent-vibes/preview.md +17 -17
  57. package/.claude/commands/agent-vibes/provider.md +68 -68
  58. package/.claude/commands/agent-vibes/replay-target.md +14 -14
  59. package/.claude/commands/agent-vibes/sample.md +12 -12
  60. package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -84
  61. package/.claude/commands/agent-vibes/set-pretext.md +65 -65
  62. package/.claude/commands/agent-vibes/set-speed.md +41 -41
  63. package/.claude/commands/agent-vibes/show.md +84 -84
  64. package/.claude/commands/agent-vibes/switch.md +87 -87
  65. package/.claude/commands/agent-vibes/target-voice.md +26 -26
  66. package/.claude/commands/agent-vibes/target.md +30 -30
  67. package/.claude/commands/agent-vibes/translate.md +68 -68
  68. package/.claude/commands/agent-vibes/unmute.md +45 -45
  69. package/.claude/commands/agent-vibes/whoami.md +7 -7
  70. package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
  71. package/.claude/commands/agent-vibes-rdp.md +24 -24
  72. package/.claude/config/audio-effects.cfg +16 -11
  73. package/.claude/config/audio-effects.cfg.sample +52 -52
  74. package/.claude/config/background-music-position.txt +27 -0
  75. package/.claude/config/background-music-volume.txt +1 -1
  76. package/.claude/config/background-music.cfg +1 -0
  77. package/.claude/config/background-music.txt +1 -0
  78. package/.claude/config/tts-speech-rate.txt +1 -4
  79. package/.claude/config/tts-verbosity.txt +1 -0
  80. package/.claude/docs/TERMUX_SETUP.md +408 -408
  81. package/.claude/github-star-reminder.txt +1 -1
  82. package/.claude/hooks/README-TTS-QUEUE.md +135 -135
  83. package/.claude/hooks/audio-cache-utils.sh +0 -0
  84. package/.claude/hooks/audio-processor.sh +60 -14
  85. package/.claude/hooks/background-music-manager.sh +0 -0
  86. package/.claude/hooks/bmad-party-manager.sh +225 -0
  87. package/.claude/hooks/bmad-party-speak.sh +0 -0
  88. package/.claude/hooks/bmad-speak-enhanced.sh +0 -0
  89. package/.claude/hooks/bmad-speak.sh +12 -15
  90. package/.claude/hooks/bmad-tts-injector.sh +0 -0
  91. package/.claude/hooks/bmad-voice-manager.sh +0 -0
  92. package/.claude/hooks/clawdbot-receiver-SECURE.sh +25 -23
  93. package/.claude/hooks/clawdbot-receiver.sh +4 -28
  94. package/.claude/hooks/clean-audio-cache.sh +0 -0
  95. package/.claude/hooks/cleanup-cache.sh +0 -0
  96. package/.claude/hooks/configure-rdp-mode.sh +0 -0
  97. package/.claude/hooks/download-extra-voices.sh +0 -0
  98. package/.claude/hooks/effects-manager.sh +0 -0
  99. package/.claude/hooks/github-star-reminder.sh +0 -0
  100. package/.claude/hooks/language-manager.sh +0 -0
  101. package/.claude/hooks/learn-manager.sh +0 -0
  102. package/.claude/hooks/macos-voice-manager.sh +0 -0
  103. package/.claude/hooks/migrate-background-music.sh +0 -0
  104. package/.claude/hooks/migrate-to-agentvibes.sh +0 -0
  105. package/.claude/hooks/optimize-background-music.sh +0 -0
  106. package/.claude/hooks/personality-manager.sh +0 -0
  107. package/.claude/hooks/piper-download-voices.sh +0 -0
  108. package/.claude/hooks/piper-installer.sh +1 -1
  109. package/.claude/hooks/piper-multispeaker-registry.sh +0 -0
  110. package/.claude/hooks/piper-voice-manager.sh +0 -0
  111. package/.claude/hooks/play-tts-enhanced.sh +0 -0
  112. package/.claude/hooks/play-tts-macos.sh +6 -12
  113. package/.claude/hooks/play-tts-piper.sh +52 -81
  114. package/.claude/hooks/play-tts-soprano.sh +9 -43
  115. package/.claude/hooks/play-tts-ssh-remote.sh +43 -215
  116. package/.claude/hooks/play-tts-termux-ssh.sh +0 -0
  117. package/.claude/hooks/play-tts.sh +41 -20
  118. package/.claude/hooks/post-response.sh +41 -0
  119. package/.claude/hooks/prepare-release.sh +0 -0
  120. package/.claude/hooks/provider-commands.sh +0 -0
  121. package/.claude/hooks/provider-manager.sh +0 -0
  122. package/.claude/hooks/replay-target-audio.sh +0 -0
  123. package/.claude/hooks/requirements.txt +6 -6
  124. package/.claude/hooks/sentiment-manager.sh +0 -0
  125. package/.claude/hooks/session-start-tts.sh +56 -39
  126. package/.claude/hooks/soprano-gradio-synth.py +139 -139
  127. package/.claude/hooks/speed-manager.sh +0 -0
  128. package/.claude/hooks/stop.sh +63 -0
  129. package/.claude/hooks/termux-installer.sh +0 -0
  130. package/.claude/hooks/translate-manager.sh +0 -0
  131. package/.claude/hooks/translator.py +237 -237
  132. package/.claude/hooks/tts-queue-worker.sh +0 -0
  133. package/.claude/hooks/tts-queue.sh +0 -0
  134. package/.claude/hooks/verbosity-manager.sh +0 -0
  135. package/.claude/hooks/voice-manager.sh +26 -4
  136. package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
  137. package/.claude/hooks-windows/bmad-party-speak.ps1 +278 -278
  138. package/.claude/hooks-windows/bmad-speak.ps1 +264 -264
  139. package/.claude/hooks-windows/clean-audio-cache.ps1 +53 -53
  140. package/.claude/hooks-windows/effects-manager.ps1 +294 -294
  141. package/.claude/hooks-windows/language-manager.ps1 +193 -193
  142. package/.claude/hooks-windows/learn-manager.ps1 +241 -241
  143. package/.claude/hooks-windows/personality-manager.ps1 +266 -266
  144. package/.claude/hooks-windows/play-tts-soprano.ps1 +5 -5
  145. package/.claude/hooks-windows/play-tts-termux-ssh.ps1 +138 -138
  146. package/.claude/hooks-windows/play-tts-windows-piper.ps1 +178 -0
  147. package/.claude/hooks-windows/play-tts-windows-sapi.ps1 +108 -0
  148. package/.claude/hooks-windows/play-tts.ps1 +265 -507
  149. package/.claude/hooks-windows/provider-manager.ps1 +158 -192
  150. package/.claude/hooks-windows/session-start-tts.ps1 +55 -46
  151. package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
  152. package/.claude/hooks-windows/speed-manager.ps1 +166 -166
  153. package/.claude/hooks-windows/voice-manager-windows.ps1 +176 -260
  154. package/.claude/output-styles/agent-vibes.md +202 -202
  155. package/.claude/personalities/angry.md +14 -14
  156. package/.claude/personalities/annoying.md +14 -14
  157. package/.claude/personalities/crass.md +14 -14
  158. package/.claude/personalities/dramatic.md +14 -14
  159. package/.claude/personalities/dry-humor.md +50 -50
  160. package/.claude/personalities/flirty.md +20 -20
  161. package/.claude/personalities/funny.md +14 -14
  162. package/.claude/personalities/grandpa.md +32 -32
  163. package/.claude/personalities/millennial.md +14 -14
  164. package/.claude/personalities/moody.md +14 -14
  165. package/.claude/personalities/normal.md +16 -16
  166. package/.claude/personalities/pirate.md +14 -14
  167. package/.claude/personalities/poetic.md +14 -14
  168. package/.claude/personalities/professional.md +14 -14
  169. package/.claude/personalities/rapper.md +55 -55
  170. package/.claude/personalities/robot.md +14 -14
  171. package/.claude/personalities/sarcastic.md +38 -38
  172. package/.claude/personalities/sassy.md +14 -14
  173. package/.claude/personalities/surfer-dude.md +14 -14
  174. package/.claude/personalities/zen.md +14 -14
  175. package/.claude/piper-voices-dir.txt +1 -0
  176. package/.claude/settings.json +25 -15
  177. package/.claude/verbosity.txt +1 -1
  178. package/.clawdbot/README.md +105 -105
  179. package/.clawdbot/skill/SKILL.md +149 -145
  180. package/.mcp.json +30 -11
  181. package/CLAUDE.md +170 -215
  182. package/README.md +207 -521
  183. package/RELEASE_NOTES.md +1172 -1976
  184. package/WINDOWS-SETUP.md +208 -208
  185. package/bin/agent-vibes +0 -0
  186. package/bin/agentvibes-voice-browser.js +64 -1289
  187. package/bin/agentvibes.js +28 -0
  188. package/bin/ensure-soprano-running.sh +43 -0
  189. package/bin/mcp-server.js +121 -121
  190. package/bin/mcp-server.sh +0 -0
  191. package/bin/test-bmad-pr +78 -78
  192. package/mcp-server/QUICK_START.md +203 -203
  193. package/mcp-server/README.md +345 -345
  194. package/mcp-server/WINDOWS_SETUP.md +260 -260
  195. package/mcp-server/docs/troubleshooting-audio.md +313 -313
  196. package/mcp-server/examples/claude_desktop_config.json +11 -11
  197. package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
  198. package/mcp-server/examples/custom_instructions.md +169 -169
  199. package/mcp-server/install-deps.js +130 -130
  200. package/mcp-server/pyproject.toml +52 -52
  201. package/mcp-server/requirements.txt +2 -2
  202. package/mcp-server/server.py +1467 -1578
  203. package/mcp-server/test_server.py +395 -395
  204. package/package.json +1 -3
  205. package/setup-windows.ps1 +815 -815
  206. package/src/console/tabs/music-tab.js +5 -2
  207. package/src/console/tabs/voices-tab.js +71 -37
  208. package/src/installer.js +52 -5
  209. package/src/services/llm-provider-service.js +1 -1
  210. package/templates/agentvibes-receiver.sh +158 -483
  211. package/templates/audio/welcome-music.mp3 +0 -0
  212. package/.agentvibes/bmad-voice-map.json +0 -104
  213. package/.agentvibes/copilot-sessions.log +0 -4
  214. package/.claude/config/audio-effects-bmad.cfg +0 -50
  215. package/.claude/config/intro-text.txt +0 -1
  216. package/.claude/config/personality.txt +0 -1
  217. package/.claude/config/piper-speech-rate.txt +0 -4
  218. package/.claude/config/piper-target-speech-rate.txt +0 -1
  219. package/.claude/config/reverb-level.txt +0 -1
  220. package/.claude/config/tts-target-speech-rate.txt +0 -1
  221. package/voice-assignments.json +0 -8245
  222. /package/{.claude → .agentvibes}/config/agentvibes.json +0 -0
@@ -1,260 +1,176 @@
1
- #
2
- # File: .claude/hooks-windows/voice-manager-windows.ps1
3
- #
4
- # AgentVibes - Windows Voice Management
5
- #
6
-
7
- param(
8
- [Parameter(Position = 0)]
9
- [ValidateSet('list', 'list-simple', 'switch', 'get', 'replay')]
10
- [string]$Command = 'list',
11
-
12
- [Parameter(Position = 1)]
13
- [string]$VoiceName
14
- )
15
-
16
- $ClaudeDir = "$env:USERPROFILE\.claude"
17
- $ProviderFile = "$ClaudeDir\tts-provider.txt"
18
- $VoiceSapiFile = "$ClaudeDir\tts-voice-sapi.txt"
19
- $VoicePiperFile = "$ClaudeDir\tts-voice-piper.txt"
20
-
21
- # Get active provider
22
- $ActiveProvider = "sapi"
23
- if (Test-Path $ProviderFile) {
24
- $ActiveProvider = (Get-Content $ProviderFile -Raw).Trim()
25
- }
26
-
27
- # Get SAPI voices
28
- function Get-SAPIVoices {
29
- Add-Type -AssemblyName System.Speech
30
-
31
- $synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
32
- $voices = @()
33
-
34
- foreach ($voice in $synth.GetInstalledVoices()) {
35
- $voices += $voice.VoiceInfo.Name
36
- }
37
-
38
- return $voices
39
- }
40
-
41
- # Get Piper voices (checks both global and project-local directories)
42
- function Get-PiperVoices {
43
- $GlobalVoicesDir = "$env:USERPROFILE\.claude\piper-voices"
44
- # Also check project-local .claude/piper-voices
45
- $ScriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path
46
- $ProjectDir = Split-Path -Parent (Split-Path -Parent $ScriptPath)
47
- $ProjectVoicesDir = Join-Path $ProjectDir ".claude\piper-voices"
48
-
49
- $allVoices = @()
50
-
51
- foreach ($VoicesDir in @($GlobalVoicesDir, $ProjectVoicesDir)) {
52
- if (-not (Test-Path $VoicesDir)) {
53
- continue
54
- }
55
-
56
- $onnxFiles = Get-ChildItem -Path $VoicesDir -Filter "*.onnx" -ErrorAction SilentlyContinue
57
- foreach ($file in $onnxFiles) {
58
- $name = $file.BaseName
59
- if ($allVoices -notcontains $name) {
60
- $allVoices += $name
61
- }
62
- }
63
- }
64
-
65
- return $allVoices
66
- }
67
-
68
- # Legacy wrapper for single-dir callers
69
- function Get-PiperVoicesLegacy {
70
- $VoicesDir = "$ClaudeDir\piper-voices"
71
-
72
- if (-not (Test-Path $VoicesDir)) {
73
- return @()
74
- }
75
-
76
- $voices = @()
77
- $onnxFiles = Get-ChildItem -Path $VoicesDir -Filter "*.onnx" -ErrorAction SilentlyContinue
78
-
79
- foreach ($file in $onnxFiles) {
80
- $name = $file.BaseName
81
- $voices += $name
82
- }
83
-
84
- return $voices
85
- }
86
-
87
- # List available voices
88
- function List-Voices {
89
- Write-Host ""
90
- Write-Host "[VOICES] Available Voices by Provider" -ForegroundColor Cyan
91
- Write-Host ""
92
-
93
- # SAPI voices
94
- Write-Host "[SAPI] Windows SAPI (Built-in):" -ForegroundColor Green
95
- $sapiVoices = Get-SAPIVoices
96
-
97
- if ($sapiVoices.Count -eq 0) {
98
- Write-Host " (No voices installed)" -ForegroundColor Gray
99
- }
100
- else {
101
- $sapiVoices | ForEach-Object {
102
- $marker = if ($_ -eq (Get-CurrentVoice $VoiceSapiFile)) { "*" } else { " " }
103
- Write-Host " [$marker] $_" -ForegroundColor White
104
- }
105
- }
106
-
107
- Write-Host ""
108
-
109
- # Piper voices
110
- $PiperExe = "$env:LOCALAPPDATA\Programs\Piper\piper.exe"
111
- $piperInstalled = Test-Path $PiperExe
112
- $piperLabel = if ($piperInstalled) { "[PIPER] Piper (High Quality):" } else { "[PIPER] Piper (NOT INSTALLED - run setup-windows.ps1):" }
113
- Write-Host $piperLabel -ForegroundColor $(if ($piperInstalled) { "Green" } else { "Yellow" })
114
- $piperVoices = Get-PiperVoices
115
-
116
- if ($piperVoices.Count -eq 0) {
117
- Write-Host " (No voices downloaded - run download-piper-voices.ps1)" -ForegroundColor Gray
118
- }
119
- else {
120
- $piperVoices | ForEach-Object {
121
- $marker = if ($_ -eq (Get-CurrentVoice $VoicePiperFile)) { "*" } else { " " }
122
- Write-Host " [$marker] $_" -ForegroundColor White
123
- }
124
- }
125
-
126
- Write-Host ""
127
- Write-Host "[ACTIVE] Active Provider: $ActiveProvider" -ForegroundColor Cyan
128
- Write-Host ""
129
- }
130
-
131
- # Get current voice for provider
132
- function Get-CurrentVoice {
133
- param([string]$VoiceFile)
134
-
135
- if (Test-Path $VoiceFile) {
136
- return (Get-Content $VoiceFile -Raw).Trim()
137
- }
138
-
139
- return $null
140
- }
141
-
142
- # Switch voice
143
- function Switch-Voice {
144
- param([string]$NewVoice)
145
-
146
- # Determine which provider's voice file to update
147
- $VoiceFile = ""
148
- $ValidVoices = @()
149
-
150
- if ($ActiveProvider -eq "sapi" -or $ActiveProvider -eq "windows-sapi") {
151
- $VoiceFile = $VoiceSapiFile
152
- $ValidVoices = Get-SAPIVoices
153
- }
154
- elseif ($ActiveProvider -eq "piper" -or $ActiveProvider -eq "windows-piper") {
155
- $VoiceFile = $VoicePiperFile
156
- $ValidVoices = Get-PiperVoices
157
- }
158
- elseif ($ActiveProvider -eq "soprano") {
159
- Write-Host "[INFO] Soprano uses a single fixed voice (Soprano-1.1-80M)" -ForegroundColor Cyan
160
- return $true
161
- }
162
-
163
- if ($ValidVoices -notcontains $NewVoice) {
164
- Write-Host "[ERROR] Voice not found: $NewVoice" -ForegroundColor Red
165
- Write-Host "Available voices for ${ActiveProvider}:" -ForegroundColor Yellow
166
- $ValidVoices | ForEach-Object { Write-Host " - $_" }
167
- return $false
168
- }
169
-
170
- Set-Content -Path $VoiceFile -Value $NewVoice
171
- Write-Host "[OK] Voice set to: $NewVoice" -ForegroundColor Green
172
- return $true
173
- }
174
-
175
- # Show current voice
176
- function Show-CurrentVoice {
177
- $VoiceFile = if ($ActiveProvider -eq "sapi" -or $ActiveProvider -eq "windows-sapi") { $VoiceSapiFile } else { $VoicePiperFile }
178
- $CurrentVoice = Get-CurrentVoice $VoiceFile
179
-
180
- if ($CurrentVoice) {
181
- Write-Host "[VOICE] Current voice: $CurrentVoice ($ActiveProvider)" -ForegroundColor Cyan
182
- }
183
- else {
184
- Write-Host "[VOICE] Using default voice ($ActiveProvider)" -ForegroundColor Cyan
185
- }
186
- }
187
-
188
- # Main command routing
189
- switch ($Command) {
190
- 'list' {
191
- List-Voices
192
- }
193
-
194
- 'list-simple' {
195
- # Machine-parseable list for MCP server - one voice name per line
196
- if ($ActiveProvider -eq "windows-sapi" -or $ActiveProvider -eq "sapi") {
197
- $voices = Get-SAPIVoices
198
- foreach ($v in $voices) { Write-Output $v }
199
- }
200
- elseif ($ActiveProvider -eq "windows-piper" -or $ActiveProvider -eq "piper") {
201
- $voices = Get-PiperVoices
202
- foreach ($v in ($voices | Sort-Object)) { Write-Output $v }
203
- }
204
- elseif ($ActiveProvider -eq "soprano") {
205
- Write-Output "Soprano-1.1-80M"
206
- }
207
- else {
208
- # Fallback: try Piper voices
209
- $voices = Get-PiperVoices
210
- foreach ($v in ($voices | Sort-Object)) { Write-Output $v }
211
- }
212
- }
213
-
214
- 'switch' {
215
- if (-not $VoiceName) {
216
- Write-Host "[ERROR] Voice name required" -ForegroundColor Red
217
- List-Voices
218
- exit 1
219
- }
220
- Switch-Voice $VoiceName | Out-Null
221
- }
222
-
223
- 'get' {
224
- Show-CurrentVoice
225
- }
226
-
227
- 'replay' {
228
- $n = if ($VoiceName) { [int]$VoiceName } else { 1 }
229
- $AudioDir = Join-Path (Split-Path -Parent $ClaudeDir) ".claude\audio"
230
- if (-not (Test-Path $AudioDir)) {
231
- $AudioDir = Join-Path $ClaudeDir "audio"
232
- }
233
- # Find project-local audio dir first
234
- $ScriptClaudeDir = Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path)
235
- $ProjectAudioDir = Join-Path $ScriptClaudeDir "audio"
236
- if (Test-Path $ProjectAudioDir) { $AudioDir = $ProjectAudioDir }
237
-
238
- $recentFiles = Get-ChildItem -Path $AudioDir -Filter "tts-*.wav" -ErrorAction SilentlyContinue |
239
- Sort-Object LastWriteTime -Descending | Select-Object -First 10
240
-
241
- if (-not $recentFiles -or $recentFiles.Count -eq 0) {
242
- Write-Output "No recent audio files found"
243
- exit 1
244
- }
245
-
246
- if ($n -gt $recentFiles.Count) {
247
- Write-Output "Only $($recentFiles.Count) recent files available (requested #$n)"
248
- exit 1
249
- }
250
-
251
- $targetFile = $recentFiles[$n - 1]
252
- Write-Output "Replaying: $($targetFile.Name)"
253
-
254
- # Play using SoundPlayer
255
- Add-Type -AssemblyName System.Media
256
- $player = New-Object System.Media.SoundPlayer $targetFile.FullName
257
- $player.PlaySync()
258
- $player.Dispose()
259
- }
260
- }
1
+ #
2
+ # File: .claude/hooks-windows/voice-manager-windows.ps1
3
+ #
4
+ # AgentVibes - Windows Voice Management
5
+ #
6
+
7
+ param(
8
+ [Parameter(Position = 0)]
9
+ [ValidateSet('list', 'switch', 'get')]
10
+ [string]$Command = 'list',
11
+
12
+ [Parameter(Position = 1)]
13
+ [string]$VoiceName
14
+ )
15
+
16
+ $ClaudeDir = "$env:USERPROFILE\.claude"
17
+ $ProviderFile = "$ClaudeDir\tts-provider.txt"
18
+ $VoiceSapiFile = "$ClaudeDir\tts-voice-sapi.txt"
19
+ $VoicePiperFile = "$ClaudeDir\tts-voice-piper.txt"
20
+
21
+ # Get active provider
22
+ $ActiveProvider = "windows-sapi"
23
+ if (Test-Path $ProviderFile) {
24
+ $ActiveProvider = (Get-Content $ProviderFile -Raw).Trim()
25
+ }
26
+
27
+ # Get SAPI voices
28
+ function Get-SAPIVoices {
29
+ Add-Type -AssemblyName System.Speech
30
+
31
+ $synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
32
+ $voices = @()
33
+
34
+ foreach ($voice in $synth.GetInstalledVoices()) {
35
+ $voices += $voice.VoiceInfo.Name
36
+ }
37
+
38
+ return $voices
39
+ }
40
+
41
+ # Get Piper voices
42
+ function Get-PiperVoices {
43
+ $VoicesDir = "$ClaudeDir\piper-voices"
44
+
45
+ if (-not (Test-Path $VoicesDir)) {
46
+ return @()
47
+ }
48
+
49
+ $voices = @()
50
+ $onnxFiles = Get-ChildItem -Path $VoicesDir -Filter "*.onnx" -ErrorAction SilentlyContinue
51
+
52
+ foreach ($file in $onnxFiles) {
53
+ $name = $file.BaseName
54
+ $voices += $name
55
+ }
56
+
57
+ return $voices
58
+ }
59
+
60
+ # List available voices
61
+ function List-Voices {
62
+ Write-Host ""
63
+ Write-Host "[VOICES] Available Voices by Provider" -ForegroundColor Cyan
64
+ Write-Host ""
65
+
66
+ # SAPI voices
67
+ Write-Host "[SAPI] Windows SAPI (Built-in):" -ForegroundColor Green
68
+ $sapiVoices = Get-SAPIVoices
69
+
70
+ if ($sapiVoices.Count -eq 0) {
71
+ Write-Host " (No voices installed)" -ForegroundColor Gray
72
+ }
73
+ else {
74
+ $sapiVoices | ForEach-Object {
75
+ $marker = if ($_ -eq (Get-CurrentVoice $VoiceSapiFile)) { "*" } else { " " }
76
+ Write-Host " [$marker] $_" -ForegroundColor White
77
+ }
78
+ }
79
+
80
+ Write-Host ""
81
+
82
+ # Piper voices
83
+ Write-Host "[PIPER] Piper (High Quality):" -ForegroundColor Green
84
+ $piperVoices = Get-PiperVoices
85
+
86
+ if ($piperVoices.Count -eq 0) {
87
+ Write-Host " (No voices downloaded - run setup-windows.ps1)" -ForegroundColor Gray
88
+ }
89
+ else {
90
+ $piperVoices | ForEach-Object {
91
+ $marker = if ($_ -eq (Get-CurrentVoice $VoicePiperFile)) { "*" } else { " " }
92
+ Write-Host " [$marker] $_" -ForegroundColor White
93
+ }
94
+ }
95
+
96
+ Write-Host ""
97
+ Write-Host "[ACTIVE] Active Provider: $ActiveProvider" -ForegroundColor Cyan
98
+ Write-Host ""
99
+ }
100
+
101
+ # Get current voice for provider
102
+ function Get-CurrentVoice {
103
+ param([string]$VoiceFile)
104
+
105
+ if (Test-Path $VoiceFile) {
106
+ return (Get-Content $VoiceFile -Raw).Trim()
107
+ }
108
+
109
+ return $null
110
+ }
111
+
112
+ # Switch voice
113
+ function Switch-Voice {
114
+ param([string]$NewVoice)
115
+
116
+ # Determine which provider's voice file to update
117
+ $VoiceFile = ""
118
+ $ValidVoices = @()
119
+
120
+ if ($ActiveProvider -eq "windows-sapi") {
121
+ $VoiceFile = $VoiceSapiFile
122
+ $ValidVoices = Get-SAPIVoices
123
+ }
124
+ elseif ($ActiveProvider -eq "windows-piper") {
125
+ $VoiceFile = $VoicePiperFile
126
+ $ValidVoices = Get-PiperVoices
127
+ }
128
+ elseif ($ActiveProvider -eq "soprano") {
129
+ Write-Host "[INFO] Soprano uses a single fixed voice (Soprano-1.1-80M)" -ForegroundColor Cyan
130
+ return $true
131
+ }
132
+
133
+ if ($ValidVoices -notcontains $NewVoice) {
134
+ Write-Host "[ERROR] Voice not found: $NewVoice" -ForegroundColor Red
135
+ Write-Host "Available voices for ${ActiveProvider}:" -ForegroundColor Yellow
136
+ $ValidVoices | ForEach-Object { Write-Host " - $_" }
137
+ return $false
138
+ }
139
+
140
+ Set-Content -Path $VoiceFile -Value $NewVoice
141
+ Write-Host "[OK] Voice set to: $NewVoice" -ForegroundColor Green
142
+ return $true
143
+ }
144
+
145
+ # Show current voice
146
+ function Show-CurrentVoice {
147
+ $VoiceFile = if ($ActiveProvider -eq "windows-sapi") { $VoiceSapiFile } else { $VoicePiperFile }
148
+ $CurrentVoice = Get-CurrentVoice $VoiceFile
149
+
150
+ if ($CurrentVoice) {
151
+ Write-Host "[VOICE] Current voice: $CurrentVoice ($ActiveProvider)" -ForegroundColor Cyan
152
+ }
153
+ else {
154
+ Write-Host "[VOICE] Using default voice ($ActiveProvider)" -ForegroundColor Cyan
155
+ }
156
+ }
157
+
158
+ # Main command routing
159
+ switch ($Command) {
160
+ 'list' {
161
+ List-Voices
162
+ }
163
+
164
+ 'switch' {
165
+ if (-not $VoiceName) {
166
+ Write-Host "[ERROR] Voice name required" -ForegroundColor Red
167
+ List-Voices
168
+ exit 1
169
+ }
170
+ Switch-Voice $VoiceName | Out-Null
171
+ }
172
+
173
+ 'get' {
174
+ Show-CurrentVoice
175
+ }
176
+ }