[#wpdev] Speech API: Text to Speech

Nell’ultimo post, ci siamo lasciati con tutte le indicazioni per gestire correttamente il Voice Command. Siamo qundi in grado di aprire la nostra applicazione con un comando vocale, arrivare ad una pagina ben definita ed eventualmente ricevere dei parametri in ingresso.

Ma per poter implementare uno degli scenari più interessanti su Windows Phone 8, l’In App Dialog, ci manca una parte fondamentale: il text to speech.

In Windows Phone 8, la sintesi vocale è demandata all’oggetto SpeechSyntesizer e precisamente al metodo SpeakTextAsync.

09-03-2013 00.08

Il metodo SpeakTextAsync accetta in ingresso il testo da sistetizzare, ed il device provvederà a leggerlo. Di default, il sintetizzatore userà la lingua ed il tipo di voce selezionati nelle impostazioni del sistema operativo:

wp_ss_20130309_0002 wp_ss_20130309_0003

09-03-2013 01.04Se l’impostazione di default non è quella che vogliamo, possiamo comunque configurare il sintetizzatore, impostando genere e lingua via codice.

Resta inteso che, prima di effettuare queste operazioni, dobbiamo verificare che la lingua desiderata sia installata nel sistema.

Per farlo, sarà necessario interrogare l’oggetto Windows.Phone.Speech.Synthesis.VoiceInformation alla ricerca del tipo di voce di cui abbiamo bisogno.

La lettura del testo passato come stringa, come è facile immaginare, non avrà cadenze o inflessioni particolari. Il testò verrà letto in modo abbastanza “piatto”. Sebbene la voce sia abbastanza naturale e va benissimo nella maggior parte dei casi, ci sono scenari in cui più essere necessario impostare il sintetizzatore per dare enfasi particolari, pause, voci diverse etc. Ovviamente, in questi casi, una semplice stringa non è sufficiente a descrivere correttamente il modo in cui vogliamo che il nostro testo venga letto. Ad aiutarci, in questi casi, c’è lo Speech Synthesis Markup Language (SSML). Usando un markup standardizzato, possiamo infatti passare al sintetizzatore non solo il testo da leggere ma anche il “modo” in cui il testo deve essere letto. Un elenco completo degli elementi utilizzabili è consultabile qui.

Una volta “costruito” il nostro elemento vocale, dobbiamo passarlo al sintetizzatore in modo che possa essere letto dal dispositivo. Per farlo, abbiamo a disposizione 2 metodi:

  • SpeakSsmlAsync: a qui passiamo il nostro xml
  • SpeakSsmlFromUriAsync: a cui passiamo il path del file da riprodurre.

Ad esempio:

09-03-2013 11.04

Il primo caso, è utile soprattutto quando dobbiamo costruire a runtime il messaggio da far leggere al sintetizzatore. Il secondo invece, torna estremamente comodo per salvare tutte le frasi statiche che la nostra applicazione dovrà gestire.

Per scenari più complessi, lo SpeechSyntesizer, ci fornisce anche 2 eventi che possiamo gestire:

  • SpeechStarted: viene sollevato quando il dispositivo inizia a sintetizzare il testo
  • BookmarkReached: è utilizzabile solo quando usiamo lo SpeakSsml e viene sollevato quando raggiungiamo l’elemento <mark> nel nostro file.

Sebbene alquanto semplice, l’implementazione del Text to Speech su Windows Phone ci permette di implementare scenari abbastanza evoluti e, come specificato all’inizio, è parte fondamentale dello scenario di In App Dialog.

Nel prossimo post vedremo il terzo pilastro fondamentale, ovvero il riconoscimento vocale e poi passeremo a mettere tutto insieme per realizzare un vero e proprio dialogo con la nostra applicazione.

,