Thanks for your interest in contributing! Jupiter Voice is a community project and we welcome all kinds of contributions.
- Fork the repository
- Clone your fork and set up the dev environment:
git clone https://github.com/SudarshanSuryaprakash/voice-assistant.git
cd voice-assistant
bash setup.sh
source .venv/bin/activate
pip install -e ".[dev]"- Create a branch for your work:
git checkout -b my-featuresource .venv/bin/activate
jupiter-voice # normal mode
jupiter-voice -v # verbose/debug modepytest -vruff check jupiter_voice/ tests/ scripts/
ruff check --fix jupiter_voice/ tests/ scripts/ # auto-fixSee docs/architecture.md for a walkthrough of how the codebase is organized and how the components interact.
Look for issues labeled good first issue on GitHub. These are scoped to be approachable for newcomers.
- Linux support — porting audio capture to PulseAudio/PipeWire
- Windows support — porting audio and path handling
- Additional TTS backends — Piper, Coqui, or other local engines
- Wake word model sharing — pre-trained
.onnxfiles for common phrases - Improved VAD — voice activity detection for more natural close-phrase handling
- Better transcription — handling accents, noise, and edge cases
- Documentation — tutorials, translations, usage examples
- Make sure tests pass:
pytest -v - Make sure lint is clean:
ruff check jupiter_voice/ tests/ scripts/ - Commit with a clear message describing what changed and why
- Push to your fork and open a pull request
- Describe what your PR does and link any related issues
- Python 3.10+ syntax
- Line length: 100 characters
- Linter: Ruff with
E,F,W,Irules - Use type annotations for function signatures
- Keep imports sorted (Ruff handles this)
If you want to add support for a different TTS engine:
- Create a new file in
jupiter_voice/tts/(e.g.,piper_tts.py) - Implement a class with
load()andsynthesize(text) -> (np.ndarray, int)methods matchingKokoroTTSEngine's interface - Add a config option to select the backend
- Add tests
Similar pattern — create a file in jupiter_voice/stt/, implement load() and transcribe(audio) -> str, and wire it up through config.
When reporting bugs, please include:
- Your macOS version and chip (e.g., macOS 15.2, M2 Pro)
- Python version (
python --version) - Steps to reproduce
- Error output (run with
jupiter-voice -vfor verbose logs)
By contributing, you agree that your contributions will be licensed under the MIT License.