Shush

Local-AI · Android + Python

A conversation mood ring that tells you when to shut up — before you regret it.

shush illustration

Your phone becomes a dumb microphone and a single breathing circle. Everything else — transcription, judging the mood, deciding when you're about to cross a line — happens on your own machine. Nothing ever leaves the room.

~100mscircle latency
~1slive transcript
EN·HU·ETmultilingual
0bytes to the cloud

The idea

It started as a friend's joke — "someone should make an app that tells you when to shut up." In a heated conversation it's hard to notice your own voice climbing until it's too late. Shush is the device that notices for you: a calm circle that warms to amber as things get tense and goes red when you're about to say the thing you can't take back.

How it works

Phonemic → PCM audio
LAN socketWebSocket stream
Fast layerloudness → the circle
Slow layerWhisper + Ollama judge
Verdictcalm → tense → stop

The phone (Kotlin + Jetpack Compose) streams raw PCM audio over a LAN WebSocket to a Python server. The server runs a deliberate two-layer design so the interface always feels instant:

  • Fast layer — a NumPy loop tracks loudness and a rolling 5-second history, driving the circle's size and a "voices rising" early-warning the moment things start climbing, even before anyone is loud.
  • Slow layer — faster-whisper transcribes each phrase and a local LLM (Ollama, llama3.2:3b) reads the escalation arc and returns a verdict plus a trend: easing, steady, or rising.

Live speaker counting uses SpeechBrain ECAPA voice embeddings, clustered online so the circle knows how many people are talking.

Predict, don't just react

The whole point is to warn you early. Two trajectory signals feed the alarm: an acoustic one that flags your voice rising above your own rolling baseline, and a verbal one where the judge reserves the red "stop" for an imminent blow-up and uses amber for the build-up. When the trend is rising, the circle physically throbs.

Privacy by design

Privacy isn't a setting, it's the architecture. Audio never leaves your network; every WebSocket frame is AES-256-GCM encrypted; pairing is trust-on-first-use over mDNS auto-discovery, so there's no token to type and none broadcast. Transcripts and voiceprints are deliberately not stored by default.

Built with

Android: Kotlin, Jetpack Compose, OkHttp WebSocket, AudioRecord (PCM16 mono 16 kHz). Server: Python, websockets, NumPy, faster-whisper (multilingual medium), SpeechBrain ECAPA diarization, Ollama for the judge. Ops: AES-GCM crypto, zeroconf/mDNS discovery, Docker + docker-compose with GPU passthrough.