Casey White
Le studio
Avant lancement

Cocoon

Un canal calme au cœur du bruit.

Le Bluetooth relie deux téléphones directement, sans internet, sans réseau mobile, pour que deux personnes puissent se parler à travers leurs propres écouteurs à réduction de bruit, même dans la voiture, la cuisine ou la foule la plus bruyante.

Catégorie

Appli vocale hors ligne

Durée

16 heures · 24 commits

Axe

Famille et quotidien

Bientôt : iOS et Android
Cocoon

Pourquoi je l'ai construit

Je n'arrêtais pas de penser au problème des deux parents dans une voiture bruyante : tout le monde porte des écouteurs à réduction de bruit maintenant, et personne ne peut parler à la personne assise juste à côté sans crier par-dessus les enfants. Il n'existait pas d'appli qui fasse parler un téléphone à un autre sans passer par internet, alors j'en ai construit une. Cocoon relie deux téléphones en Bluetooth et fait passer une vraie conversation à travers les écouteurs que les gens possèdent déjà. Pas de compte, pas de serveur, rien que l'un ou l'autre téléphone puisse envoyer où que ce soit. Juste deux personnes, et le calme entre les deux.

Ce que ça change pour les gens

  • Un lien direct de téléphone à téléphone en Bluetooth, pour que deux personnes puissent se parler sans internet, sans routeur Wi-Fi et sans réseau mobile, où qu'elles soient
  • Une conversation en duplex intégral à travers les écouteurs que vous possédez déjà, un vrai échange, pas un talkie-walkie à bouton
  • Une porte vocale qui ne transmet rien entre les phrases, pour que l'autre personne n'entende que votre voix, jamais la pièce autour de vous
  • Un appairage par code court qui connecte deux téléphones en moins d'une minute, avec un code identique sur les deux écrans pour confirmer que vous avez trouvé la bonne personne
  • Un écran de test intégré qui vous fait entendre votre propre voix en boucle dans vos écouteurs avant même de lancer un vrai appel

Sous le capot

  • Des canaux BLE L2CAP orientés connexion qui transportent le flux vocal lui-même, puisqu'aucune API des deux systèmes ne permet de diffuser un appel d'un téléphone à un autre
  • La seule radio Bluetooth de chaque téléphone doit gérer à la fois la liaison avec les écouteurs et la liaison entre les deux téléphones, ce qui a fait de la contention de bande passante la contrainte technique centrale, pas un détail secondaire
  • Une isolation vocale par apprentissage automatique, de la famille RNNoise, exécutée dans le chemin de capture Android avant l'encodeur Opus, parce que le suppresseur de bruit natif ne fait rien contre des enfants qui crient, seulement contre les bruits constants
  • Une mise à niveau Wi-Fi Aware pair-à-pair négociée sur le canal de contrôle BLE, qui libère entièrement la radio Bluetooth et réduit la latence quand les deux téléphones la supportent, avec un repli silencieux vers L2CAP
  • Des modules natifs sur mesure qui font le vrai travail, Swift et CoreBluetooth sur iOS, Kotlin et Oboe sur Android, sous une fine couche Expo Router qui ne touche jamais au code audio ou de transport

Les détails qui comptent

  • Le premier vrai test a eu lieu dans une voiture en mouvement, et il a échoué à cause de la congestion radio. L'écran de test intégré, au départ un simple diagnostic jetable, est ce qui a permis de trouver le problème, et il est resté dans l'appli livrée comme seul outil de support possible pour une appli sans aucun serveur
  • Il n'y a rien à faire fuiter. Rien n'est enregistré, suivi, ou envoyé hors de l'un ou l'autre téléphone. Elle ne pourrait pas écouter même si elle le voulait
  • Les deux couleurs de la marque portent un sens plutôt que de simplement décorer l'écran : le sauge est votre propre côté de l'appel, et le violet n'apparaît que lorsque votre partenaire est vraiment là
  • La couche de session prend déjà en charge un hôte plus trois invités, même si l'appli garde honnêtement une interface à deux personnes tant que le Wi-Fi Aware n'a pas gagné la bande passante supplémentaire

Le temps que ça a pris

Environ seize heures d'affilée, du premier commit à une version prête pour les tests sur le Play Store.

16 heures · 24 commits

Ce que j'ai dû résoudre

Toute l'appli repose sur une contrainte physique : chaque téléphone n'a qu'une seule radio Bluetooth, qui doit servir à la fois les propres écouteurs de l'utilisateur et la liaison entre les deux téléphones. Cette tension se cache derrière chaque décision de latence et de bande passante dans le code. Le premier vrai test, une voiture avec nous deux portant des écouteurs, a échoué exactement là-dessus : la congestion radio a fait grimper le temps d'aller-retour de 11 à 33 secondes sous la contention des deux liaisons. Pour corriger ça, il a fallu une porte vocale qui arrête de transmettre entre les phrases, un regroupement des trames, une baisse à 16 kbps, et enfin une isolation vocale par apprentissage automatique pour qu'une cabine silencieuse n'ait pas besoin d'un signal fort pour sonner clair. Régler l'annulation d'écho a demandé tout autant d'itérations, parce que dans une voiture, les sièges sont assez proches pour que la voix d'un invité se glisse dans l'oreille de son hôte.

La stack complète

  • Expo SDK 57 (bare workflow, expo-router)
  • React Native 0.86
  • React 19
  • TypeScript
  • Zustand
  • Swift (CoreBluetooth, AVAudioEngine)
  • Kotlin (BLE, L2CAP CoC, Oboe/AudioRecord)
  • Codec Opus (trames de 20ms, repli ADPCM)
  • RNNoise (isolation vocale par apprentissage automatique)
  • Wi-Fi Aware (mise à niveau pair-à-pair)
  • react-native-reanimated 4
  • expo-haptics
  • GitHub Actions CI