Personnalisation vocale IA : ton assistant te connait enfin
Un assistant vocal qui ne te connait pas, c'est un outil. Un assistant qui sait que tu as trois enfants, que tu geres une equipe terrain et que "le truc" veut dire la commande de materiel de mardi — c'est un partenaire. A deux jours du lancement public de TAMSIV, j'ai ajoute la personnalisation vocale : configure ton IA par la voix, choisis ta voix TTS parmi 6 options, et l'assistant s'adapte a ton contexte. 1800 lignes de code, un bug WebSocket memorable, et une reflexion de fond sur ce qui fait la difference entre un assistant generique et un assistant personnel.
Points cles a retenir :
- La personnalisation par contexte vocal transforme un assistant generique en outil personnel — l'utilisateur parle naturellement, l'IA comprend les references implicites.
- Le choix de voix TTS est intime : proposer 6 options avec preview temps reel augmente l'attachement a l'app.
- Quand deux ecrans partagent le meme WebSocket, un systeme de "proprietaire actif" evite les conflits de callbacks.
- La personnalisation IA est un levier de monetisation naturel pour un modele freemium (contexte basique gratuit, complet en Pro).
Pourquoi la personnalisation change-t-elle fondamentalement l'experience d'un assistant vocal ?
Depuis octobre, l'IA de TAMSIV comprenait ce que tu disais. Elle creait des taches, des memos, des evenements d'agenda. Elle repondait 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 difference fondamentale entre un outil de commande vocale et un assistant personnel.
Les recherches de Nielsen Norman Group sur la personnalisation montrent que les interfaces personnalisees augmentent l'engagement de 40% en moyenne. Pour un assistant vocal, l'impact est encore plus fort : la personnalisation elimine le besoin de tout expliciter a chaque interaction.
C'est cette reflexion qui m'a pousse a ajouter cette feature a J-2 du lancement. Risque ? Oui. Mais sans ca, TAMSIV aurait ete "encore un assistant vocal". Avec ca, il devient ton assistant vocal.
Comment fonctionne la configuration de l'IA par la voix ?
Un nouveau bouton est apparu sur l'ecran du dictaphone : "Configurer mon IA". Tu appuies, tu parles, et tu lui expliques qui tu es.
"Je suis parent de 3 enfants, je gere une equipe de 4 personnes dans une entreprise de nettoyage, et j'oublie tout ce qu'on me dit apres 30 secondes."
L'IA ecoute via le pipeline vocal, transcrit, puis resume ton contexte en quelques points structures. Ce resume est stocke dans ton profil Supabase et injecte dans le system prompt a chaque conversation.
Le processus technique en detail
- Capture vocale : le meme STT natif que le dictaphone principal (avec fallback Deepgram si necessaire).
- Extraction de contexte : un LLM via OpenRouter analyse la transcription et extrait les informations structurees (situation familiale, profession, habitudes, preferences).
- Stockage : le contexte est sauvegarde dans le profil utilisateur via Supabase, pas en local — il suit l'utilisateur sur tous ses appareils.
- Injection : a chaque nouvelle conversation WebSocket, le contexte est ajoute au system prompt du LLM. L'IA "sait" qui tu es des le premier mot.
A partir de la, chaque reponse est adaptee. 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 geres des interventions terrain. C'est la difference entre un assistant generique et un assistant qui te connait.
Pourquoi proposer 6 voix TTS et comment choisir la bonne ?
La voix, c'est intime. Entendre la meme voix robotique 50 fois par jour, ca finit par agacer. Pire : une voix qui ne te plait pas cree une friction inconsciente a chaque utilisation. Tu evites d'utiliser l'app, sans savoir exactement pourquoi.
J'ai ajoute un selecteur de voix TTS avec 6 options differentes — masculines, feminines, tons varies. Les 6 voix proviennent d'OpenAI TTS (modele Nova par defaut), qui offre la meilleure qualite naturelle du marche pour la synthese vocale.
L'experience de selection
Tu appuies sur une voix, tu entends une preview en temps reel ("Bonjour, je suis votre assistant TAMSIV..."), et tu choisis. C'est stocke dans ton profil et utilise pour toutes les reponses vocales. Le changement est instantane — pas besoin de redemarrer l'app ou de reconnecter le WebSocket.
Ce detail 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 defaut. Le choix cree un sentiment d'appropriation.
Comment resoudre un conflit WebSocket entre deux ecrans qui partagent le meme canal ?
Le bug qui a coute 3 heures. L'ecran de configuration IA et le dictaphone partagent le meme canal WebSocket vers le backend. Quand tu testes ta voix dans le setup, le dictaphone en arriere-plan essayait aussi de traiter les callbacks audio. Resultat : les deux ecrans se marchaient dessus.
Concretement, voici ce qui se passait :
- L'utilisateur ouvre l'ecran de configuration IA.
- Il teste une voix TTS — le backend envoie l'audio via WebSocket.
- Le dictaphone en arriere-plan recoit aussi le callback audio.
- Les deux ecrans essaient de jouer le meme son simultanement.
- Sur certains modeles Android ou le garbage collector est agressif, l'AudioPlayerService crash silencieusement.
La solution : systeme de "proprietaire actif"
Quand l'ecran de setup est ouvert, il prend le controle exclusif du WebSocket. Le dictaphone attend son tour. Le pattern est simple :
- Un flag
activeOwner: 'dictaphone' | 'setup' | nulldans le state global. - Chaque callback WebSocket verifie le proprietaire avant de traiter le message.
- La transition de propriete est atomique — pas de fenetre ou les deux ecrans ecoutent.
Simple en theorie, 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 emulateur.
Comment integrer la personnalisation dans un modele freemium ?
La personnalisation IA fait maintenant partie des fonctionnalites differenciantes 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 connait vraiment.
- Plan Team : tout Pro + contexte de groupe (equipe, projets, terminologie metier). L'IA connait ton equipe.
C'est un levier de monetisation naturel. La personnalisation est la feature qui cree le plus d'attachement — une fois que ton IA te connait, tu ne veux plus revenir a un assistant generique. C'est exactement le type de feature gate que recommande la strategie freemium pour les apps de productivite.
Quel est l'impact sur l'architecture backend ?
L'ajout de la personnalisation a necessite 1800 lignes de code reparties sur le frontend et le backend. Cote backend Node.js, les modifications principales :
- System prompt dynamique : le contexte utilisateur est charge depuis Supabase a chaque connexion WebSocket et injecte dans le prompt. Cache en memoire pour eviter un appel DB a chaque message.
- Endpoint de preview TTS : un nouveau endpoint WebSocket dedie aux previews de voix, isole du flux de conversation principal.
- Validation de contexte : le LLM qui extrait le contexte filtre les informations sensibles (numeros, adresses) — seules les informations structurelles sont conservees.
Le systeme d'historique de conversations a aussi ete mis a jour pour inclure le contexte dans les metadata — ce qui permet de voir quand et comment le contexte a ete modifie.
730+ commits, a J-2 du lancement : etait-ce le bon moment pour cette feature ?
C'etait la derniere fonctionnalite avant le lancement public. L'app sait maintenant a qui elle parle. Il reste le polish final, les derniers tests sur les appareils des beta-testeurs, et le grand saut.
Ajouter une feature majeure a J-2, c'est risque. Mais la personnalisation est le type de feature qui transforme l'experience complete de l'app. Sans elle, TAMSIV aurait ete un bon outil vocal. Avec elle, c'est un assistant qui te connait. Et c'est ca qui fera la difference face aux alternatives comme Todoist.
Questions frequentes
Les donnees de personnalisation sont-elles securisees ?
Oui. Le contexte est stocke dans Supabase avec les memes politiques RLS (Row Level Security) que toutes les donnees utilisateur. Seul l'utilisateur authentifie peut lire ou modifier son contexte. Le LLM qui extrait le contexte filtre automatiquement les informations sensibles (numeros de telephone, adresses) — seules les informations structurelles sont conservees.
Peut-on modifier ou supprimer son contexte apres l'avoir configure ?
Oui, a tout moment. Le bouton "Configurer mon IA" permet de reenregistrer un nouveau contexte qui remplace l'ancien. Un bouton "Reinitialiser" supprime completement le contexte et revient au mode assistant generique.
Pourquoi OpenAI TTS plutot que Google ou Azure pour la synthese vocale ?
Apres avoir teste les trois, OpenAI TTS (modele Nova) offre la voix la plus naturelle en francais. Google TTS est bon mais legerement plus robotique. Azure est excellent en anglais mais moins convaincant en francais. Le cout est comparable (~0.015 EUR/1000 caracteres pour OpenAI).
Le conflit WebSocket peut-il se reproduire avec d'autres ecrans ?
Le systeme de proprietaire actif est generique — il protege contre tout conflit entre ecrans partageant le meme canal. Si un futur ecran a besoin du WebSocket, il suffit d'ajouter une valeur au type activeOwner et de respecter le protocole d'acquisition/liberation.
La personnalisation fonctionne-t-elle dans toutes les langues supportees ?
Oui. L'extraction de contexte utilise un LLM multilingue via OpenRouter. Tu peux configurer ton IA en francais, anglais, allemand, espagnol, italien ou portugais — le contexte est stocke dans la langue ou tu l'as dicte et utilise tel quel dans le system prompt.