mirror of
https://github.com/jamiepine/voicebox.git
synced 2026-09-15 04:40:40 -07:00
435 lines
11 KiB
Markdown
435 lines
11 KiB
Markdown
# Contributing to Voicebox
|
|
|
|
Thank you for your interest in contributing to Voicebox! This document provides guidelines and instructions for contributing.
|
|
|
|
## Code of Conduct
|
|
|
|
- Be respectful and inclusive
|
|
- Welcome newcomers and help them learn
|
|
- Focus on constructive feedback
|
|
- Respect different viewpoints and experiences
|
|
|
|
## Getting Started
|
|
|
|
### Prerequisites
|
|
|
|
- **[Bun](https://bun.sh)** - Fast JavaScript runtime and package manager
|
|
```bash
|
|
curl -fsSL https://bun.sh/install | bash
|
|
```
|
|
|
|
- **[Python 3.11+](https://python.org)** - For backend development
|
|
```bash
|
|
python --version # Should be 3.11 or higher
|
|
```
|
|
|
|
- **[Rust](https://rustup.rs)** - For Tauri desktop app (installed automatically by Tauri CLI)
|
|
```bash
|
|
rustc --version # Check if installed
|
|
```
|
|
- **[Tauri Prerequisites](https://v2.tauri.app/start/prerequisites)** - Tauri-specific system dependencies (varies by OS).
|
|
|
|
- **Git** - Version control
|
|
|
|
### Development Setup
|
|
|
|
**Using the Makefile (recommended for macOS/Linux):** Run `make setup` to install all dependencies, then `make dev` to start development servers. See `make help` for all available commands.
|
|
|
|
**Manual setup (required for Windows):**
|
|
|
|
1. **Fork and clone the repository**
|
|
```bash
|
|
git clone https://github.com/YOUR_USERNAME/voicebox.git
|
|
cd voicebox
|
|
```
|
|
|
|
2. **Install JavaScript dependencies**
|
|
```bash
|
|
bun install
|
|
```
|
|
This installs dependencies for:
|
|
- `app/` - Shared React frontend
|
|
- `tauri/` - Tauri desktop wrapper
|
|
- `web/` - Web deployment wrapper
|
|
|
|
3. **Set up Python backend**
|
|
```bash
|
|
cd backend
|
|
|
|
# Create virtual environment
|
|
python -m venv venv
|
|
|
|
# Activate virtual environment
|
|
source venv/bin/activate # On macOS/Linux
|
|
# or
|
|
venv\Scripts\activate # On Windows
|
|
|
|
# Install Python dependencies
|
|
pip install -r requirements.txt
|
|
|
|
# Install MLX dependencies (Apple Silicon only - for faster inference)
|
|
# On Apple Silicon, this enables native Metal acceleration
|
|
if [[ $(uname -m) == "arm64" ]]; then
|
|
pip install -r requirements-mlx.txt
|
|
fi
|
|
|
|
# Install Qwen3-TTS (required for voice synthesis)
|
|
pip install git+https://github.com/QwenLM/Qwen3-TTS.git
|
|
```
|
|
|
|
4. **Start development servers**
|
|
|
|
Development requires two terminals: one for the Python backend, one for the Tauri app.
|
|
|
|
**Terminal 1: Backend server** (start this first)
|
|
```bash
|
|
cd backend
|
|
source venv/bin/activate # Activate venv if not already active
|
|
bun run dev:server
|
|
# Or manually: uvicorn main:app --reload --port 17493
|
|
```
|
|
Backend will be available at `http://localhost:17493`
|
|
|
|
**Terminal 2: Desktop app**
|
|
```bash
|
|
bun run dev
|
|
```
|
|
This will:
|
|
- Create a placeholder sidecar binary (for Tauri compilation)
|
|
- Start Vite dev server on port 5173
|
|
- Launch Tauri window pointing to localhost:5173
|
|
- Connect to the Python server you started in Terminal 1
|
|
- Enable hot reload
|
|
|
|
> **Note:** In dev mode, the app connects to your manually-started Python server.
|
|
> The bundled server binary is only used in production builds.
|
|
|
|
**Optional: Web app**
|
|
```bash
|
|
bun run dev:web
|
|
```
|
|
Web app will be available at `http://localhost:5174`
|
|
|
|
### Model Downloads
|
|
|
|
Models are automatically downloaded from HuggingFace Hub on first use:
|
|
- **Whisper** (transcription): Auto-downloads on first transcription
|
|
- **Qwen3-TTS** (voice cloning): Auto-downloads on first generation (~2-4GB)
|
|
|
|
First-time usage will be slower due to model downloads, but subsequent runs will use cached models.
|
|
|
|
### Building
|
|
|
|
**Build everything (recommended):**
|
|
```bash
|
|
bun run build
|
|
```
|
|
This automatically:
|
|
1. Builds the Python server binary (`./scripts/build-server.sh`)
|
|
2. Builds the Tauri desktop app (`cd tauri && bun run tauri build`)
|
|
|
|
Creates platform-specific installers (`.dmg`, `.msi`, `.AppImage`) in `tauri/src-tauri/target/release/bundle/`.
|
|
|
|
**Note:** The build process detects your platform and includes the appropriate backend (MLX for Apple Silicon, PyTorch for others).
|
|
|
|
**Build server binary only:**
|
|
```bash
|
|
bun run build:server
|
|
# or
|
|
./scripts/build-server.sh
|
|
```
|
|
Creates platform-specific binary in `tauri/src-tauri/binaries/`
|
|
|
|
**Building with local Qwen3-TTS development version:**
|
|
|
|
If you're actively developing or modifying the Qwen3-TTS library, set the `QWEN_TTS_PATH` environment variable to point to your local clone:
|
|
|
|
```bash
|
|
export QWEN_TTS_PATH=~/path/to/your/Qwen3-TTS
|
|
bun run build:server
|
|
```
|
|
|
|
This makes PyInstaller use your local qwen-tts version instead of the pip-installed package. Useful when testing changes to the TTS library before they're published to PyPI or when using an editable install (`pip install -e`).
|
|
|
|
**Build web app:**
|
|
```bash
|
|
cd web
|
|
bun run build
|
|
```
|
|
Output in `web/dist/`
|
|
|
|
### Generate OpenAPI Client
|
|
|
|
After starting the backend server:
|
|
```bash
|
|
./scripts/generate-api.sh
|
|
```
|
|
This downloads the OpenAPI schema and generates the TypeScript client in `app/src/lib/api/`
|
|
|
|
### Convert Assets to Web Formats
|
|
|
|
To optimize images and videos for the web, run:
|
|
```bash
|
|
bun run convert:assets
|
|
```
|
|
|
|
This script:
|
|
- Converts PNG → WebP (better compression, same quality)
|
|
- Converts MOV → WebM (VP9 codec, smaller file size)
|
|
- Processes files in `landing/public/` and `docs/public/`
|
|
- **Deletes original files** after successful conversion
|
|
|
|
**Requirements:** Install `webp` and `ffmpeg`:
|
|
```bash
|
|
brew install webp ffmpeg
|
|
```
|
|
|
|
> **Note:** Run this before committing new images or videos to keep the repository size small.
|
|
|
|
## Development Workflow
|
|
|
|
### 1. Create a Branch
|
|
|
|
```bash
|
|
git checkout -b feature/your-feature-name
|
|
# or
|
|
git checkout -b fix/your-bug-fix
|
|
```
|
|
|
|
### 2. Make Your Changes
|
|
|
|
- Write clean, readable code
|
|
- Follow existing code style
|
|
- Add comments for complex logic
|
|
- Update documentation as needed
|
|
|
|
### 3. Test Your Changes
|
|
|
|
- Test manually in the app
|
|
- Ensure backend API endpoints work
|
|
- Check for TypeScript/Python errors
|
|
- Verify UI components render correctly
|
|
|
|
### 4. Commit Your Changes
|
|
|
|
Write clear, descriptive commit messages:
|
|
|
|
```bash
|
|
git commit -m "Add feature: voice profile export"
|
|
git commit -m "Fix: audio playback stops after 30 seconds"
|
|
```
|
|
|
|
### 5. Push and Create Pull Request
|
|
|
|
```bash
|
|
git push origin feature/your-feature-name
|
|
```
|
|
|
|
Then create a pull request on GitHub with:
|
|
- Clear description of changes
|
|
- Screenshots (for UI changes)
|
|
- Reference to related issues
|
|
|
|
## Code Style
|
|
|
|
### TypeScript/React
|
|
|
|
- Use TypeScript strict mode
|
|
- Follow React best practices
|
|
- Use functional components with hooks
|
|
- Prefer named exports
|
|
- Format with Biome (runs automatically)
|
|
|
|
```typescript
|
|
// Good
|
|
export function ProfileCard({ profile }: { profile: Profile }) {
|
|
return <div>{profile.name}</div>;
|
|
}
|
|
|
|
// Avoid
|
|
export const ProfileCard = (props) => { ... }
|
|
```
|
|
|
|
### Python
|
|
|
|
- Follow PEP 8 style guide
|
|
- Use type hints
|
|
- Use async/await for I/O operations
|
|
- Format with Black (if configured)
|
|
|
|
```python
|
|
# Good
|
|
async def create_profile(name: str, language: str) -> Profile:
|
|
"""Create a new voice profile."""
|
|
...
|
|
|
|
# Avoid
|
|
def create_profile(name, language):
|
|
...
|
|
```
|
|
|
|
### Rust
|
|
|
|
- Follow Rust conventions
|
|
- Use meaningful variable names
|
|
- Handle errors explicitly
|
|
- Format with `rustfmt`
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
voicebox/
|
|
├── app/ # Shared React frontend
|
|
│ └── src/
|
|
│ ├── components/ # UI components
|
|
│ ├── lib/ # Utilities and API client
|
|
│ └── hooks/ # React hooks
|
|
├── backend/ # Python FastAPI server
|
|
│ ├── main.py # API routes
|
|
│ ├── tts.py # Voice synthesis
|
|
│ └── ...
|
|
├── tauri/ # Desktop app wrapper
|
|
│ └── src-tauri/ # Rust backend
|
|
└── scripts/ # Build scripts
|
|
```
|
|
|
|
## Areas for Contribution
|
|
|
|
### 🐛 Bug Fixes
|
|
|
|
- Check existing issues for bugs to fix
|
|
- Test your fix thoroughly
|
|
- Add tests if possible
|
|
|
|
### ✨ New Features
|
|
|
|
- Check the roadmap in README.md
|
|
- Discuss major features in an issue first
|
|
- Keep features focused and well-scoped
|
|
|
|
### 📚 Documentation
|
|
|
|
- Improve README clarity
|
|
- Add code comments
|
|
- Write API documentation
|
|
- Create tutorials or guides
|
|
|
|
### 🎨 UI/UX Improvements
|
|
|
|
- Improve accessibility
|
|
- Enhance visual design
|
|
- Optimize performance
|
|
- Add animations/transitions
|
|
|
|
### 🔧 Infrastructure
|
|
|
|
- Improve build process
|
|
- Add CI/CD improvements
|
|
- Optimize bundle size
|
|
- Add testing infrastructure
|
|
|
|
## API Development
|
|
|
|
When adding new API endpoints:
|
|
|
|
1. **Add route in `backend/main.py`**
|
|
2. **Create Pydantic models in `backend/models.py`**
|
|
3. **Implement business logic in appropriate module**
|
|
4. **Update OpenAPI schema** (automatic with FastAPI)
|
|
5. **Regenerate TypeScript client:**
|
|
```bash
|
|
bun run generate:api
|
|
```
|
|
6. **Update `backend/README.md`** with endpoint documentation
|
|
|
|
## Testing
|
|
|
|
Currently, testing is primarily manual. When adding tests:
|
|
|
|
- **Backend**: Use pytest for Python tests
|
|
- **Frontend**: Use Vitest for React component tests
|
|
- **E2E**: Use Playwright for end-to-end tests (future)
|
|
|
|
## Pull Request Process
|
|
|
|
1. **Update documentation** if needed
|
|
2. **Ensure code follows style guidelines**
|
|
3. **Test your changes thoroughly**
|
|
4. **Update CHANGELOG.md** with your changes
|
|
5. **Request review** from maintainers
|
|
|
|
### PR Checklist
|
|
|
|
- [ ] Code follows style guidelines
|
|
- [ ] Documentation updated
|
|
- [ ] Changes tested
|
|
- [ ] No breaking changes (or documented)
|
|
- [ ] CHANGELOG.md updated
|
|
|
|
## Release Process
|
|
|
|
Releases are managed by maintainers:
|
|
|
|
1. **Bump version using bumpversion:**
|
|
```bash
|
|
# Install bumpversion (if not already installed)
|
|
pip install bumpversion
|
|
|
|
# Bump patch version (0.1.0 -> 0.1.1)
|
|
bumpversion patch
|
|
|
|
# Or bump minor version (0.1.0 -> 0.2.0)
|
|
bumpversion minor
|
|
|
|
# Or bump major version (0.1.0 -> 1.0.0)
|
|
bumpversion major
|
|
```
|
|
|
|
This automatically:
|
|
- Updates version numbers in all files (`tauri.conf.json`, `Cargo.toml`, all `package.json` files, `backend/main.py`)
|
|
- Creates a git commit with the version bump
|
|
- Creates a git tag (e.g., `v0.1.1`, `v0.2.0`)
|
|
|
|
2. **Update CHANGELOG.md** with release notes
|
|
|
|
3. **Push commits and tags:**
|
|
```bash
|
|
git push
|
|
git push --tags
|
|
```
|
|
|
|
4. **GitHub Actions builds and releases** automatically when tags are pushed
|
|
|
|
## Troubleshooting
|
|
|
|
See [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) for common issues and solutions.
|
|
|
|
**Quick fixes:**
|
|
|
|
- **Backend won't start:** Check Python version (3.11+), ensure venv is activated, install dependencies
|
|
- **Tauri build fails:** Ensure Rust is installed, clean build with `cd tauri/src-tauri && cargo clean`
|
|
- **OpenAPI client generation fails:** Ensure backend is running, check `curl http://localhost:8000/openapi.json`
|
|
|
|
## Questions?
|
|
|
|
- Open an issue for bugs or feature requests
|
|
- Check existing issues and discussions
|
|
- Review the codebase to understand patterns
|
|
- See [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) for common issues
|
|
|
|
## Additional Resources
|
|
|
|
- [README.md](README.md) - Project overview
|
|
- [backend/README.md](backend/README.md) - API documentation
|
|
- [docs/AUTOUPDATER_QUICKSTART.md](docs/AUTOUPDATER_QUICKSTART.md) - Auto-updater setup
|
|
- [SECURITY.md](SECURITY.md) - Security policy
|
|
- [CHANGELOG.md](CHANGELOG.md) - Version history
|
|
|
|
## License
|
|
|
|
By contributing, you agree that your contributions will be licensed under the MIT License.
|
|
|
|
---
|
|
|
|
Thank you for contributing to Voicebox! 🎉
|