A sophisticated AI voice assistant with 1940s British charm - voice interface for Claude CLI
Project description
Claudette
A sophisticated AI voice assistant with 1940s British charm
Features • Installation • Configuration • Usage • Skills • Contributing • Support
Claudette is a voice-activated assistant that brings the elegance of a 1940s British bombshell to your command line. She listens for her wake word, transcribes your speech using Whisper, and responds with wit and charm through Claude CLI.
Features
- Wake Word Detection - Say "Claudette" to activate (with fuzzy matching for accents)
- Voice Activity Detection - Uses Silero VAD with GPU acceleration
- Speech-to-Text - Local (faster-whisper) or remote Whisper API
- Natural Conversation - Maintains conversation memory across sessions
- Text-to-Speech - Streaming TTS with multiple voice options
- Sound Effects - Audio feedback for state changes
- Hotkey Activation - Ctrl+Shift+C (or Cmd+Shift+C on Mac)
- System Tray - Status icon with waveform visualization
- Desktop Notifications - Optional notification support
- System Commands - Volume, battery, screenshots, and more
- Custom Skills - Extensible plugin system
- Multiple Personalities - Switch between different AI personas
- Noise Reduction - Audio processing for cleaner recognition
- Offline Mode - Basic functionality when network unavailable
Architecture
[Microphone] → [VAD Detection] → [Noise Filter] → [Whisper] → [Claude CLI]
(Silero) (local/remote) ↓
[TTS]
↓
[Speaker]
Requirements
- Python 3.10+
- Claude CLI installed and configured
- PortAudio library (
portaudio19-devon Ubuntu/Debian) - Working microphone
Installation
From PyPI
# Basic installation
pip install claudette-voice
# With local Whisper (no server needed)
pip install claudette-voice[local]
# With all optional features
pip install claudette-voice[all]
# Install system dependencies (Ubuntu/Debian)
sudo apt install portaudio19-dev
Optional Extras
| Extra | Description | Install Command |
|---|---|---|
local |
Local Whisper transcription | pip install claudette-voice[local] |
hotkey |
Global hotkey support | pip install claudette-voice[hotkey] |
system |
System info commands | pip install claudette-voice[system] |
tray |
System tray with waveform | pip install claudette-voice[tray] |
notifications |
Desktop notifications | pip install claudette-voice[notifications] |
audio |
Noise reduction | pip install claudette-voice[audio] |
all |
Everything above + dev tools | pip install claudette-voice[all] |
From Source (Development)
# Clone the repository
git clone https://github.com/cyberkoder/claudette.git
cd claudette
# Install system dependencies (Ubuntu/Debian)
sudo apt install portaudio19-dev
# Create virtual environment
python -m venv venv
source venv/bin/activate
# Install in development mode with all extras
pip install -e ".[all]"
# Copy and configure settings
cp config.yaml.example config.yaml
Configuration
Create a config.yaml file in your working directory:
whisper:
mode: "local" # "local" or "remote"
model: "base" # tiny, base, small, medium, large-v3
# url: "http://server:9300/asr" # For remote mode
wake_word:
word: "claudette"
# variants: ["cloud it"] # Add custom variants for your accent
vad:
threshold: 0.5
silence_duration: 1.5
device: "auto" # "auto", "cuda", or "cpu"
tts:
voice: "en-GB-SoniaNeural"
rate: "+0%"
pitch: "+0Hz"
memory:
enabled: true
max_exchanges: 20
sounds:
enabled: true
volume: 0.3
hotkey:
enabled: true
# key: "<ctrl>+<shift>+c" # Customize hotkey
tray:
enabled: true
waveform: false # Floating waveform window
notifications:
enabled: false
personality:
preset: "claudette" # claudette, professional, friendly, butler, pirate
audio_processing:
noise_reduce: true
high_pass_cutoff: 80.0
normalize: true
offline:
enabled: true
Usage
# Run Claudette
claudette
# Or run as module
python -m claudette
Voice Commands
- Activate: Say "Claudette" or press Ctrl+Shift+C
- Command: State your request after "Yes, sir?"
- Follow-up: Continue without wake word
- Confirm: Say "yes" or "go ahead" when asked
- End: Say "thank you" or "goodbye"
Example Interaction
You: "Claudette"
Claudette: "Yes, sir?"
You: "What time is it?"
Claudette: "It's half past 3 in the afternoon, sir."
You: "How's my battery?"
Claudette: "Battery is at 72% with about 3 hours remaining, sir."
You: "Thank you"
Claudette: "My pleasure, sir."
Skills
Claudette includes many built-in skills:
| Skill | Trigger Examples |
|---|---|
| Time | "what time is it", "current time" |
| Date | "what's the date", "what day is it" |
| Status | "system status", "how are you" |
| System Info | "how is my computer", "system info" |
| Battery | "battery level", "am I plugged in" |
| Volume | "volume up", "mute", "what's the volume" |
| Lock Screen | "lock screen", "lock computer" |
| Screenshot | "take a screenshot" |
| Voice Change | "list voices", "change voice to libby" |
| Personality | "list personalities", "change personality to butler" |
| Clear Memory | "clear memory", "forget everything" |
| List Skills | "what can you do", "list skills" |
Custom Skills
Create custom skills in a skills/ directory:
from claudette import Skill
class WeatherSkill(Skill):
name = "weather"
description = "Check the weather"
triggers = ["what's the weather", "weather forecast"]
def execute(self, command: str, claudette) -> str:
# Your implementation here
return "It's a lovely day, sir."
Project Structure
claudette/
├── src/claudette/
│ ├── __init__.py
│ ├── assistant.py # Main assistant
│ ├── skills.py # Skills system
│ ├── sounds.py # Sound effects
│ ├── hotkey.py # Hotkey support
│ ├── tray.py # System tray
│ ├── notifications.py # Desktop notifications
│ ├── personalities.py # AI personalities
│ ├── audio_processing.py # Noise reduction
│ └── offline.py # Offline fallback
├── skills/ # Custom skills directory
├── config.yaml.example
├── pyproject.toml
└── README.md
Contributing
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Format code
black src/
# Lint code
ruff check src/
Publishing
For maintainers - publishing to PyPI:
# Build the package
python -m build
# Check the package
twine check dist/*
# Upload to TestPyPI first
twine upload --repository testpypi dist/*
# Upload to PyPI
twine upload dist/*
Or use GitHub Releases - creating a release automatically publishes to PyPI.
Troubleshooting
"PortAudio library not found"
# Ubuntu/Debian
sudo apt install portaudio19-dev
# macOS
brew install portaudio
# Fedora
sudo dnf install portaudio-devel
Wake word not detected
- Speak clearly and pause slightly after "Claudette"
- Check logs in
logs/directory - Add custom variants: say "add wake word cloud" if being misheard
Audio cutting off
- Adjust
silence_durationin config.yaml - Check microphone levels
Support the Project
If you find Claudette useful, consider buying me a coffee!
License
MIT License - see LICENSE for details.
Acknowledgments
- Anthropic for Claude
- Silero for VAD model
- Edge TTS for text-to-speech
- faster-whisper for local transcription
- The 1940s for the aesthetic inspiration
"Good day, sir. Claudette at your service."
Project details
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 claudette_voice-0.1.1.tar.gz.
File metadata
- Download URL: claudette_voice-0.1.1.tar.gz
- Upload date:
- Size: 1.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
051ec19b0c74cb5bea8b5607ac6c67b1bb76e93921caf07c4d591ee97b5d6a0c
|
|
| MD5 |
3daee9575013f5940be1b8e0e1438b08
|
|
| BLAKE2b-256 |
e11c3abb4b43dcd7e15b146d122a09fdeca6aefd854e478c34241e7ab1141674
|
Provenance
The following attestation bundles were made for claudette_voice-0.1.1.tar.gz:
Publisher:
release.yml on cyberkoder/claudette
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
claudette_voice-0.1.1.tar.gz -
Subject digest:
051ec19b0c74cb5bea8b5607ac6c67b1bb76e93921caf07c4d591ee97b5d6a0c - Sigstore transparency entry: 868851142
- Sigstore integration time:
-
Permalink:
cyberkoder/claudette@f99740f6e3b0d0d2a6efe0e921796e3ece72ca76 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/cyberkoder
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f99740f6e3b0d0d2a6efe0e921796e3ece72ca76 -
Trigger Event:
push
-
Statement type:
File details
Details for the file claudette_voice-0.1.1-py3-none-any.whl.
File metadata
- Download URL: claudette_voice-0.1.1-py3-none-any.whl
- Upload date:
- Size: 35.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e3cbfbd12500519d0b6484e71aa6c2d4870c0f6577e4160151ae4100f607a74
|
|
| MD5 |
7a8be54930587873f21e176e4f8e8eff
|
|
| BLAKE2b-256 |
5d0ff96d8d3974ec7e2877b9b027685de8610cad6d0e6510ca92dbd1e21e6392
|
Provenance
The following attestation bundles were made for claudette_voice-0.1.1-py3-none-any.whl:
Publisher:
release.yml on cyberkoder/claudette
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
claudette_voice-0.1.1-py3-none-any.whl -
Subject digest:
1e3cbfbd12500519d0b6484e71aa6c2d4870c0f6577e4160151ae4100f607a74 - Sigstore transparency entry: 868851143
- Sigstore integration time:
-
Permalink:
cyberkoder/claudette@f99740f6e3b0d0d2a6efe0e921796e3ece72ca76 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/cyberkoder
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f99740f6e3b0d0d2a6efe0e921796e3ece72ca76 -
Trigger Event:
push
-
Statement type: