nathanrenting.dev
Project · MVP scaffold

CaptionCompass — see the words, sense where they come from

Een caption-first accessibility-app voor doven en slechthorende Android-gebruikers. Live captions zijn altijd zichtbaar. Een grove richting-hint van de spreker verschijnt alleen als hij betrouwbaar is.

Hand-getekende audio-pipeline: stereo-mics op telefoon → AAudio UNPROCESSED → VAD → twee parallelle paden (GCC-PHAT DoA → Zone Smoother met 5 zones, en ASR via SpeechRecognizer / Vosk) → telefoon-screen met DIRECTION arc + CAPTIONS. Onderschrift: 'show less, not more — direction only when reliable'.

Whiteboard-schets · de audio-pipeline

De productfilosofie in vijf zinnen

De richting-hint is opt-in en gated. Hij verschijnt alleen als:

  1. De gebruiker hem aan heeft gezet in settings, én
  2. Het device twee bruikbare microfoons exposeert via de UNPROCESSED audio-source, én
  3. De telefoon plat en stabiel ligt (gyroscoop-check), én
  4. Confidence hoog of medium is.

Als één van die voorwaarden wegvalt blijven de captions onveranderd werken en faded de richting-arc weg. "Show less, not more" — niet een feature uitzetten, maar de feature respectvol terugtrekken als hij niet hard genoeg te onderbouwen is.

Wat er in de MVP zit

LaagStatus
Project / Gradle / Manifestready
Domain-model + fallback-policyready, unit-tested
Capability-probe (zoekt naar UNPROCESSED + stereo)ready
AudioRecord stereo captureready
Energy VAD (voice activity detection)ready
GCC-PHAT DoA + zone-smootherready, unit-tested op τ→zone-mapping
Android SpeechRecognizer adapterready
Mock audio + mock ASR (voor emulator-werk)ready
Foreground service (Android 14 mic-type)ready
Compose UI (status-balk, direction-arc, captions, controls)ready
Phase 2Vosk fallback ASR, Silero-VAD ONNX
Phase 4Stereo BLE input (externe stereo-mics)

Stack

Taal
Kotlin 2.0.20
UI
Jetpack Compose (BOM 2024.10), single-screen single-activity
Audio-capture
AudioRecord met UNPROCESSED source en stereo channel-mask
VAD
Energy-based (Phase 1), Silero-VAD ONNX (Phase 2)
DoA
GCC-PHAT (generalized cross-correlation phase transform), eigen Kotlin-implementatie
ASR
Android SpeechRecognizer (online), Vosk (Phase 2, offline fallback)
Service
Foreground service met Android 14 microphone foreground-type
Min SDK
26 (Android 8.0+)
Target SDK
35 (Android 15)

Waarom GCC-PHAT en geen ML-model voor richting

DoA met twee microfoons is een opgelost wiskundig probleem als je het correct framet. GCC-PHAT geeft een time-difference-of-arrival waaruit één azimut volgt. Op een telefoon met ~14cm tussen de mics levert dat geen graden-precisie, maar wel een betrouwbare links / midden / rechts / achter-links / achter-rechts indicatie (vijf zones). Dat is genoeg voor de use-case zonder ML-modellen die latency en batterij kosten.

Voor confidence-evaluatie wordt de cross-correlation-peak-sharpness gebruikt — een hoge piek betekent één duidelijke bron; een platte piek betekent meerdere sprekers of ruis, en dan wordt de arc faded in plaats van een misleidende richting tonen.

Status + roadmap

Nu: MVP scaffold ready. Domain-laag unit-tested, Compose-UI draait, stereo capture werkt, captions werken via SpeechRecognizer. Mock-modus voor emulator-ontwikkeling.

Phase 2: Vosk offline ASR + Silero-VAD ONNX (betere VAD, device-onafhankelijk).

Phase 4: Stereo BLE input — externe stereo-mics aansluiten via Bluetooth voor betere DoA-precisie dan de built-in telefoon-mics.