Note vocali con l'IA: così BillableMe trasforma l'audio in testo con Whisper

Da freelance, le idee migliori arrivano in auto o in cantiere, proprio quando non si può scrivere. Per questo BillableMe ha ora le note vocali: si detta un’attività, un promemoria o una nota e mezzo minuto dopo il testo è lì, ricercabile. Ecco come ho affrontato la cosa.

I requisiti

  • L’audio resta sul mio server, senza servizi di trascrizione esterni.
  • Olandese e inglese, con rilevamento automatico della lingua.
  • Nessuna GPU: deve funzionare sul Docker Swarm esistente.
  • L’utente non aspetta mai la trascrizione.

Passo 1: registrare in Flutter

L’app registra con il package record in AAC (m4a), chiede il permesso per il microfono e permette di scegliere subito una categoria, un contrassegno e un titolo. Il file viene inviato come upload multipart all’API NestJS. Da quel momento la nota compare nell’elenco, con lo stato «in elaborazione».

Passo 2: una coda invece dell’attesa

L’API salva il file audio su un volume condiviso, crea un record in PostgreSQL e inserisce un job in una coda Bull su Redis. La chiamata HTTP si conclude così in una frazione di secondo. Un worker prende in carico il job, chiama il servizio di trascrizione e, in caso di errore, riprova fino a tre volte con un tempo di attesa crescente. Lo stato passa da pending a processing, poi a completed o failed.

Passo 3: un servizio Whisper proprio in Python

La trascrizione vera e propria avviene in un piccolo servizio FastAPI con OpenAI Whisper. Ho scelto il modello base: 74 MB, circa 30 secondi per minuto di audio su una CPU, più che sufficiente per note parlate in olandese e in inglese. La dimensione del modello è una variabile d’ambiente, così posso passare a small o medium se l’hardware lo consente. ffmpeg è incluso nel container per decodificare gli m4a.

Passo 4: di nuovo nell’app

Appena il testo è nel database, l’app lo mostra sotto la nota. Si può riprodurre la registrazione a una velocità da 0,75 a 1,5 volte, modificare la nota, filtrare per categoria o periodo e cercare nelle trascrizioni.

Che cosa ho imparato

  • Scegliere il modello più piccolo che sia sufficiente. Su CPU il modello small è tre volte più lento di base; per brevi note parlate base era più che sufficiente.
  • L’asincrono non è un lusso. Trenta secondi di attesa in un’app mobile sembrano un’eternità. Una coda con uno stato visibile lo rende naturale.
  • Tenere l’audio in locale. Basta un volume condiviso tra l’API e il servizio Whisper. Le registrazioni non lasciano mai il server.

Vuole una funzione di IA simile nella Sua app? Mi contatti.