voice-mode 2.28.2__tar.gz → 2.28.3__tar.gz

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 (114) hide show
  1. {voice_mode-2.28.2 → voice_mode-2.28.3}/CHANGELOG.md +27 -5
  2. {voice_mode-2.28.2 → voice_mode-2.28.3}/PKG-INFO +1 -1
  3. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/__version__.py +1 -1
  4. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/converse.py +10 -1
  5. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/service.py +10 -2
  6. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/kokoro/install.py +9 -1
  7. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/livekit/install.py +9 -1
  8. {voice_mode-2.28.2 → voice_mode-2.28.3}/.gitignore +0 -0
  9. {voice_mode-2.28.2 → voice_mode-2.28.3}/README.md +0 -0
  10. {voice_mode-2.28.2 → voice_mode-2.28.3}/build_hooks.py +0 -0
  11. {voice_mode-2.28.2 → voice_mode-2.28.3}/pyproject.toml +0 -0
  12. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/__init__.py +0 -0
  13. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/__main__.py +0 -0
  14. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/cli.py +0 -0
  15. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/cli_commands/__init__.py +0 -0
  16. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/cli_commands/exchanges.py +0 -0
  17. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/config.py +0 -0
  18. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/conversation_logger.py +0 -0
  19. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/core.py +0 -0
  20. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/data/versions.json +0 -0
  21. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/exchanges/__init__.py +0 -0
  22. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/exchanges/conversations.py +0 -0
  23. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/exchanges/filters.py +0 -0
  24. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/exchanges/formatters.py +0 -0
  25. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/exchanges/models.py +0 -0
  26. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/exchanges/reader.py +0 -0
  27. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/exchanges/stats.py +0 -0
  28. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/README.md +0 -0
  29. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/app/api/connection-details/route.ts +0 -0
  30. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/app/favicon.ico +0 -0
  31. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/app/globals.css +0 -0
  32. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/app/layout.tsx +0 -0
  33. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/app/page.tsx +0 -0
  34. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/components/CloseIcon.tsx +0 -0
  35. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/components/NoAgentNotification.tsx +0 -0
  36. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/components/TranscriptionView.tsx +0 -0
  37. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/hooks/useCombinedTranscriptions.ts +0 -0
  38. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/hooks/useLocalMicTrack.ts +0 -0
  39. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/next-env.d.ts +0 -0
  40. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/next.config.mjs +0 -0
  41. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/package-lock.json +0 -0
  42. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/package.json +0 -0
  43. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/pnpm-lock.yaml +0 -0
  44. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/postcss.config.mjs +0 -0
  45. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/tailwind.config.ts +0 -0
  46. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/frontend/tsconfig.json +0 -0
  47. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/prompts/README.md +0 -0
  48. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/prompts/__init__.py +0 -0
  49. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/prompts/converse.py +0 -0
  50. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/prompts/release_notes.py +0 -0
  51. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/prompts/services.py +0 -0
  52. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/provider_discovery.py +0 -0
  53. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/providers.py +0 -0
  54. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/resources/__init__.py +0 -0
  55. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/resources/audio_files.py +0 -0
  56. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/resources/changelog.py +0 -0
  57. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/resources/configuration.py +0 -0
  58. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/resources/statistics.py +0 -0
  59. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/resources/version.py +0 -0
  60. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/resources/whisper_models.py +0 -0
  61. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/server.py +0 -0
  62. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/shared.py +0 -0
  63. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/simple_failover.py +0 -0
  64. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/statistics.py +0 -0
  65. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/streaming.py +0 -0
  66. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/templates/launchd/com.voicemode.frontend.plist +0 -0
  67. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/templates/launchd/com.voicemode.kokoro.plist +0 -0
  68. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/templates/launchd/com.voicemode.livekit.plist +0 -0
  69. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/templates/launchd/com.voicemode.whisper.plist +0 -0
  70. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/templates/launchd/start-kokoro-with-health-check.sh +0 -0
  71. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/templates/launchd/start-whisper-with-health-check.sh +0 -0
  72. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/templates/systemd/voicemode-frontend.service +0 -0
  73. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/templates/systemd/voicemode-kokoro.service +0 -0
  74. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/templates/systemd/voicemode-livekit.service +0 -0
  75. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/templates/systemd/voicemode-whisper.service +0 -0
  76. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/__init__.py +0 -0
  77. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/configuration_management.py +0 -0
  78. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/dependencies.py +0 -0
  79. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/devices.py +0 -0
  80. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/diagnostics.py +0 -0
  81. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/providers.py +0 -0
  82. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/kokoro/uninstall.py +0 -0
  83. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/list_versions.py +0 -0
  84. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/livekit/__init__.py +0 -0
  85. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/livekit/frontend.py +0 -0
  86. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/livekit/production_server.py +0 -0
  87. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/livekit/uninstall.py +0 -0
  88. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/version_info.py +0 -0
  89. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/whisper/__init__.py +0 -0
  90. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/whisper/install.py +0 -0
  91. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/whisper/list_models.py +0 -0
  92. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/whisper/model_active.py +0 -0
  93. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/whisper/model_benchmark.py +0 -0
  94. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/whisper/model_install.py +0 -0
  95. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/whisper/model_remove.py +0 -0
  96. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/whisper/models.py +0 -0
  97. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/services/whisper/uninstall.py +0 -0
  98. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/statistics.py +0 -0
  99. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/tools/voice_registry.py +0 -0
  100. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/utils/__init__.py +0 -0
  101. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/utils/audio_diagnostics.py +0 -0
  102. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/utils/event_logger.py +0 -0
  103. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/utils/ffmpeg_check.py +0 -0
  104. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/utils/format_migration.py +0 -0
  105. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/utils/gpu_detection.py +0 -0
  106. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/utils/migration_helpers.py +0 -0
  107. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/utils/services/common.py +0 -0
  108. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/utils/services/kokoro_helpers.py +0 -0
  109. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/utils/services/livekit_helpers.py +0 -0
  110. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/utils/services/whisper_helpers.py +0 -0
  111. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/utils/services/whisper_version.py +0 -0
  112. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/utils/version_helpers.py +0 -0
  113. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/version.py +0 -0
  114. {voice_mode-2.28.2 → voice_mode-2.28.3}/voice_mode/voice_preferences.py +0 -0
@@ -7,14 +7,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.28.3] - 2025-08-24
11
+
12
+ ### Fixed
13
+ - **Parameter type handling for MCP tools**
14
+ - Fixed vad_aggressiveness parameter to accept string values from LLMs
15
+ - Fixed port parameters in kokoro_install and livekit_install
16
+ - Fixed lines parameter in service management tool
17
+ - All numeric parameters now properly convert strings to integers
18
+ - Addresses systemic issue where Claude Code MCP client passes strings
19
+
20
+ - **Installer script uvx command corrections**
21
+ - Fixed MCP configuration to use correct command `uvx voice-mode` (without --refresh)
22
+ - Installer now always refreshes to latest version at start
23
+ - Removed unnecessary --refresh flags from runtime commands
24
+ - Updated user-facing command examples to show correct usage
25
+
10
26
  ## [2.28.2] - 2025-08-24
11
27
 
28
+ ### Added
29
+ - **Configurable audio feedback pip delays**
30
+ - Added VOICEMODE_PIP_LEADING_SILENCE and VOICEMODE_PIP_TRAILING_SILENCE environment variables
31
+ - Allows customization of silence before and after audio feedback chimes
32
+ - Configurable via converse tool parameters pip_leading_silence and pip_trailing_silence
33
+ - Helps prevent audio cutoff on Bluetooth devices and other audio systems with delay
34
+
12
35
  ### Fixed
13
- - **Improved noise filtering in VAD (Voice Activity Detection)**
14
- - Fixed issue where nose blowing and similar non-speech sounds were detected as speech
15
- - Adjusted VAD aggressiveness handling to better filter continuous non-speech audio
16
- - Prevents false positives from breathing sounds, sniffles, and ambient noise
17
- - Improves overall speech detection accuracy
36
+ - **Audio feedback for Bluetooth devices**
37
+ - Added silence buffer before chimes to prevent Bluetooth audio cutoff
38
+ - Improved compatibility with devices that have audio activation delay
39
+ - Better audio feedback experience across different output devices
18
40
 
19
41
  ## [2.28.1] - 2025-08-24
20
42
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voice-mode
3
- Version: 2.28.2
3
+ Version: 2.28.3
4
4
  Summary: VoiceMode - Voice interaction capabilities for AI assistants (formerly voice-mcp)
5
5
  Project-URL: Homepage, https://github.com/mbailey/voicemode
6
6
  Project-URL: Repository, https://github.com/mbailey/voicemode
@@ -1,3 +1,3 @@
1
1
  # This file is automatically updated by 'make release'
2
2
  # Do not edit manually
3
- __version__ = "2.28.2"
3
+ __version__ = "2.28.3"
@@ -1323,7 +1323,7 @@ async def converse(
1323
1323
  audio_format: Optional[str] = None,
1324
1324
  disable_silence_detection: Union[bool, str] = False,
1325
1325
  speed: Optional[float] = None,
1326
- vad_aggressiveness: Optional[int] = None,
1326
+ vad_aggressiveness: Optional[Union[int, str]] = None,
1327
1327
  skip_tts: Optional[Union[bool, str]] = None,
1328
1328
  pip_leading_silence: Optional[float] = None,
1329
1329
  pip_trailing_silence: Optional[float] = None
@@ -1495,6 +1495,15 @@ async def converse(
1495
1495
  if skip_tts is not None and isinstance(skip_tts, str):
1496
1496
  skip_tts = skip_tts.lower() in ('true', '1', 'yes', 'on')
1497
1497
 
1498
+ # Convert vad_aggressiveness to integer if provided as string
1499
+ if vad_aggressiveness is not None and isinstance(vad_aggressiveness, str):
1500
+ try:
1501
+ vad_aggressiveness = int(vad_aggressiveness)
1502
+ # Validation will happen later in the function
1503
+ except ValueError:
1504
+ logger.warning(f"Invalid VAD aggressiveness value '{vad_aggressiveness}', using default")
1505
+ vad_aggressiveness = None
1506
+
1498
1507
  # Determine whether to skip TTS
1499
1508
  if skip_tts is not None:
1500
1509
  # Parameter explicitly set, use it
@@ -8,7 +8,7 @@ import platform
8
8
  import subprocess
9
9
  import time
10
10
  from pathlib import Path
11
- from typing import Literal, Optional, Dict, Any
11
+ from typing import Literal, Optional, Dict, Any, Union
12
12
 
13
13
  import psutil
14
14
 
@@ -980,7 +980,7 @@ async def view_logs(service_name: str, lines: Optional[int] = None) -> str:
980
980
  async def service(
981
981
  service_name: Literal["whisper", "kokoro", "livekit", "frontend"],
982
982
  action: Literal["status", "start", "stop", "restart", "enable", "disable", "logs", "update-service-files"] = "status",
983
- lines: Optional[int] = None
983
+ lines: Optional[Union[int, str]] = None
984
984
  ) -> str:
985
985
  """Unified service management tool for voice mode services.
986
986
 
@@ -1007,6 +1007,14 @@ async def service(
1007
1007
  service("kokoro", "start") # Start Kokoro service
1008
1008
  service("whisper", "logs", 100) # View last 100 lines of Whisper logs
1009
1009
  """
1010
+ # Convert lines to integer if provided as string
1011
+ if lines is not None and isinstance(lines, str):
1012
+ try:
1013
+ lines = int(lines)
1014
+ except ValueError:
1015
+ logger.warning(f"Invalid lines value '{lines}', using default 50")
1016
+ lines = 50
1017
+
1010
1018
  # Route to appropriate handler
1011
1019
  if action == "status":
1012
1020
  return await status_service(service_name)
@@ -26,7 +26,7 @@ logger = logging.getLogger("voice-mode")
26
26
  async def kokoro_install(
27
27
  install_dir: Optional[str] = None,
28
28
  models_dir: Optional[str] = None,
29
- port: int = 8880,
29
+ port: Union[int, str] = 8880,
30
30
  auto_start: Union[bool, str] = True,
31
31
  install_models: Union[bool, str] = True,
32
32
  force_reinstall: Union[bool, str] = False,
@@ -54,6 +54,14 @@ async def kokoro_install(
54
54
  Installation status with service configuration details
55
55
  """
56
56
  try:
57
+ # Convert port to integer if provided as string
58
+ if isinstance(port, str):
59
+ try:
60
+ port = int(port)
61
+ except ValueError:
62
+ logger.warning(f"Invalid port value '{port}', using default 8880")
63
+ port = 8880
64
+
57
65
  # Check for and migrate old installations
58
66
  migration_msg = auto_migrate_if_needed("kokoro")
59
67
 
@@ -124,7 +124,7 @@ room:
124
124
  @mcp.tool()
125
125
  async def livekit_install(
126
126
  install_dir: Optional[str] = None,
127
- port: int = 7880,
127
+ port: Union[int, str] = 7880,
128
128
  force_reinstall: Union[bool, str] = False,
129
129
  auto_enable: Optional[Union[bool, str]] = None,
130
130
  version: str = "latest"
@@ -159,6 +159,14 @@ async def livekit_install(
159
159
  # Check system
160
160
  system = platform.system()
161
161
 
162
+ # Convert port to integer if provided as string
163
+ if isinstance(port, str):
164
+ try:
165
+ port = int(port)
166
+ except ValueError:
167
+ logger.warning(f"Invalid port value '{port}', using default 7880")
168
+ port = 7880
169
+
162
170
  # Handle string boolean conversions
163
171
  if isinstance(force_reinstall, str):
164
172
  force_reinstall = force_reinstall.lower() in ("true", "1", "yes", "on")
File without changes
File without changes
File without changes
File without changes