mic Programmazione

Speech-to-Text in Delphi: trascrivere audio in testo

calendar_today personTeam EGSOFT schedule3 min di lettura

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

CriterioMotore locale (SAPI / whisper.cpp)API cloud
Costo per utilizzoNessuno (dopo il setup)Per minuto/secondo trascritto
Accuratezza su italianoSAPI: bassa · whisper.cpp: altaGeneralmente molto alta
PrivacyAudio non lascia mai il dispositivoAudio inviato a server terzi
Funziona offlineNo
Complessità di integrazioneMedia (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.

micAltri articoli su Programmazione grid_viewTutti gli articoli
Scrivici su WhatsApp