In questo articolo impariamo a "dare voce" ad una applicazione web utilizzando la libreria Speech API (SAPI) di Microsoft. Negli ultimi anni il riconoscimento vocale la sintesi vocale hanno avuto una forte diffusione. Il mercato, specie in quello dei servizi telefonici e dell'help desk, vede queste tecnologie impiegate nella gestione delle interfacce automatiche per applicazioni vocali.
Con librerie come SAPI di Microsoft o Sphinx, un framework opensource totalmente scritto in Java, diventa più semplice avvicinarsi a questa tecnologia. Nel nostro caso utilizziamo proprio il prodotto Microsoft per realizzare un esempio di sintesi vocale (TTS, text to speech) all'interno di applicazioni ASP.NET.
Speech API
Lo standard SAPI 5 fornisce un'interfaccia ad alto livello tra l'applicazione e lo "speech engine". Risulta così più semplice sfruttare la potenza dei due motori (SAPI engine): il motore di sintesi vocale (TTS - text to speech) e il motore di riconoscimento vocale. Il motore TTS converte stringhe di testo in audio parlato utilizzando voci sintetiche, mentre il riconoscimento vocale converte l'audio parlato in stringhe di testo e file.
Per utilizzare Speech Api è necessario effettuare il download dal sito di Microsoft e l'installazione della libreria.
Oltre al download della libreria ci sono altri file a disposizione come la documentazione, gli esempi di codice ed i Language Pack per le lingue Giapponese o Cinese (per il Langage Pack Italiano bisogna attendere ancora).
La pratica
L'applicazione ASP.NET che vogliamo sviluppare è un semplice test interattivo di inglese. Solitamente i test multimediali linguistici interagiscono con l'utente attraverso l'audio.
Il nostro esercizio propone all'utente un testo scritto che riporta una frase in lingua Inglese da completare digitando la parola mancante. Se l'utente inserisce la parola corretta la pagina Asp.net dovrà pronunciare "CORRECT!" altrimenti "WRONG!".
Apriamo Visual Studio 2005 oppure VWD e creiamo un nuovo sito web. Per poter utilizzare la libreria dobbiamo aggiungere il riferimento all'interno del nostro progetto. Lo facciamo selezionando il menu Sito Web>aggiungi Riferimento e cliccando, nella cartella "Com", su "Microsoft Speech Object Library".
Una volta fatto possiamo verificare la presenza della libreria Interop.SpeechLib.dll
nella cartella Bin del progetto
Aggiungiamo al progetto una pagina web e la chiamiamo "Default.aspx". La pagina conterrà il testo dell'esercizio, una textbox per l'inserimento della parola mancante, una label per visualizzare l'esito del test all'utente e il pulsante per la Conferma dell'esercizio.
Passiamo alla scrittura del codice. La prima cosa da fare è includere il namespace SpeechLib
per poter utilizzare le funzioni della DLL. Poi istanziamo un oggetto di classe SpVoice
e lo assegnamo alla variabile voce
. Infine scriviamo la procedura da assegnare al click sul bottone.
Listato 1. Impostare la risposta vocale (Versione VB.NET)
using SpeechLib;
public partial class _Default : System.Web.UI.Page
{
// istanza di SpVoice
protected SpVoice voce = new SpVoice();
protected void btnConferma_Click(object sender, EventArgs e)
{
if (tbRisposta.Text.ToLower() == "arrived")
{
voce.Speak("correct!", SpeechVoiceSpeakFlags.SVSFDefault);
lblEsito.Text = "CORRECT";
}
else
{
voce.Speak("wrong!", SpeechVoiceSpeakFlags.SVSFDefault);
lblEsito.Text = "WRONG! The word is <strong>ARRIVED</strong>";
}
}
}
Il codice che abbiamo scritto è semplicissimo, se la parola digitata dall'utente è corretta, utilizziamo il metodo Speak()
della variabile voce
passandogli come argomento il testo da pronunciare, ovvero la stringa "CORRECT". In caso di esito negativo la voce pronuncerà "WRONG!".
Ora non ci resta che accendere le casse del PC, ed eseguire la pagina. Dobbiamo eseguire l'esercizio di Inglese e cliccare sul pulsante "Conferma". La voce sintetica di "Mike" ci rivelerà l'esito del test.
Cambiare Speaker
Abbiamo utilizzato la voce di default "Mary", ce ne sono altre a disposizione e le possiamo scegliere seguendo pochi passaggi.
Aggiungiamo una nuova pagina al progetto web e nominiamola "voci.aspx". Nella pagina inseriamo solamente un ListBox
.
Importiamo il namespace SpeechLib
e dichiariamo voce
, oggetto della ormai familiare classe SpVoice
. Utilizzeremo anche una variabile ObjTok
, interfaccia IspeechObjectToken
, che ci servirà per recuperare l'insieme delle voci disponibili e popolare il ListBox
.
Quando l'utente seleziona uno degli speaker nella lista, il programma risponde recitando il nome del personaggio.
Listato 2. Selezione dello speaker (Versione VB.NET)
using SpeechLib;
public partial class voci : System.Web.UI.Page
{
private SpVoice voce = new SpVoice();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// popoliamo la lista
foreach(ISpeechObjectToken ObjTok in voce.GetVoices("",""))
lbPersonaggi.Items.Add(ObjTok.GetDescription(0));
}
}
protected void lbPersonaggi_SelectedIndexChanged(object sender, EventArgs e)
{
voce.Voice = voce.GetVoices("","").Item(lbPersonaggi.SelectedIndex);
voce.Speak(voce.Voice.GetDescription(0), SpeechVoiceSpeakFlags.SVSFDefault);
}
}
Nella variabile di tipo SpVoice
viene memorizzata la voce del personaggio scelto e viene eseguito l'audio della voce scelta.
Conclusioni
Gli esempi illustrati sono molto semplici e vogliono essere uno spunto per approfondire le moltissime possibilità offerte dalla sintesi e dal riconoscimento vocale. Sono molte le specifiche (come VoiceXML) i prodotti sul mercato e i tool per sviluppatori.