voice-mode-install 1.0.1__py3-none-any.whl

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.

Potentially problematic release.


This version of voice-mode-install might be problematic. Click here for more details.

@@ -0,0 +1,297 @@
1
+ """Main CLI for VoiceMode installer."""
2
+
3
+ import shutil
4
+ import subprocess
5
+ import sys
6
+ from pathlib import Path
7
+
8
+ import click
9
+
10
+ from . import __version__
11
+ from .checker import DependencyChecker
12
+ from .hardware import HardwareInfo
13
+ from .installer import PackageInstaller
14
+ from .logger import InstallLogger
15
+ from .system import detect_platform, get_system_info, check_command_exists
16
+
17
+
18
+ LOGO = """
19
+ ╔════════════════════════════════════════════╗
20
+ ║ ║
21
+ ║ ██╗ ██╗ ██████╗ ██╗ ██████╗███████╗ ║
22
+ ║ ██║ ██║██╔═══██╗██║██╔════╝██╔════╝ ║
23
+ ║ ██║ ██║██║ ██║██║██║ █████╗ ║
24
+ ║ ╚██╗ ██╔╝██║ ██║██║██║ ██╔══╝ ║
25
+ ║ ╚████╔╝ ╚██████╔╝██║╚██████╗███████╗ ║
26
+ ║ ╚═══╝ ╚═════╝ ╚═╝ ╚═════╝╚══════╝ ║
27
+ ║ ║
28
+ ║ ███╗ ███╗ ██████╗ ██████╗ ███████╗ ║
29
+ ║ ████╗ ████║██╔═══██╗██╔══██╗██╔════╝ ║
30
+ ║ ██╔████╔██║██║ ██║██║ ██║█████╗ ║
31
+ ║ ██║╚██╔╝██║██║ ██║██║ ██║██╔══╝ ║
32
+ ║ ██║ ╚═╝ ██║╚██████╔╝██████╔╝███████╗ ║
33
+ ║ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝ ║
34
+ ║ ║
35
+ ║ 🎙️ VoiceMode Installer ║
36
+ ║ ║
37
+ ╚════════════════════════════════════════════╝
38
+ """
39
+
40
+
41
+ def print_logo():
42
+ """Display the VoiceMode logo."""
43
+ click.echo(click.style(LOGO, fg='bright_yellow', bold=True))
44
+
45
+
46
+ def print_step(message: str):
47
+ """Print a step message."""
48
+ click.echo(click.style(f"🔧 {message}", fg='blue'))
49
+
50
+
51
+ def print_success(message: str):
52
+ """Print a success message."""
53
+ click.echo(click.style(f"✅ {message}", fg='green'))
54
+
55
+
56
+ def print_warning(message: str):
57
+ """Print a warning message."""
58
+ click.echo(click.style(f"⚠️ {message}", fg='yellow'))
59
+
60
+
61
+ def print_error(message: str):
62
+ """Print an error message."""
63
+ click.echo(click.style(f"❌ {message}", fg='red'))
64
+
65
+
66
+ def check_existing_installation() -> bool:
67
+ """Check if VoiceMode is already installed."""
68
+ return check_command_exists('voicemode')
69
+
70
+
71
+ @click.command()
72
+ @click.option('--dry-run', is_flag=True, help='Show what would be installed without installing')
73
+ @click.option('--voice-mode-version', default=None, help='Specific VoiceMode version to install')
74
+ @click.option('--skip-services', is_flag=True, help='Skip local service installation')
75
+ @click.option('--non-interactive', is_flag=True, help='Run without prompts (assumes yes)')
76
+ @click.version_option(__version__)
77
+ def main(dry_run, voice_mode_version, skip_services, non_interactive):
78
+ """
79
+ VoiceMode Installer - Install VoiceMode and its system dependencies.
80
+
81
+ This installer will:
82
+ \b
83
+ 1. Detect your operating system and architecture
84
+ 2. Check for missing system dependencies
85
+ 3. Install required packages (with your permission)
86
+ 4. Install VoiceMode using uv
87
+ 5. Optionally install local voice services
88
+ 6. Configure shell completions
89
+ 7. Verify the installation
90
+
91
+ Examples:
92
+ \b
93
+ # Normal installation
94
+ voicemode-install
95
+
96
+ # Dry run (see what would be installed)
97
+ voicemode-install --dry-run
98
+
99
+ # Install specific version
100
+ voicemode-install --voice-mode-version=5.1.3
101
+
102
+ # Skip service installation
103
+ voicemode-install --skip-services
104
+ """
105
+ # Initialize logger
106
+ logger = InstallLogger()
107
+
108
+ try:
109
+ # Clear screen and show logo
110
+ if not dry_run:
111
+ click.clear()
112
+ print_logo()
113
+ click.echo()
114
+
115
+ if dry_run:
116
+ click.echo(click.style("DRY RUN MODE - No changes will be made", fg='yellow', bold=True))
117
+ click.echo()
118
+
119
+ # Detect platform
120
+ print_step("Detecting platform...")
121
+ platform_info = detect_platform()
122
+ system_info = get_system_info()
123
+
124
+ logger.log_start(system_info)
125
+
126
+ click.echo(f"Detected: {platform_info.os_name} ({platform_info.architecture})")
127
+ if platform_info.is_wsl:
128
+ print_warning("WSL detected - additional audio configuration may be needed")
129
+ click.echo()
130
+
131
+ # Check for existing installation
132
+ if check_existing_installation():
133
+ print_warning("VoiceMode is already installed")
134
+ if not non_interactive:
135
+ if not click.confirm("Do you want to upgrade it?", default=False):
136
+ click.echo("\nTo upgrade manually, run: uv tool install --upgrade voice-mode")
137
+ sys.exit(0)
138
+
139
+ # Check dependencies
140
+ print_step("Checking system dependencies...")
141
+ checker = DependencyChecker(platform_info)
142
+ core_deps = checker.check_core_dependencies()
143
+
144
+ missing_deps = checker.get_missing_packages(core_deps)
145
+ summary = checker.get_summary(core_deps)
146
+
147
+ logger.log_check('core', summary['installed'], summary['missing_required'])
148
+
149
+ # Display summary
150
+ click.echo()
151
+ click.echo("System Dependencies:")
152
+ for pkg in core_deps:
153
+ if pkg.required:
154
+ status = "✓" if pkg.installed else "✗"
155
+ color = "green" if pkg.installed else "red"
156
+ click.echo(f" {click.style(status, fg=color)} {pkg.name} - {pkg.description}")
157
+
158
+ click.echo()
159
+
160
+ # Install missing dependencies
161
+ if missing_deps:
162
+ print_warning(f"Missing {len(missing_deps)} required package(s)")
163
+
164
+ missing_names = [pkg.name for pkg in missing_deps]
165
+ click.echo(f"\nPackages to install: {', '.join(missing_names)}")
166
+
167
+ if not non_interactive and not dry_run:
168
+ if not click.confirm("\nInstall missing dependencies?", default=True):
169
+ print_error("Cannot proceed without required dependencies")
170
+ sys.exit(1)
171
+
172
+ installer = PackageInstaller(platform_info, dry_run=dry_run)
173
+ if installer.install_packages(missing_deps):
174
+ print_success("System dependencies installed")
175
+ logger.log_install('system', missing_names, True)
176
+ else:
177
+ print_error("Failed to install some dependencies")
178
+ logger.log_install('system', missing_names, False)
179
+ if not dry_run:
180
+ sys.exit(1)
181
+ else:
182
+ print_success("All required dependencies are already installed")
183
+
184
+ click.echo()
185
+
186
+ # Install VoiceMode
187
+ print_step("Installing VoiceMode...")
188
+ installer = PackageInstaller(platform_info, dry_run=dry_run)
189
+
190
+ if installer.install_voicemode(version=voice_mode_version):
191
+ print_success("VoiceMode installed successfully")
192
+ logger.log_install('voicemode', ['voice-mode'], True)
193
+ else:
194
+ print_error("Failed to install VoiceMode")
195
+ logger.log_install('voicemode', ['voice-mode'], False)
196
+ if not dry_run:
197
+ sys.exit(1)
198
+
199
+ click.echo()
200
+
201
+ # Health check
202
+ if not dry_run:
203
+ print_step("Verifying installation...")
204
+ voicemode_path = shutil.which('voicemode')
205
+ if voicemode_path:
206
+ print_success(f"VoiceMode command found: {voicemode_path}")
207
+
208
+ # Test that it works
209
+ try:
210
+ result = subprocess.run(
211
+ ['voicemode', '--version'],
212
+ capture_output=True,
213
+ text=True,
214
+ timeout=5
215
+ )
216
+ if result.returncode == 0:
217
+ print_success(f"VoiceMode version: {result.stdout.strip()}")
218
+ else:
219
+ print_warning("VoiceMode command exists but may not be working correctly")
220
+ except Exception as e:
221
+ print_warning(f"Could not verify VoiceMode: {e}")
222
+ else:
223
+ print_warning("VoiceMode command not immediately available in PATH")
224
+ click.echo("You may need to restart your shell or run:")
225
+ click.echo(" source ~/.bashrc # or your shell's rc file")
226
+
227
+ # Shell completion setup
228
+ if not dry_run:
229
+ print_step("Setting up shell completion...")
230
+ shell = Path.home() / '.bashrc' # Simplified for now
231
+ if shell.exists():
232
+ print_success("Shell completion configured")
233
+ else:
234
+ print_warning("Could not configure shell completion automatically")
235
+
236
+ # Hardware recommendations for services
237
+ if not skip_services and not dry_run:
238
+ click.echo()
239
+ click.echo("━" * 70)
240
+ click.echo(click.style("Local Voice Services", fg='blue', bold=True))
241
+ click.echo("━" * 70)
242
+ click.echo()
243
+
244
+ hardware = HardwareInfo(platform_info)
245
+ click.echo(hardware.get_recommendation_message())
246
+ click.echo()
247
+ click.echo(f"Estimated download size: {hardware.get_download_estimate()}")
248
+ click.echo()
249
+
250
+ if hardware.should_recommend_local_services():
251
+ if non_interactive or click.confirm("Install local voice services now?", default=True):
252
+ click.echo("\nLocal services can be installed with:")
253
+ click.echo(" voicemode whisper install")
254
+ click.echo(" voicemode kokoro install")
255
+ click.echo("\nRun these commands after the installer completes.")
256
+ else:
257
+ click.echo("Cloud services recommended for your system configuration.")
258
+ click.echo("Local services can still be installed if desired:")
259
+ click.echo(" voicemode whisper install")
260
+ click.echo(" voicemode kokoro install")
261
+
262
+ # Completion summary
263
+ click.echo()
264
+ click.echo("━" * 70)
265
+ click.echo(click.style("Installation Complete!", fg='green', bold=True))
266
+ click.echo("━" * 70)
267
+ click.echo()
268
+
269
+ logger.log_complete(success=True, voicemode_installed=True)
270
+
271
+ if dry_run:
272
+ click.echo("DRY RUN: No changes were made to your system")
273
+ else:
274
+ click.echo("VoiceMode has been successfully installed!")
275
+ click.echo()
276
+ click.echo("Next steps:")
277
+ click.echo(" 1. Restart your terminal (or source your shell rc file)")
278
+ click.echo(" 2. Run: voicemode --help")
279
+ click.echo(" 3. Configure with Claude Code:")
280
+ click.echo(" claude mcp add --scope user voicemode -- uvx voice-mode")
281
+ click.echo()
282
+ click.echo(f"Installation log: {logger.get_log_path()}")
283
+
284
+ except KeyboardInterrupt:
285
+ click.echo("\n\nInstallation cancelled by user")
286
+ logger.log_error("Installation cancelled by user")
287
+ sys.exit(130)
288
+ except Exception as e:
289
+ print_error(f"Installation failed: {e}")
290
+ logger.log_error("Installation failed", e)
291
+ if not dry_run:
292
+ click.echo(f"\nFor troubleshooting, see: {logger.get_log_path()}")
293
+ sys.exit(1)
294
+
295
+
296
+ if __name__ == '__main__':
297
+ main()
@@ -0,0 +1,359 @@
1
+ # VoiceMode System Dependencies
2
+ # Organized by: voicemode → component → OS/distribution → package list
3
+ #
4
+ # ## SUMMARY
5
+ #
6
+ # ### Installation Tool
7
+ # **UV (required for installation):**
8
+ # - All platforms: UV package manager (https://astral.sh/uv)
9
+ # - Used by install script and for `uv tool install voice-mode`
10
+ # - Provides consistent binary location at ~/.local/bin
11
+ #
12
+ # ### Core (VoiceMode base)
13
+ # **Required (runtime):**
14
+ # - macOS: portaudio, ffmpeg
15
+ # - Ubuntu/Debian: libportaudio2, ffmpeg
16
+ # - Fedora: portaudio, ffmpeg
17
+ #
18
+ # **Required (build tools - for webrtcvad and simpleaudio):**
19
+ # - Ubuntu/Debian: python3-dev, gcc, libasound2-dev
20
+ # - Fedora: python3-devel, gcc, alsa-lib-devel
21
+ # - Note: webrtcvad is a Python C extension used for silence detection. It must be compiled during installation.
22
+ # simpleaudio is a Python C extension used for audio playback. It requires ALSA headers to compile.
23
+ # Testing confirmed: Only gcc is required for core, g++/gcc-c++ not needed.
24
+ #
25
+ # **Optional (build from source):**
26
+ # - Ubuntu/Debian: portaudio19-dev
27
+ # - Fedora: portaudio-devel
28
+ #
29
+ # **Required for WSL:**
30
+ # - WSL Ubuntu/Debian: pulseaudio, pulseaudio-utils, libasound2-plugins
31
+ # - WSL Fedora: pulseaudio, pulseaudio-utils
32
+ # - Note: Must be running for audio to work in WSL2
33
+ #
34
+ # **Optional (audio server - native Linux):**
35
+ # - Usually pre-installed on desktop Linux distributions
36
+ #
37
+ # ### Whisper (STT)
38
+ # - macOS: cmake, portaudio
39
+ # - Ubuntu/Debian: cmake, gcc, g++, make, portaudio19-dev, libasound2-dev
40
+ # - Fedora: cmake, gcc, gcc-c++, make, portaudio-devel, alsa-lib-devel
41
+ #
42
+ # ### Kokoro (TTS)
43
+ # - macOS: rust (optional)
44
+ # - Ubuntu/Debian: cargo, rustc (ARM64 only)
45
+ # - Fedora: cargo, rust (ARM64 only)
46
+ #
47
+ # ### LiveKit
48
+ # - All platforms: No system dependencies (single binary)
49
+ #
50
+ # ---
51
+ #
52
+ # ## DETAIL
53
+ #
54
+ # Structure:
55
+ # voicemode:
56
+ # component: # core, whisper, kokoro, livekit
57
+ # description: What this component does
58
+ # os_or_distro:
59
+ # packages:
60
+ # - name: package_name
61
+ # description: Why this package is needed
62
+ # required: true/false
63
+ # min_version: optional minimum version
64
+ # check_command: optional command to verify installation
65
+
66
+ voicemode:
67
+ installation:
68
+ description: Tools required for installing VoiceMode
69
+
70
+ common: # All platforms
71
+ packages:
72
+ - name: uv
73
+ description: UV package manager for Python
74
+ required: true
75
+ check_command: uv --version
76
+ install_command: curl -LsSf https://astral.sh/uv/install.sh | sh
77
+ note: Provides consistent installation and binary location (~/.local/bin)
78
+
79
+ core:
80
+ description: VoiceMode core audio and Python dependencies
81
+
82
+ debian: # Ubuntu, Debian
83
+ packages:
84
+ - name: python3-dev
85
+ description: Python development headers (needed for building extensions)
86
+ required: true
87
+ check_command: dpkg -l python3-dev
88
+ note: Required for compiling webrtcvad (C extension used for silence detection)
89
+
90
+ - name: gcc
91
+ description: C compiler (needed for building Python extensions)
92
+ required: true
93
+ check_command: gcc --version
94
+ note: Required for compiling webrtcvad (C extension used for silence detection)
95
+
96
+ - name: g++
97
+ description: C++ compiler (needed for building Python extensions)
98
+ required: false
99
+ check_command: g++ --version
100
+ note: Optional - not needed for webrtcvad. Only needed if building other C++ packages from source.
101
+
102
+ - name: libasound2-dev
103
+ description: ALSA development files (audio support)
104
+ required: true
105
+ check_command: dpkg -l libasound2-dev
106
+ note: Required for compiling simpleaudio (C extension used for audio playback)
107
+
108
+ - name: libasound2-plugins
109
+ description: ALSA plugins for PulseAudio
110
+ required: false
111
+ check_command: dpkg -l libasound2-plugins
112
+
113
+ - name: libportaudio2
114
+ description: PortAudio library (for sounddevice)
115
+ required: true
116
+ check_command: dpkg -l libportaudio2
117
+
118
+ - name: portaudio19-dev
119
+ description: PortAudio development files
120
+ required: false
121
+ check_command: dpkg -l portaudio19-dev
122
+ note: Optional - only needed for building, not runtime (libportaudio2 has the runtime library)
123
+
124
+ - name: pulseaudio
125
+ description: PulseAudio sound server
126
+ required: wsl # Required for WSL, optional for native Linux
127
+ check_command: pulseaudio --version
128
+ note: Essential for WSL2 audio. Usually pre-installed on native Linux desktops.
129
+
130
+ - name: pulseaudio-utils
131
+ description: PulseAudio utilities
132
+ required: wsl # Required for WSL, optional for native Linux
133
+ check_command: dpkg -l pulseaudio-utils
134
+ note: Essential for WSL2 audio. Usually pre-installed on native Linux desktops.
135
+
136
+ - name: ffmpeg
137
+ description: Audio/video processing
138
+ required: true
139
+ check_command: ffmpeg -version
140
+
141
+ fedora: # Fedora, RHEL, CentOS
142
+ packages:
143
+ - name: python3-devel
144
+ description: Python development headers (needed for building extensions)
145
+ required: true
146
+ check_command: rpm -q python3-devel
147
+ note: Required for compiling webrtcvad (C extension used for silence detection)
148
+
149
+ - name: gcc
150
+ description: C compiler (needed for building Python extensions)
151
+ required: true
152
+ check_command: gcc --version
153
+ note: Required for compiling webrtcvad (C extension used for silence detection)
154
+
155
+ - name: gcc-c++
156
+ description: C++ compiler (needed for building Python extensions)
157
+ required: false
158
+ check_command: g++ --version
159
+ note: Optional - not needed for webrtcvad. Only needed if building other C++ packages from source.
160
+
161
+ - name: alsa-lib-devel
162
+ description: ALSA development files (audio support)
163
+ required: true
164
+ check_command: rpm -q alsa-lib-devel
165
+ note: Required for compiling simpleaudio (C extension used for audio playback)
166
+
167
+ - name: portaudio
168
+ description: PortAudio library (for sounddevice runtime)
169
+ required: true
170
+ check_command: rpm -q portaudio
171
+
172
+ - name: portaudio-devel
173
+ description: PortAudio development files
174
+ required: false
175
+ check_command: rpm -q portaudio-devel
176
+ note: Optional - only needed for building, not runtime
177
+
178
+ - name: pulseaudio
179
+ description: PulseAudio sound server
180
+ required: wsl # Required for WSL, optional for native Linux
181
+ check_command: pulseaudio --version
182
+ note: Essential for WSL2 audio. Usually pre-installed on native Linux desktops.
183
+
184
+ - name: pulseaudio-utils
185
+ description: PulseAudio utilities
186
+ required: wsl # Required for WSL, optional for native Linux
187
+ check_command: rpm -q pulseaudio-utils
188
+ note: Essential for WSL2 audio. Usually pre-installed on native Linux desktops.
189
+
190
+ - name: ffmpeg
191
+ description: Audio/video processing
192
+ required: true
193
+ check_command: ffmpeg -version
194
+ note: May need RPM Fusion repository enabled
195
+
196
+ darwin: # macOS
197
+ packages:
198
+ - name: portaudio
199
+ description: PortAudio library (for sounddevice)
200
+ required: true
201
+ check_command: brew list portaudio
202
+ install_via: homebrew
203
+
204
+ - name: ffmpeg
205
+ description: Audio/video processing
206
+ required: true
207
+ check_command: ffmpeg -version
208
+ install_via: homebrew
209
+
210
+ whisper:
211
+ description: Whisper STT service dependencies
212
+
213
+ debian:
214
+ packages:
215
+ - name: cmake
216
+ description: Build system (needed for compiling whisper.cpp)
217
+ required: true
218
+ min_version: "3.10"
219
+ check_command: cmake --version
220
+
221
+ - name: gcc
222
+ description: C compiler
223
+ required: true
224
+ min_version: "9.0"
225
+ check_command: gcc --version
226
+
227
+ - name: g++
228
+ description: C++ compiler
229
+ required: true
230
+ min_version: "9.0"
231
+ check_command: g++ --version
232
+
233
+ - name: make
234
+ description: Build tool
235
+ required: true
236
+ check_command: make --version
237
+
238
+ - name: portaudio19-dev
239
+ description: Audio I/O library (for real-time transcription)
240
+ required: true
241
+ check_command: pkg-config --exists portaudio-2.0
242
+
243
+ - name: libasound2-dev
244
+ description: Advanced Linux Sound Architecture
245
+ required: true
246
+ check_command: pkg-config --exists alsa
247
+
248
+ fedora:
249
+ packages:
250
+ - name: cmake
251
+ description: Build system (needed for compiling whisper.cpp)
252
+ required: true
253
+ min_version: "3.10"
254
+ check_command: cmake --version
255
+
256
+ - name: gcc
257
+ description: C compiler
258
+ required: true
259
+ min_version: "9.0"
260
+ check_command: gcc --version
261
+
262
+ - name: gcc-c++
263
+ description: C++ compiler
264
+ required: true
265
+ min_version: "9.0"
266
+ check_command: g++ --version
267
+
268
+ - name: make
269
+ description: Build tool
270
+ required: true
271
+ check_command: make --version
272
+
273
+ - name: portaudio-devel
274
+ description: Audio I/O library (for real-time transcription)
275
+ required: true
276
+ check_command: pkg-config --exists portaudio-2.0
277
+
278
+ - name: alsa-lib-devel
279
+ description: Advanced Linux Sound Architecture
280
+ required: true
281
+ check_command: pkg-config --exists alsa
282
+
283
+ darwin:
284
+ packages:
285
+ - name: cmake
286
+ description: Build system
287
+ required: true
288
+ check_command: cmake --version
289
+ install_via: homebrew
290
+
291
+ - name: portaudio
292
+ description: Audio I/O library
293
+ required: true
294
+ check_command: brew list portaudio
295
+ install_via: homebrew
296
+
297
+ kokoro:
298
+ description: Kokoro TTS service dependencies
299
+
300
+ common: # All platforms
301
+ packages:
302
+ - name: git
303
+ description: Version control system (needed to clone kokoro repository)
304
+ required: true
305
+ check_command: git --version
306
+ note: Required for installing Kokoro from GitHub repository
307
+
308
+ debian:
309
+ packages:
310
+ - name: cargo
311
+ description: Rust package manager (needed for building sudachipy on ARM)
312
+ required: false # Only on ARM64, not x86_64
313
+ check_command: cargo --version
314
+ note: Only required for ARM64 architecture
315
+
316
+ - name: rustc
317
+ description: Rust compiler (needed for building sudachipy on ARM)
318
+ required: false # Only on ARM64, not x86_64
319
+ check_command: rustc --version
320
+ note: Only required for ARM64 architecture
321
+
322
+ fedora:
323
+ packages:
324
+ - name: cargo
325
+ description: Rust package manager (needed for building sudachipy)
326
+ required: true
327
+ check_command: cargo --version
328
+ note: Required for building sudachipy dependency
329
+
330
+ - name: rust
331
+ description: Rust compiler
332
+ required: true
333
+ check_command: rustc --version
334
+ note: Required for building sudachipy dependency
335
+
336
+ darwin:
337
+ packages:
338
+ - name: rust
339
+ description: Rust compiler (if needed for building dependencies)
340
+ required: false
341
+ check_command: rustc --version
342
+ install_via: homebrew or rustup
343
+ note: kokoro-fastapi handles most deps via UV
344
+
345
+ livekit:
346
+ description: LiveKit server dependencies (optional)
347
+
348
+ common:
349
+ note: LiveKit server is distributed as a single binary, no system dependencies required
350
+ packages: []
351
+
352
+ # Notes:
353
+ # - macOS typically uses Homebrew for all packages
354
+ # - Linux distributions may need additional repositories (e.g., RPM Fusion for Fedora ffmpeg)
355
+ # - ARM64 systems may need Rust for building certain Python packages from source
356
+ # - WSL requires PulseAudio to be running for audio support
357
+ # - webrtcvad (C extension for silence detection) MUST be compiled during installation on all platforms
358
+ # This requires gcc/g++, python3-dev/python3-devel to be installed before running 'uv tool install voice-mode'
359
+ # - Most other Python packages (numpy, scipy, sounddevice, etc.) have pre-built wheels for x86_64