Files
UmbraAudio/pyproject.toml
B.D. Murphy 26de44feb1 Cluster worker for the UmbraTrans integration
The UmbraAudio side of the cross-machine contract: this node registers
with the UmbraTrans controller, polls for jobs, claims them under a
lease, and writes artifacts back over NFS.

* `umbraaudio/cluster/` - configuration, PostgreSQL access, node
  registration and heartbeat, the job queue, artifact storage and NFS
  mount management.
* `scripts/cluster_worker.py` - the CLI: `worker`, `check-cluster`,
  `register-node`.
* `scripts/backup_system.sh` / `scripts/verify_backup.sh` - whole-system
  backup and integrity verification.
* `.env` - the `UMBRA_CLUSTER__*` settings. `UMBRA_CLUSTER__PG_PASSWORD`
  is deliberately empty; the password comes from the environment, not
  from a committed file.

`k3s-agent.yaml` is NOT committed: it contains a K3s server join token.
It is now gitignored, and the token should be rotated if that file has
ever left this machine.

ruff clean on the whole package.
2026-11-06 17:03:16 -08:00

102 lines
1.9 KiB
TOML

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "umbraaudio"
version = "0.1.0"
description = "Quality-first multi-pass audiobook generation from manuscripts"
readme = "README.md"
license = "MIT"
requires-python = ">=3.11"
authors = [{ name = "UmbraAudio" }]
keywords = ["audiobook", "tts", "text-to-speech", "narration"]
classifiers = [
"Development Status :: 3 - Alpha",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Multimedia :: Sound/Audio :: Speech",
]
dependencies = [
# CLI
"click>=8.1",
"rich>=13.0",
# Database
"aiosqlite>=0.19",
"asyncpg>=0.29",
# Parsers
"ebooklib>=0.18",
"beautifulsoup4>=4.12",
"PyMuPDF>=1.23",
"python-docx>=1.0",
# NLP / Analysis
"booknlp>=1.0",
# LLM clients
"openai>=1.10",
"httpx>=0.25",
# TTS engines
"qwen-tts>=0.1",
"edge-tts>=6.1",
"torch>=2.6",
"torchaudio>=2.6",
# Audio processing
"librosa>=0.10",
"soundfile>=0.12",
"pydub>=0.25",
# Quality metrics
"speechmos>=0.0.1",
"openai-whisper>=20231117",
"speechbrain>=0.5",
# Web review UI
"fastapi>=0.104",
"uvicorn[standard]>=0.24",
"jinja2>=3.1",
"python-multipart>=0.0.6",
# Utilities
"numpy>=1.24",
"pydantic>=2.5",
"pydantic-settings>=2.1",
"psutil>=5.9",
]
[project.optional-dependencies]
dev = [
"pytest>=7.4",
"pytest-asyncio>=0.21",
"pytest-cov>=4.1",
"ruff>=0.1",
"mypy>=1.7",
]
[project.scripts]
umbraaudio = "umbraaudio.cli:main"
[tool.hatch.build.targets.wheel]
packages = ["umbraaudio"]
[tool.ruff]
target-version = "py311"
line-length = 100
[tool.ruff.lint]
select = ["E", "F", "I", "N", "W", "UP", "B", "A", "SIM", "TCH"]
[tool.mypy]
python_version = "3.11"
strict = true
plugins = ["pydantic.mypy"]
[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"