pyproject.tomlā¢4.87 kB
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "voice-mode"
dynamic = ["version"]
description = "VoiceMode - Voice interaction capabilities for AI assistants (formerly voice-mcp)"
readme = "README.md"
requires-python = ">=3.10"
license = {text = "MIT"}
authors = [
{name = "mbailey", email = "mbailey@example.com"},
]
keywords = ["mcp", "voice", "livekit", "speech", "tts", "stt", "ai", "llm"]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Software Development :: Libraries",
"Topic :: Multimedia :: Sound/Audio :: Speech",
]
dependencies = [
"uv>=0.4.0",
"fastmcp>=2.0.0",
"numpy",
"sounddevice",
"scipy",
"openai>=1.0.0",
"pydub",
"audioop-lts; python_version >= '3.13'",
"simpleaudio",
"httpx",
"psutil>=5.9.0",
"setuptools", # Required for pkg_resources used by webrtcvad
"webrtcvad>=2.0.10",
"livekit>=0.13.1",
"livekit-agents>=0.10.2",
"livekit-plugins-openai>=0.10.1",
"livekit-plugins-silero>=0.6.5",
"click>=8.0.0",
"pyyaml>=6.0.0",
]
[project.optional-dependencies]
coreml = [
"torch>=2.0.0",
"coremltools>=7.0",
"transformers",
"ane-transformers",
]
dev = [
"build>=1.0.0",
"twine>=4.0.0",
"pytest>=7.0.0",
"pytest-asyncio>=0.21.0",
"pytest-cov>=4.0.0",
"pytest-mock>=3.10.0",
]
test = [
"pytest>=7.0.0",
"pytest-asyncio>=0.21.0",
"pytest-cov>=4.1.0",
"pytest-mock>=3.10.0",
"pytest-xdist>=3.5.0", # For parallel testing
"pytest-timeout>=2.2.0", # For test timeouts
"coverage[toml]>=7.4.0",
]
notebooks = [
"gradio>=4.0.0",
"jupyter>=1.0.0",
"notebook>=7.0.0",
"pandas>=2.0.0",
]
scripts = [
"flask>=3.0.0",
]
docs = [
"mkdocs>=1.5.0",
"mkdocs-material[imaging]>=9.0.0",
"pymdown-extensions>=10.0",
"mkdocs-git-revision-date-localized-plugin>=1.2.0",
"mkdocs-minify-plugin>=0.7.0",
"mkdocs-gen-files>=0.5.0",
]
[project.urls]
Homepage = "https://github.com/mbailey/voicemode"
Repository = "https://github.com/mbailey/voicemode"
Issues = "https://github.com/mbailey/voicemode/issues"
[project.scripts]
voice-mode = "voice_mode.cli:voice_mode"
voicemode = "voice_mode.cli:voice_mode"
[tool.hatch.build.targets.wheel]
packages = ["voice_mode"]
include = [
"voice_mode/**/*.py",
"voice_mode/**/*.sh",
"voice_mode/**/*.plist",
"voice_mode/**/*.service",
"voice_mode/templates/**/*",
]
exclude = [
"**/__pycache__",
"**/*.pyc",
"**/*.pyo",
"**/*.pyd",
"**/.DS_Store",
"**/*.log",
"**/node_modules",
"**/.next/cache",
"**/tests",
"**/.env",
"**/.git",
]
[tool.hatch.build.hooks.custom]
path = "build_hooks.py"
[tool.hatch.build.targets.sdist]
include = [
"/voice_mode",
"/README.md",
"/LICENSE",
"/pyproject.toml",
"/CHANGELOG.md",
"/build_hooks.py",
]
exclude = [
"**/__pycache__",
"**/*.pyc",
"**/*.pyo",
"**/*.pyd",
"**/.DS_Store",
"**/*.log",
]
[tool.hatch.version]
path = "voice_mode/__version__.py"
[tool.hatch.metadata]
allow-direct-references = true
[tool.pytest.ini_options]
minversion = "7.0"
testpaths = ["tests"]
python_files = "test_*.py"
python_classes = "Test*"
python_functions = "test_*"
asyncio_mode = "auto"
addopts = [
"-ra",
"--strict-markers",
"--strict-config",
"--ignore=tests/manual",
"--cov=voice_mode",
"--cov-branch",
"--cov-report=term-missing:skip-covered",
"--cov-report=html",
"--cov-report=xml",
]
markers = [
"unit: Unit tests (fast, isolated)",
"integration: Integration tests (may interact with services)",
"slow: Tests that take > 1s",
"manual: Manual tests requiring human interaction",
]
filterwarnings = [
"ignore::DeprecationWarning",
]
[tool.coverage.run]
source = ["voice_mode"]
branch = true
parallel = true
omit = [
"*/tests/*",
"*/test_*.py",
"*/__pycache__/*",
"*/site-packages/*",
"test-env/*",
]
[tool.coverage.report]
exclude_lines = [
"pragma: no cover",
"def __repr__",
"if TYPE_CHECKING:",
"raise NotImplementedError",
"if __name__ == .__main__.:",
"@abstractmethod",
"except ImportError:",
]
precision = 2
skip_covered = true
show_missing = true
[tool.coverage.html]
directory = "htmlcov"
[tool.coverage.xml]
output = "coverage.xml"
[dependency-groups]
dev = [
"pytest>=8.4.2",
"pytest-asyncio>=1.2.0",
"pytest-cov>=7.0.0",
"pytest-mock>=3.15.0",
]