VoiceXML Italian User Group

Home page  VoiceXML Links  VoiceXML Tutorial  News dai Working Groups Voice Browser e Multimodal Interaction del World Wide Web Consortium  Articoli  Accessibilita' del web mediante la voce

Libri Voice & Speech technologies  La nostra Newsletter  Il nostro Forum  Contatti  Gli eventi a cui lo User Group ha partecipato o partecipera'  Parlano (speriamo bene:-)) di noi...



TUTORIAL

Lezione 5. Gestione di una Conference Room (Seconda parte) di Fabrizio "Mater" Gramuglio    

Al pari degli altri linguaggi di sviluppo, VoiceXML, è in grado di gestire stati condizionali e variabili.

In questa lezione, l'utente immetterà il numero di partecipanti che intendono usare la nostra Conference Room, il programma, poi, userà questo input per determinare quale tipo di sala (room) dedicargli

<?xml version="1.0"?>
<vxml version="1.0">
 
<!--
Questo tutorial vi guiderà attraverso la creazione dei primi dialoghi per
fissare un appuntamento all'interno della nostra Conference Room.
Il tutorial contiene gli elementi IF, ELSE, ELSE IF e il loro uso.
Verrà introdotto inoltre l'elemento HELP
-->
<!-- Variabile globale per conservare il nome della room -->
<var name="r" expr=""/>
<!-- Introduzione al sistema di prenotazione della Conference Room -->



Variabili

Il primo nuovo elemento che troviamo è l'introduzione della variabile "r" alla linea 11. Questa variabile conterrà il nome della sala (room) da assegnare alla richiesta.
In VXML le variabili devono essere esplicitate. Gli unici attribuiti per l'elemento VAR sono name, per il nome della variabile, e expr per il valore iniziale. L'attributo EXPR non è obbligatorio, ma serve per inizializzare la variabile una volta creata.



Utilizzo locale e globale

Le variabili in VXML hanno una precisa area di utilizzo. Le variabili cosi' come altri oggetti che vedremo in seguito, sono accessibili soltanto nell'area nella quale vengono dichiarati (tranne alcune eccezioni).
In VXML l'area di utilizzo e' rappresentata da un BLOCK, un FORM, o un DOCUMENT. Qualora una variabile venga dichiarata in una determinata area (es: un BLOCK) non sarà utilizzabile in un altro block (vedremo poi come sarà possibile accedere nuovamente a quella variabile).

Analogamente, una variabile dichiarata all'interno di un form, strutturato in diversi blocchi, sarà accessibile da tutti i blocchi. Una variabile il cui utilizzo e' limitato ad una certa parte dell' applicazione (form o block) e' detta di tipo "LOCALE".

L'area di utilizzo è determinata dal punto in cui la variabile viene dichiarata, perciò, una variabile dichiarata all'interno dei tag <VXML> sarà accessibile da ogni punto del nostro codice, ed avrà una validità "GLOBALE"


Analogamente alle variabili, anche gli elementi NOMATCH e NOINPUT possono avere una valenza globale.
Al posto di scrivere una serie di nomatch e noinput per ogni elemento MENU o FIELD, si potranno codificare una risposta Nomatch ed una risposta noinput globali.

<nomatch>
   Spiacente, non sono riuscito a capire cosa hai detto.
   Se hai bisogno di aiuto di "HELP"
</nomatch>
 
<noinput>
   Rispondi prego, se hai bisogno di aiuto di "HELP"
</noinput>

Gli elementi nomatch e noinput definiti dopo il tag vxml saranno applicati ad ogni evento nomatch e noinput all'interno del documento.
L'uso di questi elementi a valenza globale ha però un difetto. Nella lezione precedente abbiamo visto che eravamo in grado di tenere il conto dei differenti nomatch e noinput, e specificare differenti risposte a seconda del numero di tentativi.
Tale conteggio è possibile soltanto qualora ci si trovi all'interno di un form, mentre gli elementi globali nomatch e noinput non tengono traccia del numero di tentativi.

Pertanto usando elementi nomatch e noinput globali, si "risparmia" scrittura di codice, ma si perde la possibilità di differenziare i messaggi di errore.


Abbiamo detto che la valenza di una variabile dipende dal punto del codice in cui essa viene dichiarata, ma cio' non è sempre vero.
Per definire l'area di utilizzo di una determinata variabile è disponibile anche l'attributo SCOPE.
Nelle righe seguenti (riga 21) il form ha un attributo SCOPE = "document", il che significa che gli elementi filled saranno accessibili anche al di fuori del form "welcome"

Il codice seguente chiede all'utente se intende prenotare una conference room, poi testa la risposta usando una istruzione di tipo IF / ELSE per "pilotare" la successiva esecuzione del codice.

<form id="welcome" scope="document">
   <field name="intro">
      <grammar> yes | no | help </grammar>
      <prompt> Benvenuto nel sistema di prenotazione Cambrige
          conference room. Vuoi prenotare una
          conference room?
      </prompt>
      <help> Se si vuole prenotare una conference room dire "yes", altrimenti
         dire "no"
      </help>
      <filled>
      <!-- se l'utente dice "no", esco dall'applicazione -->
         <if cond="intro=='no' ">
            <assign name="x" expr="1"/>
            <goto nextitem="end"/>
         <else/>
      <!-- se l'utente dice "yes", vado al form "howmany"-->
            <goto next="#howmany"/>
         </if>
      </filled>
   </field>
</form>


Nota alle righe 35 e 38:
La sintassi per spostare l'esecuzione da un punto all'altro del codice può essere scritta in due diversi modi:
nexitem = " etichetta " (es: linea 35)
oppure
next = " # etichetta " (es: linea 38)
Nel caso di form e blocchi le due sintassi sono equivalenti



Help

La risposta dell'utente verrà salvata nel campo "intro".
Alla riga 23 dichiariamo la nostra grammatica (vedere lezione precedente), e oltre le parole "yes" e "no" viene introdotto l'elemento HELP.
Qualora l'utente dica "help" il programma leggerà le linee (28 e 29) incluse tra i tag <help></help> ed aspetterà un ulteriore input da parte dell'utente.
Analogamente a quanto detto precedentemente per gli elementi nomatch e noinput, anche l'elemento help può essere dichiarato all'interno dei tag <vxml> ed avere così valenza GLOBALE.



Condizione IF / ELSE

Nel momento in cui l'utente fa una scelta corretta (compatibilmente con la grammatica da noi definita), il campo "intro" viene riempito e l'elemento filled viene processato.
L'elemento IF comincia alla linea 33 dove viene valutata la condizione "intro" = NO, se la condizione è vera si crea una nuova variabile "X", le si assegna il valore 1 (linea 34) e si sposta l'esecuzione del programma al blocco contrassegnato dall'etichetta "end" (linea 35).

Attenzione: affinchè l'espressione condizionale sia valutata deve essere completamente gestita come stringa.
La condizione "no" verrà perciò racchiuso tra apici (') perche', in VXML, tutte le stringhe non numeriche devono essere racchiuse tra di essi.

La linea 36 inizia la gestione della procedura ELSE, in cui , visto che il valore di "intro" non e' 'no', l'esecuzione verra' spostata all' etichetta "howmany"
ELSE è un figlio di IF ed infatti il il tag di chiusura di IF (</if>) si trova alla linea 39



Grammatiche standard

VXML fornisce numerose grammatiche standard per validare e riempire un nostro campo. Queste grammatiche "built-in" possono essere di diversi tipi: valori booleani, date, cifre, valute, numeri, numeri di telefono, ore e lettere.

La prossima sezione di codice interroga l'utente sul numero di persone che devono partecipare e salva il valore in un campo "SIZE", per poi scegliere la stanza più appropriata.

<!-- Interroga l'utente sul numero dei partecipanti -->
 
      <form id="how_many" scope="document">
 <!-- Grammatica standard per i numeri -->         
             <field name="size" type="Number">
             <grammar> help </grammar> <!-- grammatica per help -->
             <prompt>
                 Quante persone intendi invitare alla conferenza?
             </prompt>
             <help>
                Scegli un numero compreso tra 1 e 40
             </help>

Alla linea 47 viene dichiarato il nuovo attributo size per l'elemento field. Esso determina il tipo di grammatica che verrà usata ed il modo in cui il valore del campo sarà salvato in memoria.
Qualora, come in questo caso, type sia uguale a "Number" il campo verrà riempito con qualsiasi valore numerico e gli input non numerici saranno considerati come nomatch.



Uso di caratteri speciali

Supponendo che l'utente abbia fornito un valore numerico, l'esecuzione proseguirà assegnando una stanza in base a tale valore.
L'elemento filled userà una serie di if / else al fine di valutare quale sia la stanza adatta al valore inserito dall'utente.
Ma facciamo attenzione alla prima istruzione di if, dove viene valutato il valore immesso.

             <filled>
<!-- confronta il valore inserito con il range di validità -->
 
                <if cond="val (size) <=40 && val(size) >=21">
<!-- assegna il valore VIP alla variabile "r" -->
                   <assign name="r" expr=" ' V.I.P.' " />
<!-- va al blocco end-->
                   <goto nextitem="end" />

Cosa sono quei simboli alla riga 58? Vi starete chiedendo come mai i tags sono passatti dalla lingua inglese all' ostrogoto...
VXML usa molti caratteri speciali tra i quali quelli di maggiore e minore ( < > ) ed e commerciali ( & ) come controlli, mettendoli in stringhe letterali che altrimenti risulterebbero confuse per il browser.
< verrà tradotto con " < ", & con " & " ed infine, > con " > ".
L'intera stringa verrà interpretata dal browser come :

val(size) <= 40 && val(size)>= 21 e quindi, in linguaggio comune:
il valore della variabile size è minore o uguale a 40 e maggiore o uguale a 21.

Queste sequenze di caratteri (escape) DEVONO essere sempre usate qualora si intenda inserire caratteri speciali all'interno di stringhe letterali.

Tornando al nostro codice, se la condizione alla riga 58 viene soddisfatta il programma assegna il valore " V.I.P. " alla variabile "r" e salta alla blocco end.



La funzione VAL

La funzione val viene introdotta nella linea 58, all'interno della condizione IF.
Quando il campo "SIZE" viene "riempito" con l'input dell'utente viene salvato come stringa, successivamente pero' esso viene utilizzato come intero all' interno dell' uguaglianza.
Al fine di poter usare una stringa come intero occorre prima convertirla, appunto con la funzione val.

Il resto del codice sono altre condizioni, con relativa assegnazione di valore alla variabile "r".
Si verifica se il valore è tra 11 e 20 (riga 63) e si assegna alla variabile il valore 'Executive' (riga 66).
Qualora il valore di size sia invece compreso tra 1 e 10 (riga 69), si assegna il valore di 'Brainstorm' (riga 72).
Alla riga 76 si verifica, infine, che il valore di size non sia inferiore a 1 o maggiore di 40, ed in tal caso si legge un messaggio di errore all'utente (riga 77, istruzione prompt), e si sposta l'esecuzione del codice nuovamente al form di inserimento di size, dando all'utente un' ulteriore possibilità di inserire il numero di partecipanti

    <elseif cond="val(size) <= 20 && val(size)
       >=11"/>
<!-- Assegno alla variabile globale "r" il valore "Executive" -->
        <assign name="r" expr="'Executive'"/>
<!--Vado al blocco " end "-->
       <goto nextitem="end"/>
    <elseif cond="val(size) >0 && val(size)
      <=10"/>
<!--Assegno alla variabile globale "r" il valore"Brainstorm"-->
      <assign name="r" expr="'BrainStorm'"/>
<!--Vado al blocco " end "-->
      <goto nextitem="end"/>
<!--Controllo di validità dell'input dell'utente-->
     <elseif cond="val(size) >= 41 || val(size) <= 0"/>
        <prompt>Hai inserito un valore fuori dal
           range.</prompt>
<!--Svuoto la lista di valori per il campo "size"-->
     <clear namelist="size"/>
<!--Torno indietro all'inserimento di "size"-->
     <goto nextitem="size"/>
     </if>
   </filled>
</field>

Le ultime righe di codice confermano le scelte dell'utente ed indicano la stanza che è stata assegnata.

La linea 89 si verifica se il valore della variabile "X" e' uguale ad "1" ( allla linea 32 X veniva posta ad "1" qualora l'utente decidesse di non prenotare alcuna stanza), e se la condizione è verificata viene letto un generico messaggio di saluto (riga 90)

Altrimenti, vengono ripresi i valori di "size" e di "r" ed immessi all'interno del messaggio di conferma che viene letto all'utente alla riga 94

<!-- Tells you what the conference room you have picked -->
 
      <block name="end">
        <if cond="x==1">
          <prompt>Grazie per aver usato il sistema di prenotazione Cambridge
            Conference Room.</prompt>
         <exit/>
        <else/>
         <prompt>Hai scelto <value expr="size"/> partecipanti
              per la nostra <value expr="r"/> sala conferenze.</prompt>
          <prompt>Grazie per aver usato il sistema di prenotazione Cambridge
              Conference Room.</prompt>
         <exit/>
         </if>
      </block>
   </form>
</vxml>

Anche per questa quinta lezione that's all...



Torna alla LEZIONE 4     /     Vai alla LEZIONE 6