Aggiungere sintesi vocale a un'applicazione Delphi — per leggere ad alta voce una notifica, un messaggio generato da un LLM, o rendere accessibile un'interfaccia — è più semplice di quanto sembri, perché Windows include un motore di sintesi vocale già pronto all'uso. Per risultati più naturali, invece, oggi conviene appoggiarsi a un servizio cloud. Vediamo entrambe le strade.
La via più semplice: SAPI (Speech API di Windows)
Ogni installazione Windows include SAPI (Speech Application Programming Interface), accessibile da Delphi tramite interop COM, senza librerie esterne da installare. È il modo più rapido per aggiungere sintesi vocale a un'applicazione Windows desktop:
uses
ComObj, ActiveX;
procedure Leggi(const Testo: string);
var
Voce: OleVariant;
begin
Voce := CreateOleObject('SAPI.SpVoice');
Voce.Speak(Testo);
end;
Poche righe, nessuna dipendenza da installare, funziona offline. Il limite è la qualità: le voci SAPI predefinite di Windows sono comprensibili ma riconoscibilmente sintetiche, adatte a notifiche o accessibilità di base, meno a un'esperienza utente moderna o a contenuti rivolti al pubblico.
Voci naturali: le API cloud di sintesi vocale
I provider cloud principali (Azure AI Speech, Google Cloud Text-to-Speech, ElevenLabs, Amazon Polly) offrono voci basate su deep learning, quasi indistinguibili da una voce umana, con controllo su tono, velocità e persino emozione. Il prezzo da pagare è la dipendenza da una connessione internet e un costo per caratere/secondo generato.
Per un'applicazione Delphi, il modo più pulito per integrare una di queste API è tramite chiamate REST — coerente con l'approccio che usiamo per qualunque integrazione HTTP nei nostri gestionali, sfruttando la libreria RESTRequest4Delphi:
uses
RESTRequest4D, System.JSON;
function SintetizzaVoceCloud(const Testo, ApiKey: string): TBytes;
var
Richiesta: IRequest;
Risposta: IResponse;
Corpo: TJSONObject;
begin
Corpo := TJSONObject.Create;
try
Corpo.AddPair('text', Testo);
Corpo.AddPair('voice', 'it-IT-Standard');
Richiesta := TRequest.New
.BaseURL('https://api.provider-tts.esempio/v1/synthesize')
.Header('Authorization', 'Bearer ' + ApiKey)
.Accept('audio/mpeg')
.AddBody(Corpo.ToJSON);
Risposta := Richiesta.Post;
Result := Risposta.ContentBytes;
finally
Corpo.Free;
end;
end;
L'URL sopra è un placeholder illustrativo: ogni provider ha un proprio endpoint, formato di autenticazione (API key nell'header o OAuth) e schema JSON — la struttura della chiamata resta però sempre questa: corpo con il testo da sintetizzare, header di autenticazione, risposta in bytes audio da salvare o riprodurre.
Il pattern completo: LLM che scrive, TTS che legge
Una pipeline "LLM + TTS" tipica funziona in due passaggi indipendenti, orchestrati dall'applicazione Delphi:
- Si invia un prompt a un LLM (via API REST, stesso approccio di RESTRequest4Delphi mostrato sopra) e si riceve testo generato
- Il testo generato viene passato al motore TTS (locale con SAPI, o cloud) per essere convertito in audio
Questo disaccoppiamento è deliberato e vantaggioso: si può cambiare provider LLM o motore TTS indipendentemente, e si può anche mostrare il testo scritto mentre l'audio viene generato in background, così l'utente non aspetta entrambe le chiamate in sequenza per vedere una risposta.
Riproduzione dell'audio in Delphi
Una volta ottenuti i byte audio (da SAPI direttamente, o come file scaricato da un'API cloud), la riproduzione più semplice su Windows usa l'API PlaySound di MMSystem per un file salvato su disco, oppure componenti dedicati (es. TMediaPlayer della VCL, da posizionare a design time secondo le convenzioni di progetto) per uno streaming più controllato con pausa/stop.
Quale scegliere
Per notifiche interne, accessibilità di base o funzionalità offline, SAPI resta la scelta più pragmatica: zero dipendenze, zero costi ricorrenti. Per qualunque funzionalità rivolta al cliente finale dove la qualità della voce è parte dell'esperienza — un assistente vocale, contenuti audio generati, un chatbot che "parla" — conviene investire in un'API cloud fin dall'inizio: la differenza di naturalezza percepita dall'utente è enorme.