On-device Android talk-time tracker — measures how much each person speaks, no internet permission, no cloud. Kotlin/Compose + sherpa-onnx. GPL-3.0.
  • Kotlin 98.9%
  • Python 1.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Joan Marc Riera Duocastella 939892524d ci: add gitleaks secret-scanning gate
Copies the pattern already running on lab-site: full-history checkout +
gitleaks/gitleaks-action@v2 on every push/PR to main. Confirmed the git
history and working tree are clean locally before adding this.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017QowYasbLTNQUnVSWmSdtK
(cherry picked from commit df8650d887)
2026-09-07 10:46:20 +01:00
.github/workflows ci: add gitleaks secret-scanning gate 2026-09-07 10:46:20 +01:00
app Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
bench-data Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
gradle/wrapper Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
spike Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
.gitattributes Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
.gitignore Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
build.gradle.kts Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
DECISIONS.md Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
gradle.properties Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
gradlew Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
gradlew.bat Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
LICENSE Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
PLAN.md Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
README.md Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
RELEASE.md Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
RESEARCH.md Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
settings.gradle.kts Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00
THIRD_PARTY_LICENSES.md Talk Balance — source snapshot (0.1.4: bench fully debug-only, session history) 2026-09-06 14:29:49 +01:00

Talk Balance

An Android app that measures how much each person talks — entirely on your phone.

Put your phone on the table at dinner or in a meeting. Talk Balance tracks how long each person speaks and shows a fair-share report at the end: talk share, turns taken, and the longest monologue. It's a friendly nudge toward more balanced conversations — not a surveillance tool.

Private by design

  • No internet permission. The app declares none — you can verify it yourself under Android Settings → Apps → Talk Balance → Permissions. Talk Balance cannot open a network connection, so it does not and cannot send your audio anywhere.
  • No audio is ever stored. Speech is processed on the phone in memory (sherpa-onnx: voice-activity detection + speaker embeddings) and written nowhere — no recording file (verified on-device by inspecting the app's storage after a session, and enforced by two automated gates: PrivacyInvariantsTest on the source tree, and verifyReleaseArtifact, which opens the built APK and fails the release if any recording or measurement code, any bench-only asset, or the INTERNET permission made it in). No cloud, no account, no per-use cost.
  • What is kept on the phone. If you enrol people, Talk Balance stores their names, their voiceprints (numeric embeddings, not audio) and per-session talk statistics in an app-private database. That data is not encrypted beyond Android's own full-disk encryption and app sandboxing, so it is readable by anyone who unlocks your phone or by a root/forensic tool. Backups and device-to-device transfer are switched off, and Settings → Delete all data removes all of it and tells you honestly whether every store was cleared. Discover mode needs no enrolment at all and stores no voiceprints.
  • Scope of the claim. These statements are about Talk Balance itself. No app can make promises about the rest of your device — the OS, another app with the microphone, an accessibility service or screen sharing.

Install

Via F-Droid (recommended — you get auto-updates): add this repository to the F-Droid app (or Droid-ify / Neo Store):

https://fdroid.joanmarcriera.es/repo

Or scan the QR / tap "Add to F-Droid" at https://fdroid.joanmarcriera.es.

Direct APK: download the latest build from the same page. Requires Android 10+.

Status: early access (v0.1.4). Enrolment, the live session (coloured bars, current-speaker highlight, running leader), the report and the saved-session history all work on-device. It's young and still being tuned for real-world accuracy — built in the open, expect rapid iteration.

How it works

  1. Enrol each person once (a short voice sample, stored only on the phone).
  2. Run a session — the phone listens, detects speech, matches each utterance to an enrolled speaker on-device, and fills a live bar per person.
  3. Read the report — talk share, turns, longest monologue; share it as an image if you like.
  4. Look back — finished sessions are saved under Past sessions on the home screen. Statistics only: the talk-time numbers, never any audio.

A manual chess-clock mode (tap-to-pass, no audio) is planned for larger or noisier groups where automatic recognition is harder.

Build from source

Requires the Android SDK (platform 35+) and a JDK 17+ (Android Studio's bundled JBR works). Then:

./gradlew test assembleDebug

Release builds are signed from a keystore supplied via environment variables; without them the release build is simply left unsigned. See RELEASE.md.

Tech

Kotlin · Jetpack Compose · Room · sherpa-onnx (on-device VAD + speaker embeddings) · fully offline · minSdk 29 / target 36.

Licence

GPL-3.0-or-later. Bundled models and the sherpa-onnx runtime are Apache-2.0 / MIT — see THIRD_PARTY_LICENSES.md.

Built by Joan Marc Riera.