Spaces:
Sleeping
Sleeping
| # Contributing to OmniVoice Studio | |
| Thanks for your interest in improving OmniVoice Studio! This guide covers everything you need to get started. | |
| ## Quick Links | |
| | | | | |
| |---|---| | |
| | π¬ **Chat** | [Discord](https://discord.gg/bzQavDfVV9) | | |
| | π **Bugs** | [GitHub Issues](https://github.com/debpalash/OmniVoice-Studio/issues) | | |
| | π·οΈ **Good First Issues** | [Filtered list](https://github.com/debpalash/OmniVoice-Studio/labels/good%20first%20issue) | | |
| | π **Roadmap** | [README β Roadmap](README.md#roadmap) | | |
| --- | |
| ## Development Setup | |
| ### Prerequisites | |
| - [Git](https://git-scm.com/) | |
| - [Bun](https://bun.sh/) (frontend package manager) | |
| - [uv](https://docs.astral.sh/uv/) (Python environment manager) | |
| - [ffmpeg](https://ffmpeg.org/) (audio/video processing) | |
| - Python 3.10+ (managed automatically by `uv`) | |
| ### Clone & Run | |
| ```bash | |
| git clone https://github.com/debpalash/OmniVoice-Studio.git | |
| cd OmniVoice-Studio | |
| bun install | |
| bun run dev | |
| ``` | |
| This starts both services: | |
| | Service | URL | What it does | | |
| |---------|-----|---| | |
| | **Backend** | `localhost:3900` | FastAPI server β TTS, ASR, diarization, dubbing pipeline | | |
| | **Frontend** | `localhost:3901` | React + Vite UI | | |
| ### Desktop App (Tauri) | |
| ```bash | |
| bun run desktop | |
| ``` | |
| Requires [Rust](https://rustup.rs/) and platform-specific Tauri dependencies β see the [Tauri prerequisites](https://v2.tauri.app/start/prerequisites/). | |
| --- | |
| ## Project Structure | |
| ``` | |
| OmniVoice-Studio/ | |
| βββ backend/ # Python FastAPI server | |
| β βββ api/ # Route handlers | |
| β βββ core/ # Config, prefs, constants | |
| β βββ services/ # TTS engines, ASR, dubbing, audio DSP | |
| β βββ tts_backend.py # β Multi-engine TTS registry | |
| βββ frontend/ # React + Vite | |
| β βββ src/ | |
| β β βββ components/ # UI components | |
| β β βββ hooks/ # Custom React hooks | |
| β β βββ stores/ # Zustand state slices | |
| β β βββ utils/ # Shared utilities | |
| β βββ src-tauri/ # Rust/Tauri desktop shell | |
| βββ deploy/ # Docker, CI configs | |
| βββ docs/ # Screenshots, MCP config | |
| βββ scripts/ # Build & release scripts | |
| ``` | |
| --- | |
| ## How to Contribute | |
| ### Bug Reports | |
| Open an [issue](https://github.com/debpalash/OmniVoice-Studio/issues/new) with: | |
| 1. **What happened** vs **what you expected** | |
| 2. **Steps to reproduce** | |
| 3. **OS, GPU, and Python version** (find in Settings β Logs) | |
| 4. **Error logs** (Settings β Logs β copy relevant lines) | |
| ### Pull Requests | |
| 1. **Fork** the repo and create a branch from `main` | |
| 2. **Keep PRs focused** β one feature or fix per PR | |
| 3. **Run tests** before pushing: | |
| ```bash | |
| # Backend tests | |
| uv run pytest backend/ -x -q | |
| # Frontend build check | |
| cd frontend && npx vite build --mode development | |
| ``` | |
| 4. **Write a clear PR title** β it becomes the squash-merge commit message | |
| 5. **Don't include** local machine stats, file paths, or private system info in PR descriptions | |
| ### Adding a New TTS Engine | |
| OmniVoice's TTS backend is a plugin registry. Adding a new engine takes ~50 lines: | |
| 1. Open `backend/services/tts_backend.py` | |
| 2. Create a class extending `TTSBackend`: | |
| ```python | |
| class MyEngineBackend(TTSBackend): | |
| id = "my-engine" | |
| display_name = "My Engine (description)" | |
| @classmethod | |
| def is_available(cls) -> tuple[bool, str]: | |
| try: | |
| import my_engine # noqa: F401 | |
| return True, "ready" | |
| except ImportError: | |
| return False, "my_engine not installed. pip install my-engine" | |
| @property | |
| def sample_rate(self) -> int: | |
| return 24000 | |
| @property | |
| def supported_languages(self) -> list[str]: | |
| return ["en", "zh"] | |
| def generate(self, text: str, **kw) -> torch.Tensor: | |
| # ... call your engine, return [1, num_samples] tensor | |
| ``` | |
| 3. Register it in `_REGISTRY` at the bottom of the file | |
| 4. That's it β it auto-appears in Settings β TTS Engine | |
| --- | |
| ## Code Style | |
| ### Python (Backend) | |
| - **Formatter**: We don't enforce one globally β match the style of the file you're editing | |
| - **Logging**: Use `logger.warning()` / `logger.error()`, never bare `print()` | |
| - **Exceptions**: Avoid bare `except: pass` β catch specific exceptions | |
| - **Type hints**: Use them for public API functions and class methods | |
| ### JavaScript/React (Frontend) | |
| - **Components**: Functional components with hooks | |
| - **State**: Zustand stores in `src/stores/`, organized by slice | |
| - **CSS**: Vanilla CSS in component-level files β no Tailwind | |
| - **Naming**: `PascalCase` for components, `camelCase` for hooks and utils | |
| ### Rust (Tauri) | |
| - **Format**: `cargo fmt` before committing | |
| - **Modules**: One concern per file (`bootstrap.rs`, `tools.rs`, `config.rs`, `commands.rs`) | |
| --- | |
| ## Commit Messages | |
| Write clear, concise messages. The PR title becomes the squash-merge commit. | |
| ``` | |
| good: fix: prevent CUDA OOM during concurrent transcription + TTS | |
| good: feat: add CosyVoice 3 TTS backend adapter | |
| good: docs: add platform compatibility matrix to README | |
| bad: fixed stuff | |
| bad: update | |
| bad: WIP | |
| ``` | |
| --- | |
| ## Testing | |
| ```bash | |
| # Run all backend tests | |
| uv run pytest backend/ -x -q | |
| # Run a specific test file | |
| uv run pytest backend/tests/test_api.py -x -q | |
| # Frontend build validation (no test suite yet) | |
| cd frontend && npx vite build --mode development | |
| # Tauri shell check (requires Rust) | |
| cd frontend/src-tauri && cargo check | |
| ``` | |
| --- | |
| ## Need Help? | |
| - **Stuck on setup?** Ask in [Discord #help](https://discord.gg/bzQavDfVV9) | |
| - **Not sure where to start?** Check [good first issues](https://github.com/debpalash/OmniVoice-Studio/labels/good%20first%20issue) | |
| - **Want to discuss a big change?** Open a [discussion](https://github.com/debpalash/OmniVoice-Studio/discussions) or Discord thread before coding | |
| Thank you for contributing! ποΈ | |