[project] name = "videovoice" version = "1.0.0" description = "AI-powered short video translation with zero-shot voice cloning" readme = "README.md" license = "MIT" requires-python = ">=3.10,<3.13" dependencies = [ "openai>=2.30.0", "requests>=2.33.0", "python-dotenv>=1.2.2", "pydub>=0.25.1", "ffmpeg-python>=0.2.0", "mlx-whisper>=0.4.3", "tqdm>=4.67.3", "fastapi>=0.135.2", "uvicorn[standard]>=0.42.0", "python-multipart>=0.0.22", "yt-dlp>=2026.3.17", "sse-starlette>=3.3.4", "soundfile>=0.13.1", "deep-translator>=1.11.4", "demucs>=4.0.1", "boto3>=1.42.82", "torch==2.6.0", "torchaudio==2.6.0", "slowapi>=0.1.9", "faster-whisper>=1.2.1", "spaces>=0.48.3", "openai-whisper>=20240930", "gradio>=6.12.0", "accelerate>=1.12.0", "transformers>=4.57.3", ] [project.optional-dependencies] # HF Spaces install from requirements-{cbox,omni}.txt and ignore these. # Locally: `uv sync --extra chatterbox` installs the PyPI chatterbox-tts # (we skip-worktree the vendored ./chatterbox/ folder so it doesn't shadow # the PyPI package). `--extra omnivoice` is heavier and optional. chatterbox = ["chatterbox-tts>=0.1.7"] omnivoice = ["omnivoice>=0.1.4"] [tool.uv] # Declare chatterbox and omnivoice extras as mutually exclusive so uv # doesn't try to resolve them into one lockfile view. conflicts = [ [{ extra = "chatterbox" }, { extra = "omnivoice" }], ] override-dependencies = [ # onnxruntime 1.24.x metadata claims py3.10 support but no 3.10 wheels # ship on PyPI — force resolution to the last version that has 3.10 wheels. "onnxruntime<1.24", # chatterbox-tts==0.1.7 pins gradio==6.8.0, but app.py needs >=6.12.0 # for gradio.Server. Override so the extras can coexist in a lockfile; # gradio is only loaded by app.py (HF), so the local chatterbox install # never exercises gradio code. "gradio>=6.12.0", ]