voice-mode 4.3.1__py3-none-any.whl → 4.4.0__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 (70) hide show
  1. voice_mode/__version__.py +1 -1
  2. voice_mode/cli.py +3 -2
  3. voice_mode/cli_commands/claude.py +6 -199
  4. voice_mode/cli_commands/hook.py +13 -16
  5. voice_mode/frontend/.next/BUILD_ID +1 -1
  6. voice_mode/frontend/.next/app-build-manifest.json +5 -5
  7. voice_mode/frontend/.next/build-manifest.json +3 -3
  8. voice_mode/frontend/.next/next-minimal-server.js.nft.json +1 -1
  9. voice_mode/frontend/.next/next-server.js.nft.json +1 -1
  10. voice_mode/frontend/.next/prerender-manifest.json +1 -1
  11. voice_mode/frontend/.next/required-server-files.json +1 -1
  12. voice_mode/frontend/.next/server/app/_not-found/page.js +1 -1
  13. voice_mode/frontend/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. voice_mode/frontend/.next/server/app/_not-found.html +1 -1
  15. voice_mode/frontend/.next/server/app/_not-found.rsc +1 -1
  16. voice_mode/frontend/.next/server/app/api/connection-details/route.js +2 -2
  17. voice_mode/frontend/.next/server/app/favicon.ico/route.js +2 -2
  18. voice_mode/frontend/.next/server/app/index.html +1 -1
  19. voice_mode/frontend/.next/server/app/index.rsc +2 -2
  20. voice_mode/frontend/.next/server/app/page.js +3 -3
  21. voice_mode/frontend/.next/server/app/page_client-reference-manifest.js +1 -1
  22. voice_mode/frontend/.next/server/chunks/994.js +1 -1
  23. voice_mode/frontend/.next/server/middleware-build-manifest.js +1 -1
  24. voice_mode/frontend/.next/server/next-font-manifest.js +1 -1
  25. voice_mode/frontend/.next/server/next-font-manifest.json +1 -1
  26. voice_mode/frontend/.next/server/pages/404.html +1 -1
  27. voice_mode/frontend/.next/server/pages/500.html +1 -1
  28. voice_mode/frontend/.next/server/server-reference-manifest.json +1 -1
  29. voice_mode/frontend/.next/standalone/.next/BUILD_ID +1 -1
  30. voice_mode/frontend/.next/standalone/.next/app-build-manifest.json +5 -5
  31. voice_mode/frontend/.next/standalone/.next/build-manifest.json +3 -3
  32. voice_mode/frontend/.next/standalone/.next/prerender-manifest.json +1 -1
  33. voice_mode/frontend/.next/standalone/.next/required-server-files.json +1 -1
  34. voice_mode/frontend/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  35. voice_mode/frontend/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  36. voice_mode/frontend/.next/standalone/.next/server/app/_not-found.html +1 -1
  37. voice_mode/frontend/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  38. voice_mode/frontend/.next/standalone/.next/server/app/api/connection-details/route.js +2 -2
  39. voice_mode/frontend/.next/standalone/.next/server/app/favicon.ico/route.js +2 -2
  40. voice_mode/frontend/.next/standalone/.next/server/app/index.html +1 -1
  41. voice_mode/frontend/.next/standalone/.next/server/app/index.rsc +2 -2
  42. voice_mode/frontend/.next/standalone/.next/server/app/page.js +3 -3
  43. voice_mode/frontend/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  44. voice_mode/frontend/.next/standalone/.next/server/chunks/994.js +1 -1
  45. voice_mode/frontend/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  46. voice_mode/frontend/.next/standalone/.next/server/next-font-manifest.js +1 -1
  47. voice_mode/frontend/.next/standalone/.next/server/next-font-manifest.json +1 -1
  48. voice_mode/frontend/.next/standalone/.next/server/pages/404.html +1 -1
  49. voice_mode/frontend/.next/standalone/.next/server/pages/500.html +1 -1
  50. voice_mode/frontend/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  51. voice_mode/frontend/.next/standalone/server.js +1 -1
  52. voice_mode/frontend/.next/static/chunks/app/{layout-b52135f331b36caf.js → layout-917e8410913fe899.js} +1 -1
  53. voice_mode/frontend/.next/static/chunks/app/{page-43b7b45e01f0aa87.js → page-ae0d14863ed895ea.js} +1 -1
  54. voice_mode/frontend/.next/static/chunks/{main-app-80dc9078926fc708.js → main-app-836e76fc70b52220.js} +1 -1
  55. voice_mode/frontend/.next/trace +43 -43
  56. voice_mode/frontend/.next/types/app/api/connection-details/route.ts +1 -1
  57. voice_mode/frontend/.next/types/app/layout.ts +1 -1
  58. voice_mode/frontend/.next/types/app/page.ts +1 -1
  59. voice_mode/frontend/package-lock.json +9 -9
  60. voice_mode/statistics_tracking.py +42 -0
  61. voice_mode/tools/__init__.py +41 -15
  62. voice_mode/tools/converse.py +1 -1
  63. voice_mode/tools/statistics.py +0 -33
  64. {voice_mode-4.3.1.dist-info → voice_mode-4.4.0.dist-info}/METADATA +33 -40
  65. {voice_mode-4.3.1.dist-info → voice_mode-4.4.0.dist-info}/RECORD +69 -69
  66. voice_mode/tools/claude_thinking.py +0 -285
  67. /voice_mode/frontend/.next/static/{uZHYPdRYOObTZ3MQHekp0 → WhZriRkBKVNPSmCnOFRav}/_buildManifest.js +0 -0
  68. /voice_mode/frontend/.next/static/{uZHYPdRYOObTZ3MQHekp0 → WhZriRkBKVNPSmCnOFRav}/_ssgManifest.js +0 -0
  69. {voice_mode-4.3.1.dist-info → voice_mode-4.4.0.dist-info}/WHEEL +0 -0
  70. {voice_mode-4.3.1.dist-info → voice_mode-4.4.0.dist-info}/entry_points.txt +0 -0
@@ -1,4 +1,4 @@
1
- // File: /tmp/build-via-sdist-0f2fyb71/voice_mode-4.3.1/voice_mode/frontend/app/api/connection-details/route.ts
1
+ // File: /tmp/build-via-sdist-z_iazuah/voice_mode-4.4.0/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-0f2fyb71/voice_mode-4.3.1/voice_mode/frontend/app/layout.tsx
1
+ // File: /tmp/build-via-sdist-z_iazuah/voice_mode-4.4.0/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-0f2fyb71/voice_mode-4.3.1/voice_mode/frontend/app/page.tsx
1
+ // File: /tmp/build-via-sdist-z_iazuah/voice_mode-4.4.0/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
 
@@ -1489,9 +1489,9 @@
1489
1489
  }
1490
1490
  },
1491
1491
  "node_modules/caniuse-lite": {
1492
- "version": "1.0.30001739",
1493
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz",
1494
- "integrity": "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==",
1492
+ "version": "1.0.30001741",
1493
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz",
1494
+ "integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==",
1495
1495
  "dev": true,
1496
1496
  "funding": [
1497
1497
  {
@@ -1774,9 +1774,9 @@
1774
1774
  "license": "MIT"
1775
1775
  },
1776
1776
  "node_modules/electron-to-chromium": {
1777
- "version": "1.5.212",
1778
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.212.tgz",
1779
- "integrity": "sha512-gE7ErIzSW+d8jALWMcOIgf+IB6lpfsg6NwOhPVwKzDtN2qcBix47vlin4yzSregYDxTCXOUqAZjVY/Z3naS7ww==",
1777
+ "version": "1.5.215",
1778
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.215.tgz",
1779
+ "integrity": "sha512-TIvGp57UpeNetj/wV/xpFNpWGb0b/ROw372lHPx5Aafx02gjTBtWnEEcaSX3W2dLM3OSdGGyHX/cHl01JQsLaQ==",
1780
1780
  "dev": true,
1781
1781
  "license": "ISC"
1782
1782
  },
@@ -3799,9 +3799,9 @@
3799
3799
  }
3800
3800
  },
3801
3801
  "node_modules/node-releases": {
3802
- "version": "2.0.19",
3803
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
3804
- "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
3802
+ "version": "2.0.20",
3803
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.20.tgz",
3804
+ "integrity": "sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA==",
3805
3805
  "dev": true,
3806
3806
  "license": "MIT"
3807
3807
  },
@@ -0,0 +1,42 @@
1
+ """Statistics tracking functions used by voice tools.
2
+
3
+ This module contains tracking functions that can be imported by tools
4
+ without causing the statistics tools themselves to be loaded.
5
+ """
6
+
7
+ from typing import Optional
8
+ from .statistics import track_conversation
9
+ from .config import logger
10
+
11
+
12
+ def track_voice_interaction(message: str,
13
+ response: str,
14
+ timing_str: Optional[str] = None,
15
+ transport: Optional[str] = None,
16
+ voice_provider: Optional[str] = None,
17
+ voice_name: Optional[str] = None,
18
+ model: Optional[str] = None,
19
+ success: bool = True,
20
+ error_message: Optional[str] = None) -> None:
21
+ """
22
+ Track a voice interaction for statistics.
23
+
24
+ This function should be called from conversation tools to record metrics.
25
+ """
26
+ try:
27
+ track_conversation(
28
+ message=message,
29
+ response=response,
30
+ timing_str=timing_str,
31
+ transport=transport,
32
+ voice_provider=voice_provider,
33
+ voice_name=voice_name,
34
+ model=model,
35
+ success=success,
36
+ error_message=error_message
37
+ )
38
+ logger.debug(f"Tracked voice interaction: {len(message)} chars, success={success}")
39
+
40
+ except Exception as e:
41
+ logger.error(f"Error tracking voice interaction: {e}")
42
+ # Don't raise the error - statistics tracking shouldn't break the main flow
@@ -2,23 +2,49 @@
2
2
  import os
3
3
  import importlib
4
4
  from pathlib import Path
5
+ import logging
6
+
7
+ logger = logging.getLogger("voice-mode")
5
8
 
6
9
  # Get the directory containing this file
7
10
  tools_dir = Path(__file__).parent
8
11
 
9
- # Import all Python files in this directory (except __init__.py)
10
- for file in tools_dir.glob("*.py"):
11
- if file.name != "__init__.py" and not file.name.startswith("_"):
12
- module_name = file.stem
13
- importlib.import_module(f".{module_name}", package=__name__)
12
+ # Check if we should only load specific tools
13
+ # This can be set in .voicemode.env, shell environment, or .mcp.json
14
+ allowed_tools = os.environ.get("VOICEMODE_TOOLS", "").strip()
15
+
16
+ if allowed_tools:
17
+ # Only load specified tools (comma-separated list)
18
+ tool_list = [t.strip() for t in allowed_tools.split(",")]
19
+
20
+ logger.info(f"Selective tool loading enabled. Loading only: {', '.join(tool_list)}")
21
+
22
+ for tool_name in tool_list:
23
+ tool_file = tools_dir / f"{tool_name}.py"
24
+ if tool_file.exists():
25
+ logger.debug(f"Loading tool: {tool_name}")
26
+ importlib.import_module(f".{tool_name}", package=__name__)
27
+ else:
28
+ logger.warning(f"Tool module not found: {tool_name}.py")
29
+ else:
30
+ # Default behavior: load all tools
31
+ logger.info("Loading all available tools (set VOICEMODE_TOOLS to limit)")
32
+
33
+ # Import all Python files in this directory (except __init__.py)
34
+ for file in tools_dir.glob("*.py"):
35
+ if file.name != "__init__.py" and not file.name.startswith("_"):
36
+ module_name = file.stem
37
+ logger.debug(f"Loading tool: {module_name}")
38
+ importlib.import_module(f".{module_name}", package=__name__)
14
39
 
15
- # Import all service tools from subdirectories
16
- services_dir = tools_dir / "services"
17
- if services_dir.exists():
18
- for service_dir in services_dir.iterdir():
19
- if service_dir.is_dir() and not service_dir.name.startswith("_"):
20
- # Import all Python files in each service directory
21
- for file in service_dir.glob("*.py"):
22
- if file.name != "__init__.py" and not file.name.startswith("_") and file.name != "helpers.py":
23
- module_path = f".services.{service_dir.name}.{file.stem}"
24
- importlib.import_module(module_path, package=__name__)
40
+ # Import all service tools from subdirectories
41
+ services_dir = tools_dir / "services"
42
+ if services_dir.exists():
43
+ for service_dir in services_dir.iterdir():
44
+ if service_dir.is_dir() and not service_dir.name.startswith("_"):
45
+ # Import all Python files in each service directory
46
+ for file in service_dir.glob("*.py"):
47
+ if file.name != "__init__.py" and not file.name.startswith("_") and file.name != "helpers.py":
48
+ module_path = f".services.{service_dir.name}.{file.stem}"
49
+ logger.debug(f"Loading service tool: {module_path}")
50
+ importlib.import_module(module_path, package=__name__)
@@ -75,7 +75,7 @@ from voice_mode.core import (
75
75
  play_chime_start,
76
76
  play_chime_end
77
77
  )
78
- from voice_mode.tools.statistics import track_voice_interaction
78
+ from voice_mode.statistics_tracking import track_voice_interaction
79
79
  from voice_mode.utils import (
80
80
  get_event_logger,
81
81
  log_recording_start,
@@ -218,36 +218,3 @@ async def voice_statistics_recent(limit: int = 10) -> str:
218
218
  logger.error(f"Error showing recent statistics: {e}")
219
219
  return f"Error showing recent statistics: {str(e)}"
220
220
 
221
-
222
- # Integration function for conversation tools
223
- def track_voice_interaction(message: str,
224
- response: str,
225
- timing_str: Optional[str] = None,
226
- transport: Optional[str] = None,
227
- voice_provider: Optional[str] = None,
228
- voice_name: Optional[str] = None,
229
- model: Optional[str] = None,
230
- success: bool = True,
231
- error_message: Optional[str] = None) -> None:
232
- """
233
- Track a voice interaction for statistics.
234
-
235
- This function should be called from conversation tools to record metrics.
236
- """
237
- try:
238
- track_conversation(
239
- message=message,
240
- response=response,
241
- timing_str=timing_str,
242
- transport=transport,
243
- voice_provider=voice_provider,
244
- voice_name=voice_name,
245
- model=model,
246
- success=success,
247
- error_message=error_message
248
- )
249
- logger.debug(f"Tracked voice interaction: {len(message)} chars, success={success}")
250
-
251
- except Exception as e:
252
- logger.error(f"Error tracking voice interaction: {e}")
253
- # Don't raise the error - statistics tracking shouldn't break the main flow
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voice-mode
3
- Version: 4.3.1
3
+ Version: 4.4.0
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
@@ -33,6 +33,7 @@ Requires-Dist: numpy
33
33
  Requires-Dist: openai>=1.0.0
34
34
  Requires-Dist: psutil>=5.9.0
35
35
  Requires-Dist: pydub
36
+ Requires-Dist: pyyaml>=6.0.0
36
37
  Requires-Dist: scipy
37
38
  Requires-Dist: setuptools
38
39
  Requires-Dist: simpleaudio
@@ -77,6 +78,8 @@ Description-Content-Type: text/markdown
77
78
 
78
79
  # Voice Mode
79
80
 
81
+ mcp-name: com.failmode/voicemode
82
+
80
83
  > **Install via:** `uvx voice-mode` | `pip install voice-mode` | [getvoicemode.com](https://getvoicemode.com)
81
84
 
82
85
  [![PyPI Downloads](https://static.pepy.tech/badge/voice-mode)](https://pepy.tech/project/voice-mode)
@@ -112,7 +115,7 @@ Natural voice conversations for AI assistants. Voice Mode brings human-like voic
112
115
 
113
116
  ## Quick Start
114
117
 
115
- > 📖 **Using a different tool?** See our [Integration Guides](docs/integrations/README.md) for Cursor, VS Code, Gemini CLI, and more!
118
+ > 📖 **Using a different tool?** See our [Getting Started Guide](docs/tutorials/getting-started.md) for setup instructions!
116
119
 
117
120
  ### Automatic Installation (Recommended)
118
121
 
@@ -139,7 +142,7 @@ This installer will:
139
142
 
140
143
  ### Manual Installation
141
144
 
142
- For manual setup steps, see the [Claude Code Integration Guide](docs/integrations/claude-code/README.md).
145
+ For manual setup steps, see the [Getting Started Guide](docs/tutorials/getting-started.md).
143
146
 
144
147
  ## 🎬 Demo
145
148
 
@@ -179,16 +182,16 @@ The `converse` function makes voice interactions natural - it automatically wait
179
182
 
180
183
  Voice Mode works with your favorite AI coding assistants:
181
184
 
182
- - 🤖 **[Claude Code](docs/integrations/claude-code/README.md)** - Anthropic's official CLI
183
- - 🖥️ **[Claude Desktop](docs/integrations/claude-desktop/README.md)** - Desktop application
184
- - 🌟 **[Gemini CLI](docs/integrations/gemini-cli/README.md)** - Google's CLI tool
185
- - ⚡ **[Cursor](docs/integrations/cursor/README.md)** - AI-first code editor
186
- - 💻 **[VS Code](docs/integrations/vscode/README.md)** - With MCP preview support
187
- - 🦘 **[Roo Code](docs/integrations/roo-code/README.md)** - AI dev team in VS Code
188
- - 🔧 **[Cline](docs/integrations/cline/README.md)** - Autonomous coding agent
189
- - ⚡ **[Zed](docs/integrations/zed/README.md)** - High-performance editor
190
- - 🏄 **[Windsurf](docs/integrations/windsurf/README.md)** - Agentic IDE by Codeium
191
- - 🔄 **[Continue](docs/integrations/continue/README.md)** - Open-source AI assistant
185
+ - 🤖 **Claude Code** - Anthropic's official CLI
186
+ - 🖥️ **Claude Desktop** - Desktop application
187
+ - 🌟 **Gemini CLI** - Google's CLI tool
188
+ - ⚡ **Cursor** - AI-first code editor
189
+ - 💻 **VS Code** - With MCP preview support
190
+ - 🦘 **Roo Code** - AI dev team in VS Code
191
+ - 🔧 **Cline** - Autonomous coding agent
192
+ - ⚡ **Zed** - High-performance editor
193
+ - 🏄 **Windsurf** - Agentic IDE by Codeium
194
+ - 🔄 **Continue** - Open-source AI assistant
192
195
 
193
196
  ## Installation
194
197
 
@@ -207,7 +210,7 @@ sudo apt update
207
210
  sudo apt install -y python3-dev libasound2-dev libasound2-plugins libportaudio2 portaudio19-dev ffmpeg pulseaudio pulseaudio-utils
208
211
  ```
209
212
 
210
- **Note for WSL2 users**: WSL2 requires additional audio packages (pulseaudio, libasound2-plugins) for microphone access. See our [WSL2 Microphone Access Guide](docs/troubleshooting/wsl2-microphone-access.md) if you encounter issues.
213
+ **Note for WSL2 users**: WSL2 requires additional audio packages (pulseaudio, libasound2-plugins) for microphone access.
211
214
  </details>
212
215
 
213
216
  <details>
@@ -270,7 +273,7 @@ nix run github:mbailey/voicemode
270
273
 
271
274
  ### Configuration for AI Coding Assistants
272
275
 
273
- > 📖 **Looking for detailed setup instructions?** Check our comprehensive [Integration Guides](docs/integrations/README.md) for step-by-step instructions for each tool!
276
+ > 📖 **Looking for detailed setup instructions?** Check our comprehensive [Getting Started Guide](docs/tutorials/getting-started.md) for step-by-step instructions!
274
277
 
275
278
  Below are quick configuration snippets. For full installation and setup instructions, see the integration guides above.
276
279
 
@@ -548,12 +551,12 @@ nix run github:mbailey/voicemode
548
551
 
549
552
  **Note:** The `converse` tool is the primary interface for voice interactions, combining speaking and listening in a natural flow.
550
553
 
551
- **New:** The `install_whisper_cpp` and `install_kokoro_fastapi` tools help you set up free, private, open-source voice services locally. See [Installation Tools Documentation](docs/installation-tools.md) for detailed usage.
554
+ **New:** The `install_whisper_cpp` and `install_kokoro_fastapi` tools help you set up free, private, open-source voice services locally.
552
555
 
553
556
  ## Configuration
554
557
 
555
- - 📖 **[Integration Guides](docs/integrations/README.md)** - Step-by-step setup for each tool
556
- - 🔧 **[Configuration Reference](docs/configuration.md)** - All environment variables
558
+ - 📖 **[Getting Started](docs/tutorials/getting-started.md)** - Step-by-step setup guide
559
+ - 🔧 **[Configuration Reference](docs/guides/configuration.md)** - All environment variables
557
560
  - 📁 **[Config Examples](config-examples/)** - Ready-to-use configuration files
558
561
 
559
562
  ### Quick Setup
@@ -615,8 +618,8 @@ The audio format is automatically validated against provider capabilities and wi
615
618
 
616
619
  For privacy-focused or offline usage, Voice Mode supports local speech services:
617
620
 
618
- - **[Whisper.cpp](docs/whisper.cpp.md)** - Local speech-to-text with OpenAI-compatible API
619
- - **[Kokoro](docs/kokoro.md)** - Local text-to-speech with multiple voice options
621
+ - **[Whisper.cpp](docs/guides/whisper-setup.md)** - Local speech-to-text with OpenAI-compatible API
622
+ - **[Kokoro](docs/guides/kokoro-setup.md)** - Local text-to-speech with multiple voice options
620
623
 
621
624
  These services provide the same API interface as OpenAI, allowing seamless switching between cloud and local processing.
622
625
 
@@ -662,7 +665,7 @@ The OpenAI SDK handles this automatically - no Voice Mode configuration needed!
662
665
  ### Common Issues
663
666
 
664
667
  - **No microphone access**: Check system permissions for terminal/application
665
- - **WSL2 Users**: See [WSL2 Microphone Access Guide](docs/troubleshooting/wsl2-microphone-access.md)
668
+ - **WSL2 Users**: Additional audio packages (pulseaudio, libasound2-plugins) required for microphone access
666
669
  - **UV not found**: Install with `curl -LsSf https://astral.sh/uv/install.sh | sh`
667
670
  - **OpenAI API error**: Verify your `OPENAI_API_KEY` is set correctly
668
671
  - **No audio output**: Check system audio settings and available devices
@@ -702,24 +705,17 @@ Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the f
702
705
  📚 **[Read the full documentation at voice-mode.readthedocs.io](https://voice-mode.readthedocs.io)**
703
706
 
704
707
  ### Getting Started
705
- - **[Integration Guides](docs/integrations/README.md)** - Step-by-step setup for all supported tools
706
- - **[Configuration Guide](docs/configuration.md)** - Complete environment variable reference
708
+ - **[Getting Started](docs/tutorials/getting-started.md)** - Step-by-step setup for all supported tools
709
+ - **[Configuration Guide](docs/guides/configuration.md)** - Complete environment variable reference
707
710
 
708
711
  ### Development
709
- - **[Using uv/uvx](docs/uv.md)** - Package management with uv and uvx
710
- - **[Local Development](docs/local-development-uvx.md)** - Development setup guide
711
- - **[Audio Formats](docs/audio-format-migration.md)** - Audio format configuration and migration
712
- - **[Statistics Dashboard](docs/statistics-dashboard.md)** - Performance monitoring and metrics
712
+ - **[Development Setup](docs/tutorials/development-setup.md)** - Local development guide
713
713
 
714
714
  ### Service Guides
715
- - **[Whisper.cpp Setup](docs/whisper.cpp.md)** - Local speech-to-text configuration
716
- - **[Kokoro Setup](docs/kokoro.md)** - Local text-to-speech configuration
717
- - **[Service Health Checks](docs/service-health-checks.md)** - Service readiness and health monitoring
718
- - **[LiveKit Integration](docs/livekit/README.md)** - Real-time voice communication
715
+ - **[Whisper.cpp Setup](docs/guides/whisper-setup.md)** - Local speech-to-text configuration
716
+ - **[Kokoro Setup](docs/guides/kokoro-setup.md)** - Local text-to-speech configuration
717
+ - **[LiveKit Integration](docs/guides/livekit-setup.md)** - Real-time voice communication
719
718
 
720
- ### Troubleshooting
721
- - **[WSL2 Microphone Access](docs/troubleshooting/wsl2-microphone-access.md)** - WSL2 audio setup
722
- - **[Migration Guide](docs/migration-guide.md)** - Upgrading from older versions
723
719
 
724
720
  ## Links
725
721
 
@@ -737,15 +733,12 @@ Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the f
737
733
 
738
734
  ## See Also
739
735
 
740
- - 🚀 [Integration Guides](docs/integrations/README.md) - Setup instructions for all supported tools
741
- - 🔧 [Configuration Reference](docs/configuration.md) - Environment variables and options
742
- - 🎤 [Local Services Setup](docs/kokoro.md) - Run TTS/STT locally for privacy
743
- - 🐛 [Troubleshooting](docs/troubleshooting/README.md) - Common issues and solutions
736
+ - 🚀 [Getting Started](docs/tutorials/getting-started.md) - Setup instructions for all supported tools
737
+ - 🔧 [Configuration Reference](docs/guides/configuration.md) - Environment variables and options
738
+ - 🎤 [Local Services Setup](docs/guides/kokoro-setup.md) - Run TTS/STT locally for privacy
744
739
 
745
740
  ## License
746
741
 
747
742
  MIT - A [Failmode](https://failmode.com) Project
748
743
 
749
744
  ---
750
-
751
- <sub>[Project Statistics](docs/project-stats/README.md)</sub>