Speech-to-Text (STT) è il processo inverso della sintesi vocale: trasformare audio parlato in testo scritto. Le applicazioni pratiche in un gestionale aziendale sono più numerose di quanto sembri — dettatura di note durante una trattativa, trascrizione automatica di chiamate di assistenza, comandi vocali per operatori che hanno le mani occupate (es. in magazzino). Vediamo le opzioni disponibili per un'applicazione Delphi.
Riconoscimento vocale nativo: SAPI e Windows Speech Recognition
Come per la sintesi vocale, Windows include un motore di riconoscimento vocale nativo accessibile via COM (SAPI.SpSharedRecognizer). Il vantaggio è lo stesso: funziona offline, senza dipendenze esterne o costi per minuto. Il limite, altrettanto reale, è l'accuratezza: su italiano, accenti regionali marcati o ambienti rumorosi, il motore nativo Windows è nettamente meno preciso dei motori moderni basati su deep learning.
Whisper: il modello open-weight che ha cambiato le cose
Whisper, il modello di riconoscimento vocale rilasciato come open-weight, ha reso disponibile un'accuratezza prima riservata alle API cloud a pagamento, eseguibile anche localmente. Per un'applicazione Delphi ci sono due strade per usarlo:
- Whisper via API cloud — la strada più semplice: si invia l'audio a un endpoint REST e si riceve il testo trascritto, senza gestire modelli o hardware localmente
- whisper.cpp in locale — un'implementazione C++ di Whisper ottimizzata per girare anche su CPU modeste, richiamabile da Delphi come DLL esterna tramite dichiarazioni
external, per trascrizione completamente offline e senza costi per minuto
Esempio: trascrizione via API REST
Come per il TTS, l'integrazione più pulita in un progetto Delphi che già usa RESTRequest4Delphi per le chiamate HTTP è inviare il file audio come multipart e ricevere il testo in risposta:
uses
RESTRequest4D, System.JSON;
function TrascriviAudio(const PercorsoFileAudio, ApiKey: string): string;
var
Richiesta: IRequest;
Risposta: IResponse;
Json: TJSONObject;
begin
Richiesta := TRequest.New
.BaseURL('https://api.provider-stt.esempio/v1/transcriptions')
.Header('Authorization', 'Bearer ' + ApiKey)
.AddFile('file', PercorsoFileAudio)
.AddField('language', 'it');
Risposta := Richiesta.Post;
Json := TJSONObject.ParseJSONValue(Risposta.Content) as TJSONObject;
try
Result := Json.GetValue('text');
finally
Json.Free;
end;
end;
Come per l'esempio TTS, l'URL è illustrativo: ogni provider (OpenAI Whisper API, Azure AI Speech, Google Cloud Speech-to-Text) ha un proprio endpoint e formato di risposta, ma la forma della chiamata — file audio in ingresso, testo in uscita — resta la stessa.
Cattura audio dal microfono in Delphi
Prima di poter trascrivere qualcosa, serve registrarlo. Su Windows, l'API waveIn di MMSystem permette di catturare audio dal microfono a basso livello; per un progetto più moderno, librerie di terze parti come Bass o componenti VCL dedicati offrono un'interfaccia più semplice per avviare/fermare la registrazione e salvare il risultato in un file .wav, formato accettato dalla quasi totalità delle API di trascrizione.
Locale o cloud: come scegliere
| Criterio | Motore locale (SAPI / whisper.cpp) | API cloud |
|---|---|---|
| Costo per utilizzo | Nessuno (dopo il setup) | Per minuto/secondo trascritto |
| Accuratezza su italiano | SAPI: bassa · whisper.cpp: alta | Generalmente molto alta |
| Privacy | Audio non lascia mai il dispositivo | Audio inviato a server terzi |
| Funziona offline | Sì | No |
| Complessità di integrazione | Media (SAPI) / medio-alta (whisper.cpp) | Bassa (una chiamata REST) |
Per dati sensibili (es. trascrizione di conversazioni con clienti soggette a normativa privacy) un motore locale come whisper.cpp è spesso la scelta più difendibile: l'audio non lascia mai l'infrastruttura aziendale, un vantaggio che nessuna API cloud, per quanto accurata, può offrire.