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.
Files changed (65) hide show
  1. voice_mode/__version__.py +1 -1
  2. voice_mode/frontend/.next/BUILD_ID +1 -1
  3. voice_mode/frontend/.next/app-build-manifest.json +5 -5
  4. voice_mode/frontend/.next/build-manifest.json +3 -3
  5. voice_mode/frontend/.next/next-minimal-server.js.nft.json +1 -1
  6. voice_mode/frontend/.next/next-server.js.nft.json +1 -1
  7. voice_mode/frontend/.next/prerender-manifest.json +1 -1
  8. voice_mode/frontend/.next/required-server-files.json +1 -1
  9. voice_mode/frontend/.next/server/app/_not-found/page.js +1 -1
  10. voice_mode/frontend/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. voice_mode/frontend/.next/server/app/_not-found.html +1 -1
  12. voice_mode/frontend/.next/server/app/_not-found.rsc +1 -1
  13. voice_mode/frontend/.next/server/app/api/connection-details/route.js +2 -2
  14. voice_mode/frontend/.next/server/app/favicon.ico/route.js +2 -2
  15. voice_mode/frontend/.next/server/app/index.html +1 -1
  16. voice_mode/frontend/.next/server/app/index.rsc +2 -2
  17. voice_mode/frontend/.next/server/app/page.js +2 -2
  18. voice_mode/frontend/.next/server/app/page_client-reference-manifest.js +1 -1
  19. voice_mode/frontend/.next/server/chunks/994.js +2 -2
  20. voice_mode/frontend/.next/server/middleware-build-manifest.js +1 -1
  21. voice_mode/frontend/.next/server/next-font-manifest.js +1 -1
  22. voice_mode/frontend/.next/server/next-font-manifest.json +1 -1
  23. voice_mode/frontend/.next/server/pages/404.html +1 -1
  24. voice_mode/frontend/.next/server/pages/500.html +1 -1
  25. voice_mode/frontend/.next/server/server-reference-manifest.json +1 -1
  26. voice_mode/frontend/.next/standalone/.next/BUILD_ID +1 -1
  27. voice_mode/frontend/.next/standalone/.next/app-build-manifest.json +5 -5
  28. voice_mode/frontend/.next/standalone/.next/build-manifest.json +3 -3
  29. voice_mode/frontend/.next/standalone/.next/prerender-manifest.json +1 -1
  30. voice_mode/frontend/.next/standalone/.next/required-server-files.json +1 -1
  31. voice_mode/frontend/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  32. voice_mode/frontend/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  33. voice_mode/frontend/.next/standalone/.next/server/app/_not-found.html +1 -1
  34. voice_mode/frontend/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  35. voice_mode/frontend/.next/standalone/.next/server/app/api/connection-details/route.js +2 -2
  36. voice_mode/frontend/.next/standalone/.next/server/app/favicon.ico/route.js +2 -2
  37. voice_mode/frontend/.next/standalone/.next/server/app/index.html +1 -1
  38. voice_mode/frontend/.next/standalone/.next/server/app/index.rsc +2 -2
  39. voice_mode/frontend/.next/standalone/.next/server/app/page.js +2 -2
  40. voice_mode/frontend/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  41. voice_mode/frontend/.next/standalone/.next/server/chunks/994.js +2 -2
  42. voice_mode/frontend/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  43. voice_mode/frontend/.next/standalone/.next/server/next-font-manifest.js +1 -1
  44. voice_mode/frontend/.next/standalone/.next/server/next-font-manifest.json +1 -1
  45. voice_mode/frontend/.next/standalone/.next/server/pages/404.html +1 -1
  46. voice_mode/frontend/.next/standalone/.next/server/pages/500.html +1 -1
  47. voice_mode/frontend/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  48. voice_mode/frontend/.next/standalone/server.js +1 -1
  49. voice_mode/frontend/.next/static/chunks/app/{layout-d124af177c48e1c5.js → layout-0668b54a9a8a3d88.js} +1 -1
  50. voice_mode/frontend/.next/static/chunks/app/{page-ed5ce28c62d0c8ef.js → page-b2295ed8502c5617.js} +1 -1
  51. voice_mode/frontend/.next/static/chunks/main-app-78bb3214ad53942b.js +1 -0
  52. voice_mode/frontend/.next/trace +43 -43
  53. voice_mode/frontend/.next/types/app/api/connection-details/route.ts +1 -1
  54. voice_mode/frontend/.next/types/app/layout.ts +1 -1
  55. voice_mode/frontend/.next/types/app/page.ts +1 -1
  56. voice_mode/frontend/package-lock.json +3 -3
  57. voice_mode/templates/launchd/com.voicemode.whisper.plist +7 -13
  58. voice_mode/tools/services/whisper/install.py +68 -162
  59. {voice_mode-2.33.0.dist-info → voice_mode-2.33.3.dist-info}/METADATA +11 -12
  60. {voice_mode-2.33.0.dist-info → voice_mode-2.33.3.dist-info}/RECORD +64 -64
  61. voice_mode/frontend/.next/static/chunks/main-app-0aa7560603c1f114.js +0 -1
  62. /voice_mode/frontend/.next/static/{dk2w9pXeSUc6w1YbYi6aJ → G6vnbmBPF9PSjWGgrWUux}/_buildManifest.js +0 -0
  63. /voice_mode/frontend/.next/static/{dk2w9pXeSUc6w1YbYi6aJ → G6vnbmBPF9PSjWGgrWUux}/_ssgManifest.js +0 -0
  64. {voice_mode-2.33.0.dist-info → voice_mode-2.33.3.dist-info}/WHEEL +0 -0
  65. {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-wr79qxwc/voice_mode-2.33.0/voice_mode/frontend/app/api/connection-details/route.ts
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-wr79qxwc/voice_mode-2.33.0/voice_mode/frontend/app/layout.tsx
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-wr79qxwc/voice_mode-2.33.0/voice_mode/frontend/app/page.tsx
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.208",
1778
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.208.tgz",
1779
- "integrity": "sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==",
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.0.0 -->
4
- <!-- Last updated: 2025-01-25 -->
5
- <!-- Compatible with: whisper.cpp v1.5.0+ -->
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>{WHISPER_BIN}</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>{WORKING_DIR}</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 for better performance
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.parent / "templates" / "scripts" / "start-whisper-server.sh"
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
- # Fallback to inline script if template not found
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
- plist_content = f"""<?xml version="1.0" encoding="UTF-8"?>
437
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
438
- <plist version="1.0">
439
- <dict>
440
- <key>Label</key>
441
- <string>com.voicemode.whisper</string>
442
- <key>ProgramArguments</key>
443
- <array>
444
- <string>{start_script_path}</string>
445
- </array>
446
- <key>WorkingDirectory</key>
447
- <string>{install_dir}</string>
448
- <key>RunAtLoad</key>
449
- <true/>
450
- <key>KeepAlive</key>
451
- <true/>
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
- "install_path": install_dir,
576
- "model_path": model_path,
577
- "gpu_enabled": use_gpu,
578
- "gpu_type": gpu_type,
579
- "version": current_version,
580
- "performance_info": {
581
- "system": system,
582
- "gpu_acceleration": gpu_type,
583
- "model": model,
584
- "binary_path": main_path if 'main_path' in locals() else os.path.join(install_dir, "main"),
585
- "server_port": 2022,
586
- "server_url": "http://localhost:2022"
587
- },
588
- "systemd_service": service_path,
589
- "systemd_enabled": systemd_enabled,
590
- "start_script": start_script_path,
591
- "message": f"Successfully installed whisper.cpp {current_version} with {gpu_type} support. {systemd_message}{enable_message}{' (' + migration_msg + ')' if migration_msg else ''}"
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
- auto_enable = SERVICE_AUTO_ENABLE
504
+ auto_enable = SERVICE_AUTO_ENABLE
599
505
 
600
506
  if auto_enable:
601
- logger.info("Auto-enable not supported on this platform")
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
- "install_path": install_dir,
607
- "model_path": model_path,
608
- "gpu_enabled": use_gpu,
609
- "gpu_type": gpu_type,
610
- "version": current_version,
611
- "performance_info": {
612
- "system": system,
613
- "gpu_acceleration": gpu_type,
614
- "model": model,
615
- "binary_path": main_path if 'main_path' in locals() else os.path.join(install_dir, "main")
616
- },
617
- "message": f"Successfully installed whisper.cpp {current_version} with {gpu_type} support{enable_message}{' (' + migration_msg + ')' if migration_msg else ''}"
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.0
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: `~/voicemode_audio/` with timestamps in the filename.
695
+ Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the filename.
697
696
 
698
697
  ## Documentation
699
698