[#wpdev] Speech API: anatomia del file VCD

Windows-Phone-8-big-logoNel precedente post, si è accennato al VoiceCommandDefinition file. Abbiamo visto che, questo file, è il responsabile della programmazione del Voice Command gestito dal sistema operativo. In questo post, vedremo più nel dettaglio questo file. Capiremo come è strutturato, come funziona e quale sarà il lavoro che dovremo svolgere per personalizzarlo.

Di fatto, il file VCD, è un documento XML che definisce tutti i comandi vocali che un utente può utilizzare per compiere delle azioni lanciando l’applicazione. E’ importante sottolineare che, questo livello di interazione, è esterno alla nostra applicazione quindi, il VCD, serve solo in fase di avvio dell’app.

L’aggiunta del file VCD è molto semplice: da Visual studio, clicchiamo su Add->New Item->Voice Command Definition.

30-01-2013 12.57

Al nostro progetto verrà quindi aggiunto un nuovo file XML chiamato appunto VoiceCommandDefinition.xml . Il file è già prepopolato con un template di default che dobbiamo modificare in funzione delle nostre esigenze.

Il primo elemento da considerare è la lingua:

30-01-2013 13.03

wp_ss_20130130_0001Questa deve necessariamente essere la stessa utilizzata dal dispositivo. Nel caso in cui la lingua specificata nel nostro file VCD sia diversa da quella utilizzata dal device in cui la nostra applicazione verrà installata, i comandi vocali non verranno installati.

E’ quindi importante, da parte nostra, decidere in quali country distribuire la nostra applicazione e quali lingue utilizzare. Possiamo infatti specificare più di una lingua all’interno del nostro VCD ma, come è facile intuire, tutti i comandi vocali dovranno essere tradotti.

NOTA: se sviluppate un applicazione incentrata sui comandi vocali, la scelta della country e di conseguenza della localizzazione del VCD è di vitale importanza. La vostra applicazione non sarebbe utilizzabile su device la cui lingua non è supportata.

Nel nostro esempio, settiamo la lingua italiana usando it-IT.

Subito sotto la lingua, troviamo i tag CommandPrefix e Example.

30-01-2013 21.09

Il CommandPrefix,sebbene sia opzionale, è quello che identifica la nostra applicazione a livello di Voice Command. Se lo tralasciamo, il Voice Command userà il nome della nostra applicazione per avviarla, diversamente userà il nome specificato nel file VCD. L’utilizzo di un nome diverso da quello dell’app, può essere necessario tipicamente in 2 diversi scenari:

  1. la nostra app ha un nome difficilmente pronunciabile: ad esempio D3m0. In questo caso, il command prefix servirà a definire un nome “pronunciabile” e “comprensibile”” per il Voice Command
  2. vogliamo localizzare il nome dell’applicazione: ad esempio, potremmo usare “Contoso Table” per l’inglese e “Contoso Mesa” per lo spagnolo.

L’Example è invece la stringa che verrà mostrata nell’help dei comandi vocali di Windows Phone (visibile quando pronunciamo “cosa posso dire”).

Definiti questi due elementi, possiamo passare ai veri e propri comandi che verranno interpretati dal Voice Command:

30-01-2013 21.43

Vediamo nel dettaglio i vari elementi che compongono il command:

Name è il nome del comando. Oltre a servire come riferimento nel file VCD, verrà passato alla nostra applicazione e ci servirà per implementare il nostro codice.
Example è l’esempio associato al comando. Serve a fornire agli utilizzatori della nostra app, un esempio su come utilizzare il comando vocale
ListenFor contiene la parola o la frase che verrà riconosciuta come comando. Per ogni command, ci possono essere al massimo 10 ListenFor. Ogni elemento può contenere sia parole opzionali (tra parentesi quadre) che parametri. Tratteremo il ListenFor dettagliatamente più avanti
Feedback è il feedback vocale che viene restituito all’utente quando il Voice Command comprende correttamente il comando
Navigate è opzionale e definisce la pagina di destinazine (deep link) in cui verrà aperta la nostra applicazione. Se omesso, la pagina di destinazione sarà quella di default della nostra applicazione

 

Come possiamo vedere dalla tabella, il ListenFor riveste una importanza fondamentale nella programmazione del Voice Command. Questo componente, “tradurrà” il nostro comando vocale in testo e lo cercherà all’interno di tutti i ListenFor, Quando troverà una corrispondenza, eseguirà la nostra applicazione, aprendo la pagina specificata nel Navigate e passando una serie di parametri in querystring. Per fare in modo che il Voice Command “agganci” correttamente il Command, è importante definire dei ListenFor che tengano conto delle eventuali varianti che i nostri utenti possono pronunciare. Ad aiutarci a restare nel limite dei 10 ListenFor per Command, abbiamo la possibilità di usare delle parole opzionali. Si tratta di parole che possono essere pronunciate ma non sono necessarie per il matching.

Facciamo qualche esempio. Prendiamo la nostra applicazione chiamata Demo che permette di scrivere degli appunti (note). Il ListenFor per aggiungere una nuova nota sarà ovviamente qualcosa del tipo:

aggiungi una nota

Se includessimo solo questo nel ListenFor del comando “AddNote”, l’utente sarebbe costretto a pronunciare esattamente questa frase per accedere alla funzionalità specifica. Comportamento molto restrittivo che sarebbe meglio evitare. Ragionando su altre possibili frasi, potremmo identificare:

  • scrivi una nota
  • scrivi nuova nota
  • scrivi nota
  • memorizza una nota
  • memorizza nuova nota
  • etc.

Dato che le possibili permutazioni possono essere davvero tante, possiamo ricorrere alle parole opzionali per limitare il numero delle stringhe. Individuati gli elementi comuni, racchiudiamo il resto tra parentesi quadre. I nostri elementi si riducono quindi a:

  • aggiungi [una] [nuova] nota
  • scrivi [una] [nuova] nota
  • memorizza [una] [nuova] nota

Personalmente sconsiglio l’utilizzo di troppe wildcard specie se le nostra applicazione diversi comandi. In presenza di svariati comandi, avere troppe parole opzionali potrebbe creare confusione nel Voice Command, rallentarlo e sbagliare il comando da avviare.

Oltre alle frasi da far riconoscere per avviare il comando, potremmo avere la necessità di passare alla nostra applicazione dei parametri. Supponiamo ad esempio di voler aggiungere un comando per l’apertura di una nota. Alla nostra applicazione dovrà necessariamente arrivare un riferimento alla nota da aprire (ad esempio l’ID). L’ipotetico comando potrebbe essere

apri nota 1

A differenza del ListenFor precendente, in questo caso abbiamo la necessità di suddividere il riconoscimento in 2 fasi: la prima parte (apri nota) servirà ad identificare il comando mentre la seconda ci servirà per identificare e passare alla nostra applicazione il parametro.

Per specificare quelli che sono i parametri nel ListenFor, dobbiamo usare le parentesi graffe:

  • [apri] [visualizza] nota [numero] {*}

in questo modo, tutto quello che viene detto dopo la parola nota (o numero, che è opzionale), verrà passato come parametro. Sta a noi (ed alle esigenze della nostra applicazione), permettere di passare come parametro tutto ciò che viene pronunciato o “confinare” la scelta su un numero ristretto di parole (o frasi). Questa possibilità ci viene fornita sempre all’interno del VoiceCommandDefinitio file nel tag PhraseList. Lo scopo di questo elemento è quello di effettuare un secondo livello di riconoscimento su quanto viene dettato ed effettuare il matching su una lista di parametri. Supponiamo, ad esempio, che la nostra applicazione permetta di creare delle note raggruppate in categorie specifiche (ad esempio “da fare”, “spesa”, “lavoro”) e che vogliamo impostare un comando per aprire la lista delle note di una categoria specifica. Il ListenFor potrebbe essere qualcosa del tipo:

  • [apri] [visualizza] sezione {section}

  Aggiungeremo quindi la l’elemento section al nostro file VCD:

31-01-2013 00.29

Quando pronunceremo il nostro comando, il Voice Command effettuerà quindi una prima analisi per individuare il comando corretto scorrendo i vari ListenFor e, se troverà corrispondenza con quello in cui abbiamo specificato dei parametri, effettuerà una nuova ricerca nell’elemento PhraseList e ne passerà il risultato alla nostra applicazione specificando che si tratta di un parametro. Nella nostra implementazione (che vedremo in un successivo post), sarà nostra cura estrarre il parametro e comportarci di conseguenza.

A questo punto, abbiamo tutti gli elementi di base per costruire il nostro file VCD e possiamo passare ai prossimi passi per implementare il riconoscimento vocale nelle nostre applicazioni. Altre funzionalità più evolute verranno descritte in futuri post (esulano infatti dallo scopo di questa serie di post),

Nel prossimo post, vedremo come registrare correttamente il VCD nel sistema.

,