Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Grammatiche complesse ed esterne

Grammatiche esterne e attribuzione di semantica a pronunce diverse
Grammatiche esterne e attribuzione di semantica a pronunce diverse
Link copiato negli appunti

In questa lezione concentriamo l'attenzione sulla creazione di grammatiche meno rigide di quella definita nelle lezioni precedenti.

Torniamo al nostro caso, in cui l'utente poteva scegliere tra:

  • confermare la propria scelta
  • non confermare
  • tornare al menu precedente
  • richiedere di parlare con un operatore.

Grammatiche esterne

Per grammatica esterna si intende una grammatica definita su un file a se stante.

Listato 3.6: grammatica esterna

...
<form id="conferma">
 <field name="myconferma">
  <grammar src="../grammar/conferma.grxml"/>
...

Per importare una grammatica esterna specifichiamo nel tag <grammar> il percorso del file (URI) che contiene la definizione della grammatica che vogliamo usare.

Per definire una grammatica esterna dobbiamo perciò creare un file. Usiamo le specifiche SRGS (Speech Recognition Grammar Specification) per le grammatiche XML.

Il nostro documento XML dovrà essere valido e riferibile ad una grammatica di riconoscimento, perciò nel suo prolog dovremmo indicarne i riferimenti.

Listato 3.7: prolog completo grammatica esterna

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE grammar PUBLIC "-//W3C//DTD GRAMMAR 1.0//EN"
 "http://www.w3.org/TR/speech-grammar/grammar.dtd">

<grammar version="1.0"
 xml:lang="it-IT"
 mode="voice"
 root="myconferma"
 xmlns="http://www.w3.org/2001/06/grammar"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.w3.org/2001/06/grammar http://www.w3.org/TR/speech-grammar/grammar.xsd"
 
 xml:base="http://www.example.com/another-base-file-path">

In questo caso, a differenza del listato 3.4, abbiamo impostato l'attributo mode="voice", per indicare che si tratta di una grammatica di riconoscimento vocale e non di tasti DTMF.

L'attributo root="myconferma" indica quale è la regola di riferimento della grammatica. Il Document Type nelle grammatiche XML è opzionale.

Una volta scrittp il prolog siamo in grado di creare la nostra grammatica di riconoscimento, usando i costrutti esaminati nella lezione precedente.

Come abbiamo detto le azioni possibili, ovvero i nostri items, sono:

  • confermare la propria scelta
  • non confermare
  • tornare al menu precedente
  • richiedere di parlare con un operatore.

Una possibile grammatica risultante:

Listato 3.8: grammatica esterna

<?xml version="1.0"?>
<grammar xmlns="http://www.w3.org/2001/06/grammar" xml:lang="it-IT" version="1.0" mode="voice" tag-format="Nuance">

 <rule id="myconferma" scope="public">
  <one-of>
   <item> confermo </item>
   <item> non confermo </item>
   <item> menu precedente </item>
   <item> operatore </item>
  </one-of>
 </rule>
 
</grammar>

Come nel listato 3.4 abbiamo utilizzato <one-of> per indicare una serie di elementi (item) possibili, ma, se consideriamo che la domanda di partenza, nel form era "confermi la tua scelta?", la grammatica in 3.8 non è sufficiente per coprire tutti i possibili casi di risposta. Dovremo perciò aggiungere almeno "si" "no" "indietro" .. e trasformare la nostra grammatica in una lista più: ampia.

Listato 3.9: grammatica esterna con lista pronunce ampliata

<?xml version="1.0"?>
<grammar xmlns="http://www.w3.org/2001/06/grammar" xml:lang="it-IT" version="1.0" mode="voice" tag-format="Nuance">

 <rule id="myconferma" scope="public">
  <one-of>
   <item> confermo </item>
   <item> si </item>
   <item> non confermo </item>
   <item> no </item>
   <item> menu precedente </item>
   <item> indietro </item>
   <item> operatore </item>
  </one-of>
 </rule>
</grammar>

In questo caso notiamo che le risposte "si" e "confermo" sono essenzialmente la stessa cosa, ma verranno restituite al campo corrispondente (il field "myconferma") con due valori diversi, ovvero "si" e "confermo", questo significa che nel momento in cui gestiamo il codice della sezione <filled> dobbiamo trattare i due casi separatamente.

Introduzione di regole sematiche

Ovviamente questo non è particolarmente comodo e aumenta il codice che dobbiamo scrivere. Un modo per ovviare a questo problema e per includere più casi con lo stesso significato, è quello di attribuire un significato arbitrario, ad ogni parola pronunciata attraverso l'uso di <tag>.

Listato 3.10: grammatica esterna con semantica

<?xml version="1.0"?>
<grammar xmlns="http://www.w3.org/2001/06/grammar" xml:lang="it-IT" version="1.0" mode="voice" tag-format="Nuance">

<rule id="myconferma" scope="public">
<one-of>

<!-- interpretazioni per "si" -->
<item>si<tag><![CDATA[<myconferma "si">]></tag></item>
<item>confermo<tag><![CDATA[<myconferma "si">]></tag></item>
<item>certamente<tag><![CDATA[<myconferma "si">]></tag></item>
<item>okay<tag><![CDATA[<myconferma "si">]></tag></item>
<item>ochei<tag><![CDATA[<myconferma "si">]></tag></item>

<!-- interpretazioni per "no" -->
<item>no<tag><![CDATA[<myconferma "no">]></tag></item>
<item>non confermo<tag><![CDATA[<myconferma "no">]></tag></item>
<item>sbagliato<tag><![CDATA[<myconferma "no">]></tag></item>

<item>indietro<tag><![CDATA[<myconferma "indietro">]></tag></item>
<item>menu precedente<tag><![CDATA[<myconferma "indietro">]></tag></item>

<item>operatore <tag><![CDATA[<myconferma "operatore">]></tag></item>
</one-of>
</rule>
</grammar>

L'uso di <tag>, ci permette dunque di assegnare un valore (una interpretazione) alla variabile "myconferma", che poi verrà passata al field corrispondente. Avremo potuto anche passare 1,2,9,0 come nel caso del listato 3.4.

In questo listato, inoltre, abbiamo anche scritto una possibile pronuncia della parola "okay" per aumentare la probabilità che essa venga riconosciuta.

La sintassi di tag è definita dall'attributo tag-format="Nuance" nella dichiarazione della grammatica, e può essere variabile da piattaforma a piattaforma.

Possiamo, per il momento, considerare il listato 3.10 come la nostra grammatica definitiva e scrivere il codice completo del form.

Listato 3.11: form completo

...
<form id="conferma">
 <field name="myconferma">
 <!-- chiamata alla grammatica di riconoscimento -->
  <grammar src="../grammar/conferma.grxml"/>
 <!-- eventi di nomatch e noinput -->
 <prompt>Confermi la tua scelta?   <noinput>
   <prompt>Non ho sentito. Dimmi se vuoi confermare la tua selezione?</promp>
  </noinput>
  <nomatch>
   <promp>Non ho capito. Dimmi se vuoi confermare la tua selezione?</prompt>
  </nomatch>
   <!-- evento di filled -->
   <filled>
   <!-- gli leggo quello che ho ascoltato -->
   <prompt>Hai detto <value expr="myconferma"/></prompt>
    <!-- valori che può assumere il campo -->
    <if cond="myconferma == 'no' ">
     <goto next="#conferma_negativa"/>
    <elseif cond="myconferma == 'si' "/>
     <prompt>Grazie di aver confermato la tua selezione.</prompt>
     <goto next="#conferma_positiva"/>
    <elseif cond="myconferma == 'indietro' "/>
     <goto next="#file_precedente"/>
    <elseif cond="myconferma == 'operatore' "/>
     <goto next="operatore.vxml"/>
    </if>
   </filled>
 </field>
</form>
...

In quest'ultimo listato osserviamo come i diversi elementi di un form si relazionano tra di loro, e soprattutto, come grazie all'uso di tag, riusciamo a gestire i valori possibili delle richieste del nostro utente.

Ti consigliamo anche