Notes vocales avec l'IA : comment BillableMe transforme l'audio en texte avec Whisper

En tant que freelance, les meilleures idées viennent en voiture ou sur le chantier, précisément quand taper du texte est impossible. C’est pourquoi BillableMe a reçu des notes vocales : vous dictez une tâche, un rappel ou une note, et une demi-minute plus tard le texte apparaît, consultable. Voici comment je m’y suis pris.

Les exigences

  • L’audio reste sur mon propre serveur, sans service de transcription externe.
  • Néerlandais et anglais, avec détection automatique de la langue.
  • Pas de GPU : le tout doit tourner sur le Docker Swarm existant.
  • L’utilisateur n’attend jamais la transcription.

Étape 1 : enregistrer en Flutter

L’application enregistre avec le package record en AAC (m4a), demande l’autorisation du microphone et vous laisse choisir directement une catégorie, un drapeau et un titre. Le fichier part vers l’API NestJS en upload multipart. Dès cet instant, la note apparaît dans la liste avec le statut « en traitement ».

Étape 2 : une file d’attente plutôt qu’une attente

L’API stocke le fichier audio sur un volume partagé, crée un enregistrement dans PostgreSQL et place un job dans une file Bull sur Redis. L’appel HTTP se termine ainsi en une fraction de seconde. Un worker reprend le job, appelle le service de transcription et réessaie jusqu’à trois fois avec des délais croissants en cas d’erreur. Le statut passe de pending à processing, puis à completed ou failed.

Étape 3 : un service Whisper auto-hébergé en Python

La transcription elle-même se fait dans un petit service FastAPI qui exécute OpenAI Whisper. J’ai choisi le modèle base : 74 Mo, environ 30 secondes par minute d’audio sur CPU, et largement suffisant pour des notes dictées en néerlandais et en anglais. La taille du modèle est une variable d’environnement, ce qui permet de passer à small ou medium si le matériel le permet. ffmpeg est inclus dans le conteneur pour décoder le m4a.

Étape 4 : retour dans l’application

Dès que le texte est en base de données, l’application l’affiche sous la note. Vous pouvez écouter l’enregistrement à une vitesse de 0,75 à 1,5, modifier la note, filtrer par catégorie ou par période et rechercher dans les transcriptions.

Ce que j’en ai retenu

  • Choisir le plus petit modèle qui suffit. Le modèle small est trois fois plus lent que base sur CPU ; pour de courtes notes dictées, base était amplement suffisant.
  • L’asynchrone n’est pas un luxe. Attendre trente secondes dans une application mobile paraît une éternité. Une file d’attente avec un statut visible rend cela naturel.
  • Garder l’audio en local. Un seul volume partagé entre l’API et le service Whisper suffit. Les enregistrements ne quittent jamais le serveur.

Vous souhaitez une fonction IA similaire dans votre propre application ? Contactez-moi.