Pourquoi j'ai construit une API vocale pour que ma mère puisse commander un taxi à Lomé
L'histoire derrière KUMA — une API de détection d'intention vocale en Mina et Ewe. Pas une idée de startup. Une frustration réelle, observée dans ma propre famille.
Quand je vais à Lomé, je me déplace avec Gozem. Ma mère, elle, a un taxi attitré. Quand il n'est pas disponible, elle marche jusqu'à la voie principale pour en happer un autre.
Je lui ai installé Gozem. Je lui ai montré comment ça marche. Mais elle ne peut pas l'utiliser : elle ne lit pas le français, et l'interface n'existe pas en Mina. Alors c'est moi qui commande pour elle quand je suis là, et ma petite sœur quand je ne le suis pas.
À un moment, j'ai arrêté de trouver ça normal.
Pourquoi ce problème est plus dur qu'il n'y paraît
Le Mina, aussi appelé Gengbe, est parlé par environ 1,5 million de personnes au Togo et au Bénin. L'Ewe, sa langue sœur, par plusieurs millions de plus au Ghana, au Togo et au Bénin. Ce sont des langues tonales, avec une phonologie riche et une grammaire qui ne ressemble à rien dans les familles indo-européennes.
Des datasets existent, notamment pour l'Ewe. Mais ils reflètent une langue académique, propre, bien articulée. Pas le Mina tel qu'il est parlé dans la rue à Lomé : rapide, mélangé au français, truffé de contractions. C'est ce gap-là que je voulais combler.
Whisper d'OpenAI supporte l'Ewe de façon expérimentale. Les résultats sur du Mina naturel, parlé rapidement, avec des contractions et des emprunts au français, sont inutilisables.
Ce que j'ai décidé de construire
Je n'avais pas besoin d'un modèle de transcription généraliste. Ce qu'il me fallait était beaucoup plus ciblé : détecter l'intention dans un enregistrement vocal.
Si quelqu'un dit "moudji be mayi asigamé", ce qui signifie "je voudrais aller au grand marché", l'API doit retourner :
{
"intent": "book_ride",
"destination": "Grand marché de Lomé",
"language": "mina",
"confidence": 0.94
}
C'est tout. Le reste, c'est l'application qui s'en charge. Cette contrainte de scope n'est pas une limitation, c'est une décision d'architecture. Un modèle entraîné sur un domaine étroit et des données réelles battra toujours un modèle généraliste sur ce domaine précis. Et surtout, cette approche est intégrable dans n'importe quelle app existante sans refonte d'interface.
Construire le dataset
Le vrai problème n'était pas le modèle. C'était les données.
Il existait des corpus Ewe académiques, mais les gens qui commandent un taxi ne parlent pas comme dans un corpus académique. Ils parlent vite, ils mélangent les langues, ils abrègent. J'avais besoin d'enregistrements réels, dans des conditions réelles.
J'ai mandaté mon grand frère à Lomé pour constituer ce dataset. Nous avons aujourd'hui près de 3000 enregistrements. Les entraînements commencent bientôt.
Maman n'a pas encore commandé son taxi. Vivement ce jour-là.