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

In questa sesta lezione del nostro tutorial faremo in modo che l'applicazione registri la data e l'ora dettata dall'utente e la ripeta.
Per fare questo useremo due tipi di variabili predefinite (viste anche nella lezione precedente), una per l'ora e l'altra per la data. Per ripetere infine l'input dell'utente non useremo il text-to-speech, ma un file audio pre-registrato.
Infine vedremo come sarà possibile catturare gli eventi nomatch e noinput con uno script più snello.


File Audio

All'interno del nostro documento è possibile inserire dei file audio pre-registrati, che non solo possono sostituire alcune sezioni dei nostri dialoghi, ma anche aumentare la sensazione di "realismo" dell' applicazione
La prima cosa da fare per usare dei file audio è indicare il percorso dove risiedono.

<?xml version="1.0"?>
<vxml version="1.0">
<property name="audio.path"
        value="..\..\wav\"/>

Alla linea 3 viene utilizzato l'elemento property il quale introduce il "percorso dei file audio".
La linea 4, invece, stabilisce invece la posizione (relativa) della cartella che conterrà i file wav.
Ovviamente è possibile usare un percorso assoluto invece che uno relativo.



Script

Una delle funzionalià fondamentali del VoiceXML è la capacità di contenere scripts.
Vediamo ora il primo esempio di script.

Per prima cosa dichiariamo due variabili: exist e badInputCounter entrambe dichiarate all'interno dei tag vxml e quindi con valenza globale.
Useremo la variabile exist per definire se il nome specificato è già presente nell' elenco dei nomi, mentre useremo badInputCounter per salvare il numero dei noinput e nomatch che verranno generati da un particolare input.

<var name="badInputCounter" expr="0"/>

Se ricordate, precendentemente, avevamo visto che era possibile definire dei nomatch e dei noinput con valenza globale, i quali pero' presentavano il problema di non permettere di tracciare il numero di errori fatti dall'utente e quindi restituire un messaggio appropriato o gestire differentemente l'evento.
In questo caso tale "tracking" viene realizzato per mezzo della variabile badInputCounter

<nomatch>
<script><![CDATA[
     badInputCounter=badInputCounter+1;
     echo "nomatch counter: ",badInputCounter,endl;
     ]]></script>
 
     Sorry, I didn't understand what you said.
    <if cond="badInputCounter = = 3">
        <goto nextitem="end"/>
    </if>
</nomatch>

Uno script è un elemento come gli altri, con un suo tag di apertura e di chiusura (rispettivamente linea 7 e 10).
Subito dopo l'apertura dell'elemento script troviamo il tag !CDATA.
il quale indica al browser VoiceXML di ignorare il codice contenuto al suo interno (ad esempio potremmo decidere di usare caratteri speciali al suo interno senza temere di incorrere in errori da parte del server Voice)
La porzione di codice verrà invece processata dall'interprete dello script.

Alla riga 8 viene incrementato di uno il valore della variabile badInputCounter, mentre la riga 9 ne mostra il valore.
"Mostrare" il valore non equivale ad utilizzare l'elemento prompt: l'utente non udirà mai il valore di un testo esplicitato con echo, ma semplicemente, diciamo che il valore viene reso disponibile all'applicazione VoiceXML, insieme al resto della riga 9 che viene chiusa da terminatore endl.

La linea 13 controlla il valore della variabile e se uguale a 3 sposta l'esecuzione alla linea 14 che termina l'applicazione.

<noinput>
<script><![CDATA[
     badInputCounter=badInputCounter+1;
     echo "nomatch counter: ",badInputCounter,endl;
     ]]></script>
 
    <if cond="badInputCounter = = 3">
        <goto nextitem="end"/>
    </if>
  No input was received.
</nomatch>
 

Ora che abbiamo scritto il codice per gestire gli eventi di noinput e di nomatch vediamo come possiamo catturare la data fornita dall'utente e prenotare la conference room.

<form id="month" scope="document">
<block>
<audio src= "lesson4001.wav">
  Welcome to the Cambridge Conference Room Scheduling System.
   If you are unsure of the formats accepted by each field, say
  help or enter a question mark at the user prompt.
</audio>
</block>
  <field name="calendar" type="date" scope="document">
  <grammar> help </grammar>
<!--in-line grammar for help-->
   <audio src= "lesson4002.wav">
     For what date would you like
     to schedule the conference room?
   </audio>
    <help>
    <audio src= "lesson4003.wav">
        The format for date is yyyymmdd.
     </audio>
     </help>
 <filled>
<prompt>
   <audio src= "lesson4004.wav">
      I think you said
   </audio>
   <value expr="calendar" class="date"/>
</prompt>
<goto nextitem="time"/>
</filled>
</field>

Ad esclusione dell'elemento audio, il resto del codice appare ormai familiare.
L'elemento audio, che fa la sua comparsa alla linea 31, indica che un file deve essere eseguito al posto di un prompt. Il file, come visto nelle prime righe, sarà un file wav.
Se il file audio non viene trovata viene letta la stringa all'interno del tag audio.

I due tipi di lettura posso essere usati contemporaneamente, come vediamo alle righe 51-54.
Adesso scriviamo l'ultima parte del codice, ovvero quella necessaria per catturare l'ora alla quale prenotare la nostra conference room.

<field name="time" type="time" scope="document">
      <audio src= "lesson4005.wav">
         What time would you like the conference room?
      </audio>
      <help>
         <audio src= "lesson4006.wav">
             The format for time is hhssx.
        </audio>
      </help>
         <filled>
         <prompt>
            <audio src= "lesson4002.wav">
             I think you said
           </audio>
          <value expr="time" class="time"/>
         </prompt>
         <goto nextitem="end"/>
        </filled>
      </field>
    <block name="end">
         <prompt>
              <audio src= "lesson4008.wav">
                Thank you for using the Cambridge Conference Room
                Scheduling System. You have scheduled a conference for
              </audio>
              <value expr="calendar" class="date"/>
              <value expr="time" class="time"/>
         </prompt>
       <exit/>
    </block>
  </form>
</vxml>


Torna alla LEZIONE 5