Blog
Build in Public
28 mars 20269 min

Personnalisation vocale IA : ton assistant te connait enfin

Un assistant vocal qui ne te connaît pas, c'est un outil. Un assistant qui sait que tu as trois enfants, que tu gères une équipe terrain et que "le truc" veut dire la commande de matériel de mardi — c'est un partenaire. À deux jours du lancement public de TAMSIV, j'ai ajouté la personnalisation vocale : configure ton IA par la voix, choisis ta voix TTS parmi 6 options, et l'assistant s'adapte à ton contexte. 1800 lignes de code, un bug WebSocket mémorable, et une réflexion de fond sur ce qui fait la différence entre un assistant générique et un assistant personnel.

Points clés à retenir :
- La personnalisation par contexte vocal transforme un assistant générique en outil personnel — l'utilisateur parle naturellement, l'IA comprend les références implicites.
- Le choix de voix TTS est intime : proposer 6 options avec preview temps réel augmente l'attachement à l'app.
- Quand deux écrans partagent le même WebSocket, un système de "propriétaire actif" évite les conflits de callbacks.
- La personnalisation IA est un levier de monétisation naturel pour un modèle freemium (contexte basique gratuit, complet en Pro).
Personne parlant dans un smartphone avec visualisation d'ondes sonores colorées
Configurer son IA par la voix : parler de soi pour que l'assistant comprenne ton quotidien.

Pourquoi la personnalisation change-t-elle fondamentalement l'expérience d'un assistant vocal ?

Depuis octobre, l'IA de TAMSIV comprenait ce que tu disais. Elle créait des tâches, des mémos, des événements d'agenda. Elle répondait poliment. Mais elle ne te connaissait pas.

Tu pouvais lui dire "rappelle-moi d'acheter du lait" et elle le faisait. Mais si tu lui disais "rappelle-moi le truc pour les enfants", elle ne savait pas que tu avais des enfants, ni combien, ni ce que "le truc" voulait dire dans ton quotidien. C'est la différence fondamentale entre un outil de commande vocale et un assistant personnel.

Les recherches de Nielsen Norman Group sur la personnalisation montrent que les interfaces personnalisées augmentent l'engagement de 40% en moyenne. Pour un assistant vocal, l'impact est encore plus fort : la personnalisation élimine le besoin de tout expliciter à chaque interaction.

C'est cette réflexion qui m'a poussé à ajouter cette feature à J-2 du lancement. Risqué ? Oui. Mais sans ça, TAMSIV aurait été "encore un assistant vocal". Avec ça, il devient ton assistant vocal.

Comment fonctionne la configuration de l'IA par la voix ?

Un nouveau bouton est apparu sur l'écran du dictaphone : "Configurer mon IA". Tu appuies, tu parles, et tu lui expliques qui tu es.

"Je suis parent de 3 enfants, je gère une équipe de 4 personnes dans une entreprise de nettoyage, et j'oublie tout ce qu'on me dit après 30 secondes."

L'IA écoute via le pipeline vocal, transcrit, puis résume ton contexte en quelques points structurés. Ce résumé est stocké dans ton profil Supabase et injecté dans le system prompt à chaque conversation.

Le processus technique en détail

  1. Capture vocale : le même STT natif que le dictaphone principal (avec fallback Deepgram si nécessaire).
  2. Extraction de contexte : un LLM via OpenRouter analyse la transcription et extrait les informations structurées (situation familiale, profession, habitudes, préférences).
  3. Stockage : le contexte est sauvegardé dans le profil utilisateur via Supabase, pas en local — il suit l'utilisateur sur tous ses appareils.
  4. Injection : à chaque nouvelle conversation WebSocket, le contexte est ajouté au system prompt du LLM. L'IA "sait" qui tu es dès le premier mot.

À partir de là, chaque réponse est adaptée. Si tu parles de "le petit", elle sait que tu parles de ton fils. Si tu dis "le chantier de mardi", elle sait que tu gères des interventions terrain. C'est la différence entre un assistant générique et un assistant qui te connaît.

Pourquoi proposer 6 voix TTS et comment choisir la bonne ?

Six enceintes disposées en cercle émettant des lumières de couleurs différentes représentant différents timbres de voix
Chaque utilisateur a une préférence de voix — le choix est personnel et affecte directement l'attachement à l'app.

La voix, c'est intime. Entendre la même voix robotique 50 fois par jour, ça finit par agacer. Pire : une voix qui ne te plaît pas crée une friction inconsciente à chaque utilisation. Tu évites d'utiliser l'app, sans savoir exactement pourquoi.

J'ai ajouté un sélecteur de voix TTS avec 6 options différentes — masculines, féminines, tons variés. Les 6 voix proviennent d'OpenAI TTS (modèle Nova par défaut), qui offre la meilleure qualité naturelle du marché pour la synthèse vocale.

L'expérience de sélection

Tu appuies sur une voix, tu entends une preview en temps réel ("Bonjour, je suis votre assistant TAMSIV..."), et tu choisis. C'est stocké dans ton profil et utilisé pour toutes les réponses vocales. Le changement est instantané — pas besoin de redémarrer l'app ou de reconnecter le WebSocket.

Ce détail UX semble mineur, mais il a un impact mesurable. Selon les recherches de Voicebot.ai, les utilisateurs qui choisissent leur voix d'assistant utilisent celui-ci 60% plus souvent que ceux qui gardent la voix par défaut. Le choix crée un sentiment d'appropriation.

Comment résoudre un conflit WebSocket entre deux écrans qui partagent le même canal ?

Développeur débuggant du code sur deux écrans de nuit avec logs de connexion WebSocket
3 heures de debug pour un conflit de callbacks entre deux écrans partageant le même WebSocket.

Le bug qui a coûté 3 heures. L'écran de configuration IA et le dictaphone partagent le même canal WebSocket vers le backend. Quand tu testes ta voix dans le setup, le dictaphone en arrière-plan essayait aussi de traiter les callbacks audio. Résultat : les deux écrans se marchaient dessus.

Concrètement, voici ce qui se passait :

  1. L'utilisateur ouvre l'écran de configuration IA.
  2. Il teste une voix TTS — le backend envoie l'audio via WebSocket.
  3. Le dictaphone en arrière-plan reçoit aussi le callback audio.
  4. Les deux écrans essaient de jouer le même son simultanément.
  5. Sur certains modèles Android où le garbage collector est agressif, l'AudioPlayerService crash silencieusement.

La solution : système de "propriétaire actif"

Quand l'écran de setup est ouvert, il prend le contrôle exclusif du WebSocket. Le dictaphone attend son tour. Le pattern est simple :

  • Un flag activeOwner: 'dictaphone' | 'setup' | null dans le state global.
  • Chaque callback WebSocket vérifie le propriétaire avant de traiter le message.
  • La transition de propriété est atomique — pas de fenêtre où les deux écrans écoutent.

Simple en théorie, 3 heures de debug en pratique. Le conflit ne se manifestait que sur certains appareils, ce qui rendait la reproduction difficile. C'est le genre de bug que tu ne trouves qu'en testant sur de vrais appareils — pas dans un émulateur.

Comment intégrer la personnalisation dans un modèle freemium ?

La personnalisation IA fait maintenant partie des fonctionnalités différenciantes dans les plans d'abonnement RevenueCat :

  • Plan gratuit : contexte basique (nom, langue). L'IA sait comment tu t'appelles, c'est tout.
  • Plan Pro : contexte complet (situation perso, profession, habitudes) + choix de voix TTS. L'IA te connaît vraiment.
  • Plan Team : tout Pro + contexte de groupe (équipe, projets, terminologie métier). L'IA connaît ton équipe.

C'est un levier de monétisation naturel. La personnalisation est la feature qui crée le plus d'attachement — une fois que ton IA te connaît, tu ne veux plus revenir à un assistant générique. C'est exactement le type de feature gate que recommande la stratégie freemium pour les apps de productivité.

Quel est l'impact sur l'architecture backend ?

L'ajout de la personnalisation a nécessité 1800 lignes de code réparties sur le frontend et le backend. Côté backend Node.js, les modifications principales :

  • System prompt dynamique : le contexte utilisateur est chargé depuis Supabase à chaque connexion WebSocket et injecté dans le prompt. Cache en mémoire pour éviter un appel DB à chaque message.
  • Endpoint de preview TTS : un nouveau endpoint WebSocket dédié aux previews de voix, isolé du flux de conversation principal.
  • Validation de contexte : le LLM qui extrait le contexte filtre les informations sensibles (numéros, adresses) — seules les informations structurelles sont conservées.

Le système d'historique de conversations a aussi été mis à jour pour inclure le contexte dans les metadata — ce qui permet de voir quand et comment le contexte a été modifié.

730+ commits, à J-2 du lancement : était-ce le bon moment pour cette feature ?

C'était la dernière fonctionnalité avant le lancement public. L'app sait maintenant à qui elle parle. Il reste le polish final, les derniers tests sur les appareils des bêta-testeurs, et le grand saut.

Ajouter une feature majeure à J-2, c'est risqué. Mais la personnalisation est le type de feature qui transforme l'expérience complète de l'app. Sans elle, TAMSIV aurait été un bon outil vocal. Avec elle, c'est un assistant qui te connaît. Et c'est ça qui fera la différence face aux alternatives comme Todoist.

Questions fréquentes

Les données de personnalisation sont-elles sécurisées ?

Oui. Le contexte est stocké dans Supabase avec les mêmes politiques RLS (Row Level Security) que toutes les données utilisateur. Seul l'utilisateur authentifié peut lire ou modifier son contexte. Le LLM qui extrait le contexte filtre automatiquement les informations sensibles (numéros de téléphone, adresses) — seules les informations structurelles sont conservées.

Peut-on modifier ou supprimer son contexte après l'avoir configuré ?

Oui, à tout moment. Le bouton "Configurer mon IA" permet de réenregistrer un nouveau contexte qui remplace l'ancien. Un bouton "Réinitialiser" supprime complètement le contexte et revient au mode assistant générique.

Pourquoi OpenAI TTS plutôt que Google ou Azure pour la synthèse vocale ?

Après avoir testé les trois, OpenAI TTS (modèle Nova) offre la voix la plus naturelle en français. Google TTS est bon mais légèrement plus robotique. Azure est excellent en anglais mais moins convaincant en français. Le coût est comparable (~0.015 EUR/1000 caractères pour OpenAI).

Le conflit WebSocket peut-il se reproduire avec d'autres écrans ?

Le système de propriétaire actif est générique — il protège contre tout conflit entre écrans partageant le même canal. Si un futur écran a besoin du WebSocket, il suffit d'ajouter une valeur au type activeOwner et de respecter le protocole d'acquisition/libération.

La personnalisation fonctionne-t-elle dans toutes les langues supportées ?

Oui. L'extraction de contexte utilise un LLM multilingue via OpenRouter. Tu peux configurer ton IA en français, anglais, allemand, espagnol, italien ou portugais — le contexte est stocké dans la langue où tu l'as dicté et utilisé tel quel dans le system prompt.