LINGUAGGIO X+V di Salvatore Zita
Un' applicazione X+V di esempio.
Questa applicazione è un classico sondaggio realizzato attraverso un form da riempire. Laccesso multimodale al form permette di poter interagire
con lapplicazione sia con il mouse che con la voce e rispondere alle domande poste con tecniche di accesso complementari.
Lapplicazione è stata realizzata utilizzando lo strumento di sviluppo IBM Rational Software Development Platform integrato con il Multimodal Toolkit
versione 4.1.4.
Il file così realizzato (con estensione .mxml) puo girare sui normali browser xhtml e in tal caso lutente può interagire
solo attraverso le normali tecniche di interazione, oppure su di un browser multimodale in grado di interpretare sia la parte
XHTML sia quella in VoiceXML e in questa circostanza linterazione è multimodale. Il browser utilizzato per testare lapplicazione
è stato Opera versione 7.55 incluso nel pacchetto multimodal toolkit già citato. Tale browser attualmente supporta soltanto un
TTS e un ASR in lingua inglese. Ciò significa sostanzialmente che il browser può parlare solo linglese.
Di seguito verranno descritte le singole parti che costituiscono lapplicazione.
Nel linguaggio X+V il lingguaggio che ospita è lXHTML pertanto lintestazione di ogni applicazione è simile a quella che si
trova in una normale pagina XHTML o XML in genere.
Ecco un esempio di come si presentano in genere le prime righe di codice di una applicazione X+V:
La prima riga di codice inserita è la dichiarazione XML, segue la dichiarazione del DOCTYPE; questa ha lidentificatore
PUBLIC quindi bisogna far riferimento alla DTD allindirizzo:
http://www.voicexml.org/specs/multimodal/x+v/12/dtd/xhtml+voice12.dtd.
Lelemento radice dellintera applicazione è lelemento <html> che contiene gli attributi per la dichiarazione dei namespaces.
La prima dichiarazione è quella per il linguaggio XHTML che è assunto come namespace di default seguono le dichiarazioni dei
namespaces riguardanti gli altri linguaggi o moduli utilizzati nellapplicazione.
Lintestazione dei file html è usata anche qui con il medesimo scopo. In particolare in X+V il tag <head> diventa il contenitore di
tutta quella che è la parte vocale del progetto, ossia quella scritta nel linguaggio VoiceXML, assieme alla parte di sincronizzazione.
Questa è quella che non viene interpretata nel caso si utilizzi un browser non multimodale che interpreta solo la parte di codice
scritta in xhtml. La chiusura del tag indica quindi, implicitamente, linizio della parte visuale in xhtml.
Il tag <title> funziona come in un normale documento html in pratica serve a dare un titolo allapplicazione. Titolo che verrà mostrato
in cima alla finestra del browser.
La parte vocale può essere composta di tutti gli elementi presenti nel modulo vxml indicato nel namespace. Tutti questi dovranno
essere preceduti dal prefisso vxml: in accordo con la dichiarazione del namespace.
In questa applicazione la parte vocale è tutta contenuta in un unico elemento <form>, ma è ovvio che questa scelta può variare a seconda
delle necessità del programmatore ed è quindi possibile anche linserimento di più elementi <form> indipendenti.
Usualmente si preferisce utilizzare lo schema con un unico elemento <form> e un insieme di campi <filed> quando vi è la necessità di dover
sincronizzare la parte vocale con quella visiva. Quando invece è un evento ben definito ad attivare la parte vocale, conviene utilizzare
tanti elementi <form> indipendenti che poi potranno essere richiamati ad arte attraverso un handler.
Nellapplicazione in questione levento di load, che si ha al caricamento della pagina nel browser, attiva lunico elemento <form> presente cioè fa
saltare il FIA ad interpretare la parte vocale.
Una volta entrati nel form il browser legge il contenuto dellelemento <block> ovvero esegue un file audio pre-registrato.
Il form contiene tutti gli elementi field ognuno dei quali riguarda un campo che lutente è chiamato a riempire. Lattributo xv:id è
un attributo appartenente al modulo per la sincronizzazione (ecco perchè ha il prefisso xv: ), in particolare esso serve a dare un
identificatore univoco necessario per sincronizzare la parte vocale con la parte visuale.
La prima cosa da fare quando si mette lutente di fronte ad una scelta è la definizione di una grammatica, ossia di un dizionario delle
possibili parole o frasi che possono essere pronunciate dallutente e ben interpretate dalla macchina. Le grammatiche possono essere scritte
in più linguaggi in parte equivalenti; quello standard a cui fa riferimento il consorzio W3C è il linguaggio SRGS, un altro forse più
immediato, ma con le stesse potenzialità è JSGF. E possibile realizzare grammatiche esterne scrivendole in file indipendenti dallapplicazione
multimodale e poi richiamarle attraverso lattributo src nellelemento <grammar>. Al contrario grammatiche meno articolate possono essere
sviluppate nello stesso file mxml allinterno dellelemento <grammar>.
Nellesempio mostrato ce un commento di comè possibile richiamare grammatiche esterne, tuttavia si è scelto di utilizzare grammatiche interne.
Lelemento <prompt>, figlio di <field>, svolge la stessa funzione di <block> in <form>: il browser legge ciò che è contenuto
al loro interno.
Lelemento <catch> correlato dellattributo event serve per definire unazione che linterprete deve compiere al verificarsi dellevento specificato.
Nell esempio mostrato gli eventi sono:
help che accade quando lutente pronuncia la parola help durante lesecuzione dellapplicazione;
nomatch che accade quando lutente da una risposta che non è tra quelle possibili ovvero tra quelle definite nella grammatica;
noinput che si verifica quando lutente non da alcuna risposta, o nessuna risposta viene ascoltata dal browser.
Lattributo count serve a differenziare il contenuto di <catch> se gli stessi eventi si ripetono più volte, ad esempio se levento noinput si verifica
due volte di seguito la prima volta il browser chiederà allutente di rispondere alla domanda, la seconda volta elencherà alcune possibili scelte.
Lelemento field nellapplicazione in analisi viene utilizzato ogni volta che cè una domanda a cui lutente può rispondere in maniera
complementare vale a dire sia con il mouse sia con la voce. Tuttavia la struttura dellelemento, ovvero gli elementi in esso compresi,
non varia per nulla o varia di molto poco.
E comunque bene fare alcune precisazioni.
Nella situazione in cui lutente ha la possibilità di rispondere alla stessa domanda in maniera diversa, in altre parole se può dare attraverso
la voce lo stesso input in maniera differente, va usata una particolare sintassi. Ad esempio nella grammatica riportata sopra lutente può
rispondere alla domanda sullo stato civile widow oppure widower a seconda del proprio sesso. E ovvio che il risultato deve comunque essere lo
stesso cioè la variabile riferita allo stato civile deve essere riempita con lo stesso valore sia che si tratti di un uomo che se si tratti di
una donna.
La sintassi utilizzata è : widower{$=widow} che significa: se lutente risponde pronunciando la parola widower la variabile di pertinenza andrà
riempita con il valore widow.
In una circostanza monomodale questo artificio non ha molto senso, ma è necessario in ambito multimodale per far avvenire in maniera corretta
la sincronizzazione tra parte vocale e parte visuale: visto che non cè distinzione tra le due scelte nella parte xhtml (abbiamo un solo radio
button sia per la scelta widow che per widower) non deve essercene nemmeno nella parte vxml.
Va ancora precisato che la grammatica mostrata in figura si presenta così semplice perchè linput è costituito da una sola variabile. Ovviamente
è possibile gestire anche casi più complessi in cui lelemento field è riempito con un vettore di variabili, ciò accade se si possono fare più
scelte per una stessa domanda. In tal caso la grammatica va integrata con la definizione di un vettore che viene costruito con le varie scelte.
La sintassi utilizzata a tal uopo può essere la seguente:
Una volta completata la parte vocale, cioè chiuso lultimo elemento <form> aperto precedentmente vi è la parte di sincronizzazione vera e
propria.
Lelemento di sincronizzazione è <sync> ed appartiene al modulo di sincronizzazione che nella definizione dei namespaces è stato indicato
con il valore xv .
Ecco un esempio dellutilizzo dellelemento in questione:
Lelemento sync nellesempio ha due attributi. Lattributo input vuole il nome (name) dellelemento <input>, della parte in html, che deve essere
sincronizzata; lattributo field va completato con il nome dato a xv:id= nel campo field della parte vocale corrispondente. In poche parole
per eseguire la sincronizzazione delle due modalità dinterazione cè bisogno che queste vengano identificate: xv:input= serve ad indentificare
la parte visuale in html, xv:field= serve invece per indicare la parte vocale in vxml.
La chiusura dellelemento <head> indica linizio della parte visuale in html.
Poiché il namespace di default è proprio quello relativo al linguaggio xhtml e quindi questo ospita tutti gli altri linguaggi, è possibile
scrivere la parte visuale come se si stesse realizzando una normale applicazione in xhtml. Gli elementi e gli attributi sono sostanzialmente gli
stessi, ma bisogna sempre aggiungere a questi gli strumenti necessari al collegamento tra i vari linguaggi.
E possibile collegare i due linguaggi attraverso lutilizzo di eventi ed handler oppure attraverso la sincronizzazione delle variabili di input.
Nel primo caso basta inserire in un elemento xhtml degli attributi del modulo XMLEvents:
In questo caso lelemento body, che segna linizio della parte xhtml, contiene un attributo event del modulo xml-events settato a load e un
handler che indica lidentificativo del form a cui saltare nel caso levento si verifichi. Il risultato di questa riga di codice è che appena
viene caricata la applicazione su di un browser, cioè si verifica un evento di load, il FIA passa ad interpretare il form indicato nellattributo
handler, cioè dalla parte visuale si passa a quella vocale.
Nel secondo caso, quello della sincronizzazione, bisogna stare attenti ai nomi e ai valori che vengono inseriti nel campo input:
Nellesempio mostrato gli attributi dellelemento <input> sono:
type indica il tipo di input che andrà visualizato a schermo,
value indica il valore che conterrà la variabile input se quel tipo di input è selezionato dallutente.
Nel caso di sincronizzazione multimodale tale valore dovrà corrispondere a quello della relativa parte vocale: nellesempio mostrato se alla
voce Profession lattributo value è settato a housewife, lutente che vuole rispondere a quella domanda con la voce deve pronunciare la parola
housewife o comunque una parola che restituisca il valore housewife. Sostanzialmente tutti gli attributi value degli input relativi ad una
stessa domanda devono corrispondere alla grammatica della corrispondente parte vocale.
name è il nome che viene dato allelemento <input> necessario alla sua individuazione ai fini della sincronizzazione. E importante che
ad una domanda con più risposte possibili il valore name sia settato allo stesso valore per tutte le possibili risposte in modo che tutte le
risposte ad una domanda siano sincronizzate con la stessa parte vocale. Il valore dellattributo name è quello che va inserito nel campo xv:input
dell elemento <sync>.
Clicca qui per scaricare l'applicazione
multimodale con estensione .mxml da poter testare con un browser multimodale.
Torna al primo articolo sul linguaggio X+V di Salvatore Zita.
|