voice-mode 2.33.0__py3-none-any.whl → 2.33.3__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.
- voice_mode/__version__.py +1 -1
- voice_mode/frontend/.next/BUILD_ID +1 -1
- voice_mode/frontend/.next/app-build-manifest.json +5 -5
- voice_mode/frontend/.next/build-manifest.json +3 -3
- voice_mode/frontend/.next/next-minimal-server.js.nft.json +1 -1
- voice_mode/frontend/.next/next-server.js.nft.json +1 -1
- voice_mode/frontend/.next/prerender-manifest.json +1 -1
- voice_mode/frontend/.next/required-server-files.json +1 -1
- voice_mode/frontend/.next/server/app/_not-found/page.js +1 -1
- voice_mode/frontend/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- voice_mode/frontend/.next/server/app/_not-found.html +1 -1
- voice_mode/frontend/.next/server/app/_not-found.rsc +1 -1
- voice_mode/frontend/.next/server/app/api/connection-details/route.js +2 -2
- voice_mode/frontend/.next/server/app/favicon.ico/route.js +2 -2
- voice_mode/frontend/.next/server/app/index.html +1 -1
- voice_mode/frontend/.next/server/app/index.rsc +2 -2
- voice_mode/frontend/.next/server/app/page.js +2 -2
- voice_mode/frontend/.next/server/app/page_client-reference-manifest.js +1 -1
- voice_mode/frontend/.next/server/chunks/994.js +2 -2
- voice_mode/frontend/.next/server/middleware-build-manifest.js +1 -1
- voice_mode/frontend/.next/server/next-font-manifest.js +1 -1
- voice_mode/frontend/.next/server/next-font-manifest.json +1 -1
- voice_mode/frontend/.next/server/pages/404.html +1 -1
- voice_mode/frontend/.next/server/pages/500.html +1 -1
- voice_mode/frontend/.next/server/server-reference-manifest.json +1 -1
- voice_mode/frontend/.next/standalone/.next/BUILD_ID +1 -1
- voice_mode/frontend/.next/standalone/.next/app-build-manifest.json +5 -5
- voice_mode/frontend/.next/standalone/.next/build-manifest.json +3 -3
- voice_mode/frontend/.next/standalone/.next/prerender-manifest.json +1 -1
- voice_mode/frontend/.next/standalone/.next/required-server-files.json +1 -1
- voice_mode/frontend/.next/standalone/.next/server/app/_not-found/page.js +1 -1
- voice_mode/frontend/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- voice_mode/frontend/.next/standalone/.next/server/app/_not-found.html +1 -1
- voice_mode/frontend/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- voice_mode/frontend/.next/standalone/.next/server/app/api/connection-details/route.js +2 -2
- voice_mode/frontend/.next/standalone/.next/server/app/favicon.ico/route.js +2 -2
- voice_mode/frontend/.next/standalone/.next/server/app/index.html +1 -1
- voice_mode/frontend/.next/standalone/.next/server/app/index.rsc +2 -2
- voice_mode/frontend/.next/standalone/.next/server/app/page.js +2 -2
- voice_mode/frontend/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- voice_mode/frontend/.next/standalone/.next/server/chunks/994.js +2 -2
- voice_mode/frontend/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- voice_mode/frontend/.next/standalone/.next/server/next-font-manifest.js +1 -1
- voice_mode/frontend/.next/standalone/.next/server/next-font-manifest.json +1 -1
- voice_mode/frontend/.next/standalone/.next/server/pages/404.html +1 -1
- voice_mode/frontend/.next/standalone/.next/server/pages/500.html +1 -1
- voice_mode/frontend/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- voice_mode/frontend/.next/standalone/server.js +1 -1
- voice_mode/frontend/.next/static/chunks/app/{layout-d124af177c48e1c5.js → layout-0668b54a9a8a3d88.js} +1 -1
- voice_mode/frontend/.next/static/chunks/app/{page-ed5ce28c62d0c8ef.js → page-b2295ed8502c5617.js} +1 -1
- voice_mode/frontend/.next/static/chunks/main-app-78bb3214ad53942b.js +1 -0
- voice_mode/frontend/.next/trace +43 -43
- voice_mode/frontend/.next/types/app/api/connection-details/route.ts +1 -1
- voice_mode/frontend/.next/types/app/layout.ts +1 -1
- voice_mode/frontend/.next/types/app/page.ts +1 -1
- voice_mode/frontend/package-lock.json +3 -3
- voice_mode/templates/launchd/com.voicemode.whisper.plist +7 -13
- voice_mode/tools/services/whisper/install.py +68 -162
- {voice_mode-2.33.0.dist-info → voice_mode-2.33.3.dist-info}/METADATA +11 -12
- {voice_mode-2.33.0.dist-info → voice_mode-2.33.3.dist-info}/RECORD +64 -64
- voice_mode/frontend/.next/static/chunks/main-app-0aa7560603c1f114.js +0 -1
- /voice_mode/frontend/.next/static/{dk2w9pXeSUc6w1YbYi6aJ → G6vnbmBPF9PSjWGgrWUux}/_buildManifest.js +0 -0
- /voice_mode/frontend/.next/static/{dk2w9pXeSUc6w1YbYi6aJ → G6vnbmBPF9PSjWGgrWUux}/_ssgManifest.js +0 -0
- {voice_mode-2.33.0.dist-info → voice_mode-2.33.3.dist-info}/WHEEL +0 -0
- {voice_mode-2.33.0.dist-info → voice_mode-2.33.3.dist-info}/entry_points.txt +0 -0
@@ -1,4 +1,4 @@
|
|
1
|
-
// File: /tmp/build-via-sdist-
|
1
|
+
// File: /tmp/build-via-sdist-i1skfj6s/voice_mode-2.33.3/voice_mode/frontend/app/api/connection-details/route.ts
|
2
2
|
import * as entry from '../../../../../app/api/connection-details/route.js'
|
3
3
|
import type { NextRequest } from 'next/server.js'
|
4
4
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// File: /tmp/build-via-sdist-
|
1
|
+
// File: /tmp/build-via-sdist-i1skfj6s/voice_mode-2.33.3/voice_mode/frontend/app/layout.tsx
|
2
2
|
import * as entry from '../../../app/layout.js'
|
3
3
|
import type { ResolvingMetadata, ResolvingViewport } from 'next/dist/lib/metadata/types/metadata-interface.js'
|
4
4
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// File: /tmp/build-via-sdist-
|
1
|
+
// File: /tmp/build-via-sdist-i1skfj6s/voice_mode-2.33.3/voice_mode/frontend/app/page.tsx
|
2
2
|
import * as entry from '../../../app/page.js'
|
3
3
|
import type { ResolvingMetadata, ResolvingViewport } from 'next/dist/lib/metadata/types/metadata-interface.js'
|
4
4
|
|
@@ -1774,9 +1774,9 @@
|
|
1774
1774
|
"license": "MIT"
|
1775
1775
|
},
|
1776
1776
|
"node_modules/electron-to-chromium": {
|
1777
|
-
"version": "1.5.
|
1778
|
-
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.
|
1779
|
-
"integrity": "sha512-
|
1777
|
+
"version": "1.5.209",
|
1778
|
+
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.209.tgz",
|
1779
|
+
"integrity": "sha512-Xoz0uMrim9ZETCQt8UgM5FxQF9+imA7PBpokoGcZloA1uw2LeHzTlip5cb5KOAsXZLjh/moN2vReN3ZjJmjI9A==",
|
1780
1780
|
"dev": true,
|
1781
1781
|
"license": "ISC"
|
1782
1782
|
},
|
@@ -1,32 +1,26 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
2
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
-
<!-- com.voicemode.whisper.plist v1.
|
4
|
-
<!-- Last updated: 2025-
|
5
|
-
<!--
|
3
|
+
<!-- com.voicemode.whisper.plist v1.1.0 -->
|
4
|
+
<!-- Last updated: 2025-08-25 -->
|
5
|
+
<!-- Uses unified startup script for dynamic model selection -->
|
6
6
|
<plist version="1.0">
|
7
7
|
<dict>
|
8
8
|
<key>Label</key>
|
9
9
|
<string>com.voicemode.whisper</string>
|
10
10
|
<key>ProgramArguments</key>
|
11
11
|
<array>
|
12
|
-
<string>{
|
13
|
-
<string>--host</string>
|
14
|
-
<string>0.0.0.0</string>
|
15
|
-
<string>--port</string>
|
16
|
-
<string>{WHISPER_PORT}</string>
|
17
|
-
<string>--model</string>
|
18
|
-
<string>{MODEL_FILE}</string>
|
12
|
+
<string>{START_SCRIPT_PATH}</string>
|
19
13
|
</array>
|
20
14
|
<key>RunAtLoad</key>
|
21
15
|
<true/>
|
22
16
|
<key>KeepAlive</key>
|
23
17
|
<true/>
|
24
18
|
<key>StandardOutPath</key>
|
25
|
-
<string>{LOG_DIR}/whisper.out.log</string>
|
19
|
+
<string>{LOG_DIR}/whisper/whisper.out.log</string>
|
26
20
|
<key>StandardErrorPath</key>
|
27
|
-
<string>{LOG_DIR}/whisper.err.log</string>
|
21
|
+
<string>{LOG_DIR}/whisper/whisper.err.log</string>
|
28
22
|
<key>WorkingDirectory</key>
|
29
|
-
<string>{
|
23
|
+
<string>{INSTALL_DIR}</string>
|
30
24
|
<key>EnvironmentVariables</key>
|
31
25
|
<dict>
|
32
26
|
<key>PATH</key>
|
@@ -219,7 +219,8 @@ async def whisper_install(
|
|
219
219
|
if is_macos:
|
220
220
|
# On macOS, always enable Metal
|
221
221
|
cmake_flags.append("-DGGML_METAL=ON")
|
222
|
-
# On Apple Silicon, also enable Core ML
|
222
|
+
# On Apple Silicon, also enable Core ML support with fallback
|
223
|
+
# This allows using CoreML models if available, but falls back to Metal if not
|
223
224
|
if platform.machine() == "arm64":
|
224
225
|
cmake_flags.append("-DWHISPER_COREML=ON")
|
225
226
|
cmake_flags.append("-DWHISPER_COREML_ALLOW_FALLBACK=ON")
|
@@ -318,7 +319,7 @@ async def whisper_install(
|
|
318
319
|
template_content = None
|
319
320
|
|
320
321
|
# First try to load from source if running in development
|
321
|
-
source_template = Path(__file__).parent.parent.parent
|
322
|
+
source_template = Path(__file__).parent.parent.parent / "templates" / "scripts" / "start-whisper-server.sh"
|
322
323
|
if source_template.exists():
|
323
324
|
logger.info(f"Loading template from source: {source_template}")
|
324
325
|
template_content = source_template.read_text()
|
@@ -331,90 +332,7 @@ async def whisper_install(
|
|
331
332
|
except Exception as e:
|
332
333
|
logger.warning(f"Failed to load template script: {e}. Using fallback inline script.")
|
333
334
|
|
334
|
-
#
|
335
|
-
if template_content is None:
|
336
|
-
template_content = f"""#!/bin/bash
|
337
|
-
|
338
|
-
# Whisper Service Startup Script
|
339
|
-
# This script is used by both macOS (launchd) and Linux (systemd) to start the whisper service
|
340
|
-
# It sources the voicemode.env file to get configuration, especially VOICEMODE_WHISPER_MODEL
|
341
|
-
|
342
|
-
# Determine whisper directory (script is in bin/, whisper root is parent)
|
343
|
-
SCRIPT_DIR="$(cd "$(dirname "${{BASH_SOURCE[0]}}")" && pwd)"
|
344
|
-
WHISPER_DIR="$(dirname "$SCRIPT_DIR")"
|
345
|
-
|
346
|
-
# Voicemode configuration directory
|
347
|
-
VOICEMODE_DIR="$HOME/.voicemode"
|
348
|
-
LOG_DIR="$VOICEMODE_DIR/logs/whisper"
|
349
|
-
|
350
|
-
# Create log directory if it doesn't exist
|
351
|
-
mkdir -p "$LOG_DIR"
|
352
|
-
|
353
|
-
# Log file for this script (separate from whisper server logs)
|
354
|
-
STARTUP_LOG="$LOG_DIR/startup.log"
|
355
|
-
|
356
|
-
# Source voicemode configuration if it exists
|
357
|
-
if [ -f "$VOICEMODE_DIR/voicemode.env" ]; then
|
358
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Sourcing voicemode.env" >> "$STARTUP_LOG"
|
359
|
-
source "$VOICEMODE_DIR/voicemode.env"
|
360
|
-
else
|
361
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Warning: voicemode.env not found" >> "$STARTUP_LOG"
|
362
|
-
fi
|
363
|
-
|
364
|
-
# Model selection with environment variable support
|
365
|
-
MODEL_NAME="${{VOICEMODE_WHISPER_MODEL:-base}}"
|
366
|
-
MODEL_PATH="$WHISPER_DIR/models/ggml-$MODEL_NAME.bin"
|
367
|
-
|
368
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting whisper-server with model: $MODEL_NAME" >> "$STARTUP_LOG"
|
369
|
-
|
370
|
-
# Check if model exists
|
371
|
-
if [ ! -f "$MODEL_PATH" ]; then
|
372
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Error: Model $MODEL_NAME not found at $MODEL_PATH" >> "$STARTUP_LOG"
|
373
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Available models:" >> "$STARTUP_LOG"
|
374
|
-
ls -1 "$WHISPER_DIR/models/" 2>/dev/null | grep "^ggml-.*\\.bin$" >> "$STARTUP_LOG"
|
375
|
-
|
376
|
-
# Try to find any available model as fallback
|
377
|
-
FALLBACK_MODEL=$(ls -1 "$WHISPER_DIR/models/" 2>/dev/null | grep "^ggml-.*\\.bin$" | head -1)
|
378
|
-
if [ -n "$FALLBACK_MODEL" ]; then
|
379
|
-
MODEL_PATH="$WHISPER_DIR/models/$FALLBACK_MODEL"
|
380
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Using fallback model: $FALLBACK_MODEL" >> "$STARTUP_LOG"
|
381
|
-
else
|
382
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Fatal: No whisper models found" >> "$STARTUP_LOG"
|
383
|
-
exit 1
|
384
|
-
fi
|
385
|
-
fi
|
386
|
-
|
387
|
-
# Port configuration (with environment variable support)
|
388
|
-
WHISPER_PORT="${{VOICEMODE_WHISPER_PORT:-2022}}"
|
389
|
-
|
390
|
-
# Determine server binary location
|
391
|
-
# Check new CMake build location first, then legacy location
|
392
|
-
if [ -f "$WHISPER_DIR/build/bin/whisper-server" ]; then
|
393
|
-
SERVER_BIN="$WHISPER_DIR/build/bin/whisper-server"
|
394
|
-
elif [ -f "$WHISPER_DIR/server" ]; then
|
395
|
-
SERVER_BIN="$WHISPER_DIR/server"
|
396
|
-
else
|
397
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Error: whisper-server binary not found" >> "$STARTUP_LOG"
|
398
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Checked: $WHISPER_DIR/build/bin/whisper-server" >> "$STARTUP_LOG"
|
399
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Checked: $WHISPER_DIR/server" >> "$STARTUP_LOG"
|
400
|
-
exit 1
|
401
|
-
fi
|
402
|
-
|
403
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Using binary: $SERVER_BIN" >> "$STARTUP_LOG"
|
404
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Model path: $MODEL_PATH" >> "$STARTUP_LOG"
|
405
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Port: $WHISPER_PORT" >> "$STARTUP_LOG"
|
406
|
-
|
407
|
-
# Start whisper-server
|
408
|
-
# Using exec to replace this script process with whisper-server
|
409
|
-
cd "$WHISPER_DIR"
|
410
|
-
exec "$SERVER_BIN" \\
|
411
|
-
--host 0.0.0.0 \\
|
412
|
-
--port "$WHISPER_PORT" \\
|
413
|
-
--model "$MODEL_PATH" \\
|
414
|
-
--inference-path /v1/audio/transcriptions \\
|
415
|
-
--threads 8
|
416
|
-
"""
|
417
|
-
|
335
|
+
# Create the start script (whether template was loaded from file or created inline)
|
418
336
|
start_script_path = os.path.join(bin_dir, "start-whisper-server.sh")
|
419
337
|
with open(start_script_path, 'w') as f:
|
420
338
|
f.write(template_content)
|
@@ -433,33 +351,22 @@ exec "$SERVER_BIN" \\
|
|
433
351
|
plist_name = "com.voicemode.whisper.plist"
|
434
352
|
plist_path = os.path.join(launchagents_dir, plist_name)
|
435
353
|
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
<key>StandardOutPath</key>
|
453
|
-
<string>{os.path.join(voicemode_dir, 'logs', 'whisper', 'whisper.out.log')}</string>
|
454
|
-
<key>StandardErrorPath</key>
|
455
|
-
<string>{os.path.join(voicemode_dir, 'logs', 'whisper', 'whisper.err.log')}</string>
|
456
|
-
<key>EnvironmentVariables</key>
|
457
|
-
<dict>
|
458
|
-
<key>PATH</key>
|
459
|
-
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin</string>
|
460
|
-
</dict>
|
461
|
-
</dict>
|
462
|
-
</plist>"""
|
354
|
+
# Load plist template
|
355
|
+
# First try to load from source if running in development
|
356
|
+
source_template = Path(__file__).parent.parent.parent / "templates" / "launchd" / "com.voicemode.whisper.plist"
|
357
|
+
if source_template.exists():
|
358
|
+
logger.info(f"Loading plist template from source: {source_template}")
|
359
|
+
plist_content = source_template.read_text()
|
360
|
+
else:
|
361
|
+
# Load from package resources
|
362
|
+
template_resource = files("voice_mode.templates.launchd").joinpath("com.voicemode.whisper.plist")
|
363
|
+
plist_content = template_resource.read_text()
|
364
|
+
logger.info("Loaded plist template from package resources")
|
365
|
+
|
366
|
+
# Replace placeholders
|
367
|
+
plist_content = plist_content.replace("{START_SCRIPT_PATH}", start_script_path)
|
368
|
+
plist_content = plist_content.replace("{LOG_DIR}", os.path.join(voicemode_dir, 'logs'))
|
369
|
+
plist_content = plist_content.replace("{INSTALL_DIR}", install_dir)
|
463
370
|
|
464
371
|
with open(plist_path, 'w') as f:
|
465
372
|
f.write(plist_content)
|
@@ -507,9 +414,8 @@ exec "$SERVER_BIN" \\
|
|
507
414
|
"start_script": start_script_path,
|
508
415
|
"message": f"Successfully installed whisper.cpp {current_version} with {gpu_type} support and whisper-server on port 2022{enable_message}{' (' + migration_msg + ')' if migration_msg else ''}"
|
509
416
|
}
|
510
|
-
|
511
|
-
# Install systemd service on Linux
|
512
417
|
elif system == "Linux":
|
418
|
+
# Install systemd service on Linux
|
513
419
|
logger.info("Installing systemd user service for whisper-server...")
|
514
420
|
systemd_user_dir = os.path.expanduser("~/.config/systemd/user")
|
515
421
|
os.makedirs(systemd_user_dir, exist_ok=True)
|
@@ -522,22 +428,22 @@ exec "$SERVER_BIN" \\
|
|
522
428
|
service_path = os.path.join(systemd_user_dir, service_name)
|
523
429
|
|
524
430
|
service_content = f"""[Unit]
|
525
|
-
Description=Whisper.cpp Speech Recognition Server
|
526
|
-
After=network.target
|
431
|
+
Description=Whisper.cpp Speech Recognition Server
|
432
|
+
After=network.target
|
527
433
|
|
528
|
-
[Service]
|
529
|
-
Type=simple
|
530
|
-
ExecStart={start_script_path}
|
531
|
-
Restart=on-failure
|
532
|
-
RestartSec=10
|
533
|
-
WorkingDirectory={install_dir}
|
534
|
-
StandardOutput=append:{os.path.join(voicemode_dir, 'logs', 'whisper', 'whisper.out.log')}
|
535
|
-
StandardError=append:{os.path.join(voicemode_dir, 'logs', 'whisper', 'whisper.err.log')}
|
536
|
-
Environment="PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/cuda/bin"
|
434
|
+
[Service]
|
435
|
+
Type=simple
|
436
|
+
ExecStart={start_script_path}
|
437
|
+
Restart=on-failure
|
438
|
+
RestartSec=10
|
439
|
+
WorkingDirectory={install_dir}
|
440
|
+
StandardOutput=append:{os.path.join(voicemode_dir, 'logs', 'whisper', 'whisper.out.log')}
|
441
|
+
StandardError=append:{os.path.join(voicemode_dir, 'logs', 'whisper', 'whisper.err.log')}
|
442
|
+
Environment="PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/cuda/bin"
|
537
443
|
|
538
|
-
[Install]
|
539
|
-
WantedBy=default.target
|
540
|
-
"""
|
444
|
+
[Install]
|
445
|
+
WantedBy=default.target
|
446
|
+
"""
|
541
447
|
|
542
448
|
with open(service_path, 'w') as f:
|
543
449
|
f.write(service_content)
|
@@ -572,49 +478,49 @@ WantedBy=default.target
|
|
572
478
|
current_version = get_current_version(Path(install_dir))
|
573
479
|
return {
|
574
480
|
"success": True,
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
481
|
+
"install_path": install_dir,
|
482
|
+
"model_path": model_path,
|
483
|
+
"gpu_enabled": use_gpu,
|
484
|
+
"gpu_type": gpu_type,
|
485
|
+
"version": current_version,
|
486
|
+
"performance_info": {
|
487
|
+
"system": system,
|
488
|
+
"gpu_acceleration": gpu_type,
|
489
|
+
"model": model,
|
490
|
+
"binary_path": main_path if 'main_path' in locals() else os.path.join(install_dir, "main"),
|
491
|
+
"server_port": 2022,
|
492
|
+
"server_url": "http://localhost:2022"
|
493
|
+
},
|
494
|
+
"systemd_service": service_path,
|
495
|
+
"systemd_enabled": systemd_enabled,
|
496
|
+
"start_script": start_script_path,
|
497
|
+
"message": f"Successfully installed whisper.cpp {current_version} with {gpu_type} support. {systemd_message}{enable_message}{' (' + migration_msg + ')' if migration_msg else ''}"
|
592
498
|
}
|
593
|
-
|
499
|
+
|
594
500
|
else:
|
595
501
|
# Handle auto_enable for other systems (if we add Windows support later)
|
596
502
|
enable_message = ""
|
597
503
|
if auto_enable is None:
|
598
|
-
|
504
|
+
auto_enable = SERVICE_AUTO_ENABLE
|
599
505
|
|
600
506
|
if auto_enable:
|
601
|
-
|
507
|
+
logger.info("Auto-enable not supported on this platform")
|
602
508
|
|
603
509
|
current_version = get_current_version(Path(install_dir))
|
604
510
|
return {
|
605
511
|
"success": True,
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
512
|
+
"install_path": install_dir,
|
513
|
+
"model_path": model_path,
|
514
|
+
"gpu_enabled": use_gpu,
|
515
|
+
"gpu_type": gpu_type,
|
516
|
+
"version": current_version,
|
517
|
+
"performance_info": {
|
518
|
+
"system": system,
|
519
|
+
"gpu_acceleration": gpu_type,
|
520
|
+
"model": model,
|
521
|
+
"binary_path": main_path if 'main_path' in locals() else os.path.join(install_dir, "main")
|
522
|
+
},
|
523
|
+
"message": f"Successfully installed whisper.cpp {current_version} with {gpu_type} support{enable_message}{' (' + migration_msg + ')' if migration_msg else ''}"
|
618
524
|
}
|
619
525
|
|
620
526
|
except subprocess.CalledProcessError as e:
|
@@ -631,4 +537,4 @@ WantedBy=default.target
|
|
631
537
|
return {
|
632
538
|
"success": False,
|
633
539
|
"error": str(e)
|
634
|
-
}
|
540
|
+
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: voice-mode
|
3
|
-
Version: 2.33.
|
3
|
+
Version: 2.33.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
|
@@ -116,7 +116,15 @@ Natural voice conversations for AI assistants. Voice Mode brings human-like voic
|
|
116
116
|
Install Claude Code with Voice Mode configured and ready to run on Linux, macOS, and Windows WSL:
|
117
117
|
|
118
118
|
```bash
|
119
|
+
# Download and run the installer
|
119
120
|
curl -O https://getvoicemode.com/install.sh && bash install.sh
|
121
|
+
|
122
|
+
# While local voice services can be installed automatically, we recommend
|
123
|
+
# providing an OpenAI API key as a fallback in case local services are unavailable
|
124
|
+
export OPENAI_API_KEY=your-openai-key # Optional but recommended
|
125
|
+
|
126
|
+
# Start a voice conversation
|
127
|
+
claude /voicemode:converse
|
120
128
|
```
|
121
129
|
|
122
130
|
This installer will:
|
@@ -124,16 +132,7 @@ This installer will:
|
|
124
132
|
- Install Claude Code if not already installed
|
125
133
|
- Configure Voice Mode as an MCP server
|
126
134
|
- Set up your system for voice conversations
|
127
|
-
|
128
|
-
After installation, just run:
|
129
|
-
```bash
|
130
|
-
# With OpenAI API (cloud-based, requires API key)
|
131
|
-
export OPENAI_API_KEY=your-openai-key
|
132
|
-
claude /voicemode:converse
|
133
|
-
|
134
|
-
# Or use free local services (Voice Mode will offer to install them)
|
135
|
-
claude /voicemode:converse
|
136
|
-
```
|
135
|
+
- Offer to install free local STT/TTS services if no API key is provided
|
137
136
|
|
138
137
|
### Manual Installation
|
139
138
|
|
@@ -693,7 +692,7 @@ To save all audio files (both TTS output and STT input):
|
|
693
692
|
export VOICEMODE_SAVE_AUDIO=true
|
694
693
|
```
|
695
694
|
|
696
|
-
Audio files are saved to:
|
695
|
+
Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the filename.
|
697
696
|
|
698
697
|
## Documentation
|
699
698
|
|