nathanrenting.dev
Projet · scaffold MVP

CaptionCompass — vois les mots, sens d'où ils viennent

Une application d'accessibilité caption-first pour les utilisateurs Android sourds et malentendants. Les sous-titres en direct sont toujours visibles. Une indication grossière de la direction du locuteur n'apparaît que lorsqu'elle est fiable.

Pipeline audio dessinée à la main : micros stéréo sur le téléphone → AAudio UNPROCESSED → VAD → deux chemins parallèles (GCC-PHAT DoA → Zone Smoother à 5 zones, et ASR via SpeechRecognizer / Vosk) → écran du téléphone avec arc DIRECTION + CAPTIONS. Légende : 'show less, not more — direction only when reliable'.

Croquis sur tableau blanc · la pipeline audio

La philosophie produit en cinq phrases

L'indication de direction est opt-in et conditionnée. Elle n'apparaît que si :

  1. L'utilisateur l'a activée dans les réglages, et
  2. L'appareil expose deux microphones exploitables via la source audio UNPROCESSED, et
  3. Le téléphone est posé à plat et stable (vérification gyroscope), et
  4. La confiance est élevée ou moyenne.

Si l'une de ces conditions disparaît, les sous-titres continuent de fonctionner sans changement et l'arc de direction s'estompe. "Show less, not more" — il ne s'agit pas de désactiver une fonction, mais de la retirer respectueusement lorsqu'elle ne peut pas être justifiée assez solidement.

Ce que contient le MVP

CoucheStatut
Projet / Gradle / Manifestready
Modèle de domaine + politique de fallbackready, unit-tested
Capability-probe (recherche UNPROCESSED + stéréo)ready
Capture stéréo AudioRecordready
Energy VAD (détection d'activité vocale)ready
GCC-PHAT DoA + zone-smootherready, unit-tested sur le mapping τ→zone
Adaptateur Android SpeechRecognizerready
Audio mock + ASR mock (pour le travail sur émulateur)ready
Foreground service (type micro Android 14)ready
UI Compose (barre de statut, arc de direction, sous-titres, contrôles)ready
Phase 2ASR de fallback Vosk, Silero-VAD ONNX
Phase 4Entrée stéréo BLE (micros stéréo externes)

Stack

Langage
Kotlin 2.0.20
UI
Jetpack Compose (BOM 2024.10), single-screen single-activity
Capture audio
AudioRecord avec source UNPROCESSED et channel-mask stéréo
VAD
Energy-based (Phase 1), Silero-VAD ONNX (Phase 2)
DoA
GCC-PHAT (generalized cross-correlation phase transform), implémentation Kotlin maison
ASR
Android SpeechRecognizer (en ligne), Vosk (Phase 2, fallback hors ligne)
Service
Foreground service avec foreground-type microphone d'Android 14
Min SDK
26 (Android 8.0+)
Target SDK
35 (Android 15)

Pourquoi GCC-PHAT et pas un modèle ML pour la direction

La DoA avec deux microphones est un problème mathématique résolu si on le pose correctement. GCC-PHAT donne une time-difference-of-arrival d'où découle un seul azimut. Sur un téléphone avec ~14 cm entre les micros, cela ne fournit pas une précision au degré près, mais bien une indication fiable gauche / centre / droite / arrière-gauche / arrière-droite (cinq zones). C'est suffisant pour le cas d'usage, sans modèles ML qui coûtent en latence et en batterie.

Pour l'évaluation de la confiance, on utilise la netteté du pic de cross-correlation — un pic élevé signifie une source claire ; un pic plat signifie plusieurs locuteurs ou du bruit, et l'arc est alors estompé au lieu d'afficher une direction trompeuse.

Statut + roadmap

Maintenant : scaffold MVP prêt. Couche de domaine unit-tested, UI Compose fonctionnelle, capture stéréo opérationnelle, sous-titres fonctionnels via SpeechRecognizer. Mode mock pour le développement sur émulateur.

Phase 2 : ASR Vosk hors ligne + Silero-VAD ONNX (meilleure VAD, indépendante de l'appareil).

Phase 4 : entrée stéréo BLE — brancher des micros stéréo externes via Bluetooth pour une meilleure précision DoA que les micros intégrés du téléphone.