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 4. Gestione di una Conference Room (Prima parte) di Fabrizio "Mater" Gramuglio    

A partire da questa lezione ci concentreremo sulla costruzione di una applicazione per fissare gli appuntamenti di una Conference Room. Essa dovra' essere in grado di registrare la data, l’ora, il numero delle persone partecipanti alla conferenza ed infine di avvisare i partecipanti a mezzo e-mail.
Prima di addentrarci nella creazione di questa applicazione concentriamoci sull’elemento menu.
Questo elemento è composto da un prompt verso l'utente, capace di ricevere un input, e da un “go to” o da uno “switch”, che permettono di "dirigere" lo sviluppo dell’applicazione.

Quando, utilizzando un' applicazione VoiceXML avete sentito la frase “Dica [qualcosa] o prema 1 per [fare qualcosa], dica qualcos'altro o prema 2 per [fare qualcos’altro]” probabilmente vi trovevate in un menu.

In questa lezione vedremo come si usa il tag menu, la sua capacità di recepire un input, di gestire la conseguente esecuzione della nostra applicazione, ed il suo comportamento in caso di mancato o errato input.

<?xml version="1.0"?>
<vxml version="1.0">
<!--
This example shows the basic requirements for a
menu in a VoiceXML Application
-->
 
  <menu>
      <prompt>Welcome to the Cambridge Conference Room
      Scheduling System.<enumerate/></prompt>
      <choice nextitem="databaseForm">database</choice>
     <choice nextitem="withoutForm">without</choice>

Le istruzioni contenute dalla 1 alla 7 sono gia' state trattate nelle precedenti lezioni.
Alla linea 8 fa la comparsa il tag menu .
Alla linea 9 l’elemento prompt farà si che venga letto il testo di benvenuto in esso contenuto.
Alla linea 10, prima della chiusura del tag prompt troviamo l’elemento enumerate il quale "prepara" l’inserimento delle voci dichiarate dal tag <choice> all’interno del menù E’ importante notare che a livello di sintassi, esso è un “self-closing-tag” (vedi di seguito) ovvero un elemento che si auto chiude.

L'applicazione (di seguito indicata "CON") ci dira' quindi:

CON: Welcome to the Cambridge Conference Room Scheduling System.
CON: For database, Say database or press 1.
CON: For without, Say without or press 2.



L' elemento <choice>

Analizziamo da vicino questo elemento:

choice nextitem="databaseForm">database</choice>

L’elemento choice, come abbiamo visto, permette di specificare delle scelte all’interno del menù (era stato introdotto dall’elemento enumerate).
I testi “database” o “without” vengono aggiunti al prompt, mentre l’attributo “nextitem” agisce come un “go to”
Qualora, infatti, la risposta all’applicazione sia la pressione del tasto 1 o 2, oppure l'input vocale "database" o "whitout", l’applicazione salterà rispettivamente alla label "DatabaseForm" o "WhitoutForm".



Self Closing Tag

Come abbiamo visto, per l’elemento <enumerate/> non esiste un tag di chiusura, la sintassi prevede semplicemente uno "/" al termine dell’elemento.
Questa particolare sintassi in VoiceXML viene usata per tutti gli elementi che non hanno tag di chiusura e che pertanto non presentano "figli".
Altri elementi con la stessa sintassi sono: exit, disconnnect, reprompt ed else.



Nessun input o input errato

Sarà, ovviamente, possibile che alcuni utenti premano un numero errato, dicano qualcosa di sbagliato o non rispondano affatto al nostro menu. Il nostro menu dovrà essere in grado di gestire queste evenienze.
Il VoiceXml fornisce due diversi elementi per gestire queste situazioni: l’elemento nomatch e l’elemento noinput .
Il primo gestisce la mancata rispondenza tra input ricevuto e le possibili scelte (quelle definite dal tag "choice"), il secondo gestisce il mancato input da parte dell’utente entro un certo lasso di tempo.
Proseguiamo perciò il nostro listato inserendo la gestione di questi due casi:

  <!--
       nomatch and noinput elements handle invalid user input
   -->
      <nomatch count="1">That was an invalid choice. Please try
        again.
      </nomatch>
     <nomatch count="2">That was an invalid choice. Please try
        again.
     </nomatch>
     <nomatch count="3">That was your third try. The program will
       now exit.
     <goto nextitem="end"/>
     </nomatch>
    <noinput count="1">No input was received. Please try
        again.
     </noinput>
     <noinput count="2">No input was received. Please try
        again.
     </noinput>
     <noinput count="3">That was third try. The program will
       now exit.
     <goto nextitem="end"/>
     </noinput>
</menu>

Entrambi i tag noinput e nomatch hanno la stessa sintassi ed in particolare prevedono entrambi l' attributo count che permette di gestire piu' volte la situazione di input assente o errato. Il testo contenuto tra i tag di apertura e di chiusura di noinput e nomatch sarà quello proposto all' utente.

Ogni singolo elemento menu deve presentare almeno un elemento nomatch ed un elemento noinput.

Nel ns. esempio, dopo due "tentativi" (count 1 e 2) al terzo caso di "nomatch" e al terzo "noinput" viene nuovamente utilizzato l’attributo nextitem, questa volta all’interno di un elemento goto.
Anche in questo caso, come in precedentemente per l’elemento "choice", l’esecuzione del programma salterà all' etichetta corrispondente, in questo caso "end".



FORM IDs

Alla linea 11 si era indicato all'applicazione di saltare all’etichetta "databaseForm":

<choice nextitem="databaseForm">database</choice>

Di seguito riportiamo il codice relativo a tale form (il cui ID viene indicato mediante l'attributo "id") all’interno del quale troviamo l'elemento prompt e alla riga 41 l’invio ad “end”.

   <form id="databaseForm">
       <block>
         <prompt>This is the form database.
         You will now be sent to the next form without.</prompt>
        <goto nextitem="end"/>
      </block>
   </form>
 

 

Le grammatiche

Uno degli aspetti maggiormente interessanti delle "voice-application" è la loro capacità di catturare input vocali.
Nel caso in cui vi siano un numero di inputs limitato e predefinito e' possibile definire una grammatica e cioe' un set predefinito di risposte accettabili. Quando l’utente risponde in modo "valido" (utilizzando una delle espressioni incluse nella grammatica), il valore della risposta viene scritto all’interno di un elemento field ed eventualmente utilizzato in un successivo prompt di conferma dell' input acquisito.

La differenza fra questa sintassi e quella del menu a scelte multiple sta nel fatto che nel caso del menu la risposta indirizza immediatamente lo sviluppo dell’applicazione spostando l’esecuzione sull' etichetta definita, mentre in questo caso, il programma chiederà il nome dell’utente, lo includerà in un field, e lo ripeterà all’utente come verifica dell' esatta acquisizione.

<!--
In-line Grammars would need to be built based on your company
directory. You must enter one of the names listed in the
in-line grammar shown or replace the grammar with your own.
-->
   <form id="without">
       <field name="you">
           <grammar>Casey|Eric|Jan|John</grammar>
           <prompt>Please say or enter a name</prompt>
           <prompt>Your choices are: Casey, Eric, Jan or John.</prompt>
           <nomatch count="1">I don’t understand. The program will
           now exit.
                <goto nextitem="end"/>
           </nomatch>
           <noinput count="1">I have received no input. The program will
           now exit.
                <goto nextitem="end"/>
           </noinput>
           <filled>
                 <prompt>I heard<value expr="you"/></prompt>
          </filled>
       </field>
    </form>

Siamo arrivati alla linea 50 attraverso la scelta "2" (pressione del tasto) o "without" (imput vocale) dal nostro menu, la riga 51 dichiara l'elemento field “you”. La linea 52 contiene la dichiarazione della nostra grammatica, attraverso l’elemento grammar. Ogni espressione che compone la grammatica dev' essere separata dalla successiva dalla barra orizzontale ( | ).
Le linee 53 e 54 vengono lette all’utente proponendogli la domanda e le possibili risposte.
Se l’utente risponde con uno dei valori contenuti all’interno della grammatica il programma considererà l’elemento field correttamente "riempito" e salterà alla riga 63 dove troviamo l’elemento filled.
Alla riga 64 verrà ripetuto l'input introdotto vocalmente dall' utente.

Qualora l’utente dovesse rispondere con un valore diverso da quelli inclusi nella grammatica o non dovesse rispondere affatto, i due elementi noinput e nomatch sposteranno l’esecuzione all' etichetta "end".



Conclusione

Il form finale proporrà un messaggio di ringraziamento e chiuderà l’applicazione.

  <form id="end">
      <block>
          <prompt>Thank you for using the Cambridge Conference Room
         Scheduling System.</prompt>
        <exit/>
     </block>
  </form>
</vxml>

Nonostante l’applicazione termini naturalmente alla linea 75 l’elemento exit la chiude alla linea 72.



Torna alla LEZIONE 3     /     Vai alla LEZIONE 5