A multimodal voice assistant with web search, vision, and image generation.
Project description
ChuroVoice V0.1.1
A multimodal voice assistant that works on macOS and Windows (with Linux support thrown in for free). It listens to spoken prompts, responds out loud, can launch apps and websites, can search the web for current context, can inspect images from a webcam, and can generate images when the user asks for a visual result.
What It Does
- Speech-to-text via Whisper through
speech_recognition - Text-to-speech via
edge-tts(played back withafplayon macOS, PowerShell'sMedia.SoundPlayeron Windows, ormpg123/ffplayon Linux) - App launching that uses the platform's native discovery mechanism
(
mdfindon macOS, the Start Menu on Windows,.desktopfiles on Linux) with a website fallback - Web query simplification and search retrieval through DDGS
- Webcam-based vision analysis for appearance or environment questions
- Image generation with Stable Diffusion (CUDA on Windows/Linux, MPS on macOS, CPU fallback everywhere else)
- Terminal-friendly output with
rich
Who This Is For
- Voice-interface enthusiasts
- Multimodal AI experimenters
- Anyone who wants a local voice assistant that runs cross-platform
Platform Support
| OS | Tested | Audio playback | App launch | Stable Diffusion device |
|---|---|---|---|---|
| macOS | yes | afplay (built-in) |
mdfind / open (built-in) |
mps or cpu |
| Windows | yes | PowerShell Media.SoundPlayer |
Start Menu scan / start |
cuda or cpu |
| Linux | yes | mpg123 / ffplay / paplay |
.desktop files / xdg-open |
cuda or cpu |
Requirements
- Python 3.11 or newer
- A microphone with OS-level permission enabled
- A camera with OS-level permission enabled (only if you want vision)
- Ollama installed and running locally (download for macOS / Windows / Linux)
- Optional:
chafafor inline terminal image previews (macOS / Linux). On Windows the assistant just prints a "Saved to - For Stable Diffusion on Windows / Linux you'll want a CUDA-capable GPU and the matching PyTorch wheel.
Python Dependencies
The package is configured with optional-dependency groups so you only install what you need.
macOS
python3 -m venv venv
source venv/bin/activate
pip install -e ".[macos]"
PyAudio on macOS needs portaudio if it's not already on the system:
brew install portaudio
Windows
python -m venv venv
venv\Scripts\activate
pip install -e ".[windows]"
PyAudio-wheels is a drop-in replacement for PyAudio that publishes
pre-built wheels for Windows so you don't need Build Tools for Visual
Studio.
Linux (bonus)
python3 -m venv venv
source venv/bin/activate
sudo apt install python3-pyaudio portaudio19-dev mpg123
pip install -e ".[linux]"
Ollama Setup
After installing Ollama, pull the models referenced in
churovoice/assistant.py:
ollama pull gemma4:31b-cloud
ollama pull ministral-3:3b-cloud
ollama pull ministral-3:8b-cloud
ollama pull ministral-3:14b-cloud
(You can override the model names with environment variables - see Configuration.)
Usage
From the source tree
python main.py # macOS / Linux
python main.py --voice male # explicit voice
python main.py :: Windows
python main.py --voice female
As an installed package
churovoice
churovoice --voice male
On startup the program asks you to choose a voice:
Maleselectsen-US-SteffanNeural- Anything else selects
en-US-AvaNeural
Then the assistant:
- Prompts you to speak
- Transcribes your speech
- Decides whether the request is for app launching, image generation, vision analysis, or a normal answer
- Speaks the response back to you
- Asks whether you want to continue the conversation
Configuration
Every model used by the assistant is configurable through an environment variable. Set them before running, or drop them in a shell profile.
| Variable | Default |
|---|---|
CHUROVOICE_CHAT_MODEL |
gemma4:31b-cloud |
CHUROVOICE_IMAGE_TRIGGER_MODEL |
ministral-3:14b-cloud |
CHUROVOICE_IMAGE_PROMPT_MODEL |
ministral-3:3b-cloud |
CHUROVOICE_WEB_MODEL |
ministral-3:3b-cloud |
CHUROVOICE_VISION_MODEL |
ministral-3:14b-cloud |
CHUROVOICE_IMAGE_ANALYSIS_MODEL |
ministral-3:8b-cloud |
CHUROVOICE_SD_MODEL |
nota-ai/bk-sdm-small |
How It Works
App Launching
If the transcription includes open, the assistant searches the host OS
for a matching application. The lookup is delegated to
churovoice.platform_utils.find_applications, which uses:
mdfindon macOS,- the Windows Start Menu (
.lnkfiles) on Windows, - the FreeDesktop menu (
.desktopfiles) on Linux.
If nothing matches, the assistant falls back to opening
https://<target>.com.
Web Answers
For general questions, the assistant first simplifies the query and fetches recent search results. The response model can use those results when the request is about news, current events, or recent information.
Vision Mode
If the prompt seems to require visual context, the assistant captures a frame from the webcam, saves it locally, and sends it to a vision-capable model for analysis.
Image Generation
If the prompt is recognized as an image request, the assistant converts
it into a short image prompt, generates an image with Stable Diffusion,
saves the result as generated_image.png, and (on macOS / Linux) renders
it in the terminal with chafa if chafa is on PATH.
Cross-Platform Architecture
All OS-specific behaviour is isolated in
churovoice/platform_utils.py:
play_audio- choosesafplay, PowerShellMedia.SoundPlayer, or a Linux audio player.open_url/open_path- choosesopen,cmd /c start, orxdg-open.find_applications- chooses the appropriate application discovery strategy for the host.preview_image_in_terminal- pickschafawhen available, otherwise prints the saved path.resolve_device(inassistant.py) - picksmps/cuda/cpuautomatically.
The rest of the assistant is plain Python that doesn't care which OS it runs on.
Limitations
- The first run downloads the Stable Diffusion checkpoint, which can be several hundred MB.
- The Windows terminal can't preview generated images inline; you'll find
them as
generated_image.pngin the working directory. - App-launching uses simple substring matching, so it can be wrong for ambiguous names (e.g. "open code" could be VS Code or VS Codium).
- The assistant depends on several external models and services.
Troubleshooting
- Microphone not detected (Windows): confirm the OS has granted
microphone access to the terminal/Python, and that
PyAudio-wheelsinstalled successfully. Reinstall withpip install --force-reinstall PyAudio-wheels. OSError: [Errno -9999] No Default Input Device Availableon macOS: open System Settings -> Privacy & Security -> Microphone and enable access for your terminal.- Camera not detected: confirm camera permissions for the terminal and that no other app (Zoom, Photo Booth, etc.) is holding the device.
- TTS is silent on Windows: confirm PowerShell can play audio
(
powershell -c "(New-Object Media.SoundPlayer 'C:\Windows\Media\chord.wav').PlaySync()"). - No audio on Linux: install
mpg123(sudo apt install mpg123) orffmpeg/ffplayforffplaysupport. - Image generation fails / OOM: drop the model, run on CPU by setting
CHUROVOICE_SD_MODELto a smaller checkpoint, or lowernum_inference_steps.
License
No license has been added yet. Add one before publishing or distributing the project widely.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file churovoice-0.1.1.tar.gz.
File metadata
- Download URL: churovoice-0.1.1.tar.gz
- Upload date:
- Size: 16.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd79b5eb3cb5fc8d33c4e4a9f8b8fdd2c062c78d2d68c0deeda88744c6d2fc86
|
|
| MD5 |
235805071b725f21335ec8e44f02d02e
|
|
| BLAKE2b-256 |
80dae00e7803a85dee44deb5083605aefeb29a019ad4af1f4c8dd8c1b8029fc7
|
File details
Details for the file churovoice-0.1.1-py3-none-any.whl.
File metadata
- Download URL: churovoice-0.1.1-py3-none-any.whl
- Upload date:
- Size: 13.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
052c0b1929a9f44cf475d4bffe345ddb4bedd16ee5ebc34ca3485f4d3c0176db
|
|
| MD5 |
8726984694e69dde82ef5677d9aa7e08
|
|
| BLAKE2b-256 |
21286f2e38fdccbf36514cdb6695a4ec167589d1eeaf69b1b3f2fc95ab76e0cf
|