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 VOICEXML e PHP

Lezione 4. Generazione dinamica di grammatiche da LDAP.    Christian Lacetera    

Nelle lezioni precedenti ci siamo preoccupati di generare dinamicamente solo i documenti VXML, però nulla ci vieta di generare on-the-fly anche altri elementi che fanno parte delle specifiche VoiceXML.

Una parte molto importante nella costruzione dei "dialoghi vocali" sono senza dubbio le grammatiche per il riconoscimento vocale, che permettono il miglior interfacciamento con l'utente finale.

Putroppo il riconoscimento vocale impiega profondamente le risorse hardware quindi grammatiche molto complesse, spesso hanno sia il problema di appesantire eccessivamente il sistema e la resa dell'applicativo sia aumentare la percentuale di erroe di riconoscimento, inficiando così l'esperienza dell'utente rendendolo impacciato nell'utilizzo dell'applicazione.

Prendiamo come esempio quello di una rubrica aziendale, fingiamo per un'attimo di voler realizzare un centralino automatico di una struttura pubblica distribuita sul territorio nazionale.
Realizzare una grammatica monolitica sarebbe pressochè impossibile, inoltre risulterebbe ingestibile un aggiornamento manuale della stessa, dato che numeri e strutture organizzative sono passibili di mutamenti piuttosto frequentemente.

Il contenitore naturale di una rubrica aziendale è senza ombra di dubbio un Directory Server (LDAP o Active directory che sia), che offre come noto una rapidità di lettura impareggiabile e ci permette di generare la grammatica in base alla città selezionata.
<?xml version="1.0"?> <vxml version="2.1" xml:lang="it-IT"> <var name="dove"/> <var name="matricola"/> <form id="chiedi"> <field name="citta"> <prompt>Città dell'organizzazione</prompt> <grammar type="application/srgs" src="nomicitta"/> <noinput>Spiacente ma non ho sentito<reprompt/></noinput> <nomatch> <prompt>Spiacente ma non ho capito il nome della citt'</prompt> </nomatch> <filled> <assign expr="citta" name="dove"/> </filled> </field> </form> <form id="ricerca"> <field name="matr"> <prompt>Dimmi il cognome</prompt> <!-- Utiliziamo la variabile per creare il filtro ldap--> <grammar type="application/srgs" exprsrc="'rubrica.php?citta=' + dove"/> <noinput>Spiacente ma non ho sentito.<reprompt/></noinput> <nomatch> <prompt>Spiacente ma non ho capito il cognome</prompt> </nomatch> <filled> <!-- Assegnamo la Matricola per successive elaborazioni--> <assign expr="matricola" name="matr"/> </filled> </field> </form> </vxml>
Come potete vedere questa volta il documento voicexml, è un documento statico,il primo riferimento alla grammatica punta ad un documento anchesso statico che contiene il nome delle varie città dov'è presente la società Il punto interessante è invece il riferiemnto della seconda grammatica, che sarà generata con lo script rubrica.php, dinamicamente.

<grammar type="application/gsl" exprsrc="'rubrica.php?citta=' + dove">

Con l'introduzione del voiceXML 2.1 il tag grammar è stato arricchito con l'elemento exprscr ha come parametro un ECMA Script che permette il passaggio di parametri alla nostra grammatica.

<?php
 header("Content-Type: application/srgs+xml);
 echo '<?xml version= "1.0"?>';
?>
<grammar xmlns="http://www.w3.org/2001/06/grammar" xml:lang="it-IT" root = "Risorse">
<rule id="Matr">
<one-of lang-list="it-IT">
<?php
   if ($ds) {          
   $r=ldap_bind($ds); // this is an "anonymous" bind, typically
   // read-only access
   // Search surname entry
   $sr=ldap_search($ds, "o=dominio, c=it", "ciry=".$_REQUEST['citta']); 
   //Getting Entry
   $info = ldap_get_entries($ds, $sr);
   for ($i=0; $i<$info["count"]; $i++) {
     $matricola = $info[$i]["employeenumer"][0];
     $cognome = $info[$i]["sn"][0];
     echo '<item>'.cognome.'<tag> <![CDATA[ <citta "'.$matricola.'"> ]]> </tag> </item>';
   }
   } else {
    echo "<!-- Errore generazione Grammatica --!>";
   }
?>
 </one-of>
 </rule>
 </grammar>
Una volta richiamato lo script PHP viene cambiato il Content-type a "application/srgs+xml" per permettere a qulunque interprete voiceXML di gestire correttamente il contenuto dello script.
Successivamente attraverso $_REQUEST['citta'] si legge il parametro passato da exprsrc.
D'ora in poi si utilizzano le funzioni built-in del php per interrogare un Directory Server, ed una volta ottenute le informazioni si genera la grammatica im modo dinamico, utilizzando echo '<item>'.cognome.'<tag> <![CDATA[ <citta "'.$matricola.'"> ]]> </tag> </item>'; assegnando al nome la matricola aziendale, che potrà successivmanente utilizzata per fare una lettura del numero di telefono da utilizzare con una transfer.


Torna alla LEZIONE 3     /     Vai alla LEZIONE 5