A Textual app that reminds you to keep your voice down on calls.
Project description
inside-voice
inside-voice is a terminal app that helps you keep your speaking volume down
while you are on Zoom, Google Meet, or other calls. It watches your microphone
level and plays a short local chime when your voice crosses above an adjustable
dB threshold, or after it stays above the threshold for a configurable duration.
The app is Linux-first and built with cross-platform pieces
(sounddevice/PortAudio + Textual), so macOS and Windows should be achievable
even though Linux is the primary target.
Features
- Live microphone level meter in dBFS
- Textual TUI with mouse/keyboard-adjustable sliders
- Sliders for threshold, repeat sustain duration, cooldown, and chime volume
- Configurable first chime behavior: immediate crossing or sustained loudness
- Generated two-tone chime; no bundled audio asset required
- Mute toggle and quick calibration action
- Settings saved under your platform config directory
- Audio input device listing and selection
Requirements
- Python 3.14+
uv- PortAudio runtime libraries
On Debian/Ubuntu-style Linux systems, PortAudio is typically available with:
sudo apt install libportaudio2 portaudio19-dev
Package names vary by distribution.
Install and run
From PyPI:
uv tool install inside-voice
inside-voice
From source:
git clone https://github.com/feoh/inside-voice.git
cd inside-voice
uv sync
uv run inside-voice
List input devices:
uv run inside-voice --list-devices
Choose a device by index or name substring:
uv run inside-voice --input-device 3
uv run inside-voice --input-device "USB Headset"
Start with a threshold override:
uv run inside-voice --threshold -28
Controls
q— quitm— mute/unmute chime playbackc— one-shot threshold calibration: set threshold to current level + 6 dBt— toggle first chime behavior between immediate and sustained- Arrow keys — adjust the focused slider; after
c, Threshold gets focus - Page Up/Page Down — adjust focused slider in larger steps
- Home/End — move focused slider to minimum/maximum
- Mouse click/drag — set slider values
Tuning tips
- Join a call with your normal headphones/microphone setup.
- Speak at a comfortable normal volume.
- Press
cto place the threshold slightly above that level.cis not a mode; it immediately updates the Threshold slider and saves it.- After calibration, arrow keys adjust the Threshold slider for fine-tuning.
- Leave "Immediate first chime" enabled if you want prompt feedback.
- Disable "Immediate first chime" if you only want alerts after sustained loudness.
- If the chime triggers too often, raise the threshold or increase cooldown.
- If it triggers too late, lower the threshold or re-enable immediate first chime.
- Increase repeat sustain if repeated chimes are annoying while staying loud.
The meter uses dBFS, where 0 dBFS is the loudest possible digital input and
quieter sounds are negative numbers. Typical microphone speech levels often land
somewhere between -45 and -15 dBFS, depending on gain and hardware.
Configuration
Settings are saved automatically to your platform config directory, for example:
- Linux:
~/.config/inside-voice/settings.json - macOS:
~/Library/Application Support/inside-voice/settings.json - Windows:
%LOCALAPPDATA%\\inside-voice\\settings.json
Development
uv sync
uv run ruff check .
uv run mypy src tests
uv run pytest
License
MIT
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 inside_voice-0.1.1.tar.gz.
File metadata
- Download URL: inside_voice-0.1.1.tar.gz
- Upload date:
- Size: 9.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
37e83a883794ae822f1a508029c6c021ae8a7988b8d4a6eed17270946d1449ac
|
|
| MD5 |
27bc5a31d7eb130dd58aab530da00035
|
|
| BLAKE2b-256 |
a647334475309a1ad0e788b222ed04976fe336acc8269782cf7245657fa0ff53
|
Provenance
The following attestation bundles were made for inside_voice-0.1.1.tar.gz:
Publisher:
publish.yml on feoh/inside-voice
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
inside_voice-0.1.1.tar.gz -
Subject digest:
37e83a883794ae822f1a508029c6c021ae8a7988b8d4a6eed17270946d1449ac - Sigstore transparency entry: 2023647258
- Sigstore integration time:
-
Permalink:
feoh/inside-voice@4806e4059c80ceac0a1bf54f60c5c83e8de9a4b4 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/feoh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4806e4059c80ceac0a1bf54f60c5c83e8de9a4b4 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file inside_voice-0.1.1-py3-none-any.whl.
File metadata
- Download URL: inside_voice-0.1.1-py3-none-any.whl
- Upload date:
- Size: 12.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1dfe0a9ddf2fff319eca23a15d3e07bde315fb4123329256271fd041b00b66a7
|
|
| MD5 |
6bd136d3c8280eacd29f5fbbe4a90b66
|
|
| BLAKE2b-256 |
d652d814fd35d1531aa2ac8a43575f5fbd87f3912e474e75956b9b36f1540ad2
|
Provenance
The following attestation bundles were made for inside_voice-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on feoh/inside-voice
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
inside_voice-0.1.1-py3-none-any.whl -
Subject digest:
1dfe0a9ddf2fff319eca23a15d3e07bde315fb4123329256271fd041b00b66a7 - Sigstore transparency entry: 2023647386
- Sigstore integration time:
-
Permalink:
feoh/inside-voice@4806e4059c80ceac0a1bf54f60c5c83e8de9a4b4 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/feoh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4806e4059c80ceac0a1bf54f60c5c83e8de9a4b4 -
Trigger Event:
workflow_dispatch
-
Statement type: