Offline, cross-platform Python text-to-speech and sound notifications. 100% local, privacy-friendly, and works without internet.
- 🗣️ Offline Text-to-Speech (TTS): Speak messages aloud on any platform, no internet required
- 🔔 Sound Alerts: Play system or custom sounds, 100% locally
- ✅ Decorators: Announce when a function completes
- 🔄 Context Managers: Announce start and finish of code blocks
- 🗂️ Class-based API: Full control over voice, rate, volume, and more
- 🧩 Configurable: Set rate, volume, voice, pitch, and language (user/env/default)
- 🔒 Privacy-first: No data sent to the cloud, works in air-gapped environments
- 🧪 Fully tested: Windows, macOS, Linux (CI + Docker)
- 🔇 Mute mode: Set
BLURT_MUTE=trueto silence all output - 🧠 Extensible: Easy to add new drivers or notification types
- All features work entirely on your device—no internet connection required.
- No data is sent to the cloud. Your messages and sounds stay private.
- Perfect for secure environments, air-gapped systems, and privacy-conscious users.
pip install blurtpyOr with Pipenv:
pipenv install blurtpyfrom blurt import say, beep, play_sound, notify_when_done, announce_during, Blurt
say("This task has started!")
beep()
play_sound() # Plays default alert sound
@notify_when_done("All done!")
def compute():
for i in range(3):
print("Working...", i)
compute()
with announce_during("Start", "Finished"):
print("Doing something long...")
# Instance-based API
b = Blurt({"rate": 250, "volume": 0.7})
b.say("Custom rate and volume!")- User config: Pass a dict to
Blurt() - Environment config: Set
BLURT_CONFIGas a JSON string - Default config: Used if nothing else is set
Configurable keys: rate, volume, voice, pitch, language
export BLURT_CONFIG='{"rate": 180, "volume": 0.5, "voice": "Alex"}'say(message: str)— Speak a message aloud (offline)beep()— Play a beep sound (offline)play_sound(path: str = None)— Play a sound file (offline)list_voices()— List available system voicesnotify_when_done(message: str)— Decorator to announce after function completesannounce_during(start: str, end: str)— Context manager to announce start/end
from blurt import Blurt
b = Blurt({"rate": 200, "volume": 0.8, "voice": "Samantha"})
b.say("Hello from Blurt instance!")
b.beep()
b.play_sound()
voices = b.list_voices()
b.set_rate(300)
b.set_volume(0.5)
b.set_voice("Alex")| OS | Voice Tool | Sound Tool |
|---|---|---|
| macOS | say |
afplay |
| Linux | espeak/spd-say |
aplay |
| Windows | pyttsx3 |
winsound |
Linux users: You may need:
sudo apt install espeak aplay- Full test suite:
pytest -v - Linux tests:
docker build -f Dockerfile.linux -t blurtpy-linux-test . && docker run --rm blurtpy-linux-test - Cross-platform CI: GitHub Actions for Windows, macOS, Linux
| Variable | Description | Example |
|---|---|---|
BLURT_MUTE |
Mute all output | true |
BLURT_CONFIG |
JSON config for Blurt | '{"rate": 180, "voice": "Alex"}' |
Full docs: blurtpy.readthedocs.io
Author: Buddheshwar Nath Keshari
MIT License