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.
- voice_mode_install-1.0.1.dist-info/METADATA +189 -0
- voice_mode_install-1.0.1.dist-info/RECORD +12 -0
- voice_mode_install-1.0.1.dist-info/WHEEL +4 -0
- voice_mode_install-1.0.1.dist-info/entry_points.txt +2 -0
- voicemode_install/__init__.py +3 -0
- voicemode_install/checker.py +191 -0
- voicemode_install/cli.py +297 -0
- voicemode_install/dependencies.yaml +359 -0
- voicemode_install/hardware.py +92 -0
- voicemode_install/installer.py +143 -0
- voicemode_install/logger.py +90 -0
- voicemode_install/system.py +141 -0
voicemode_install/cli.py
ADDED
|
@@ -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
|