4. WP7.x vs WP8
• WP7.x ha il supporto ai comandi vocali (ad esempio «Avvia MyApp» per
eseguire l’applicazione MyApp);
• WP7.x permette la lettura degli SMS da parte del device;
• WP7.x permette all’utente di scrivere SMS dettandoli.
….ma tutte queste funzionalità non sono accessibili allo sviluppatore!!!
5. WP7.x vs WP8
Windows Phone 8 permette allo sviluppatore di utilizzare completamente il
supporto legato all’utilizzo della voce:
• Le nostre applicazioni possono «parlare» utilizzando le funzionalità di
Speech Synthesis (Text To Speech);
• Le nostre applicazioni possono essere avviate utilizzando comandi
anche complessi (Voice Command);
• Le applicazioni sono in grado di comprendere ciò che l’utente
pronuncia (Speech Recognition).
6. WP7.x vs WP8
Le funzionalità di Speech Recognition necessitano di una
connessione ad internet per funzionare
• ergo non date all’utente solo il riconoscimento vocale per
eseguire un’operazione.
Le funzionalità di Speech Synthesis (Text to Speech) e dei comandi
vocali (Voice Command) non necessitano di una connessione ad
internet.
8. Text to Speech
Per utilizzare il Text To Speech l’applicazione deve avere la capability
ID_CAP_SPEECH_RECOGNITION abilitata nel manifest.
Le classi utili per il Text To Speech sono nel namespace
Windows.Phone.Speech.Synthesis
9. Text to Speech – facile facile
• La classe SpeechSynthesizer fornisce funzionalità di base per il
TTS;
• Il metodo SpeakTextAsync «legge» il contenuto di una stringa
in maniera Asincrona (richiede il modificatore Async nel
chiamante);
• Il TTS funziona anche se non c’è connettività.
Public Async Sub Speak()
Dim synth = New SpeechSynthesizer()
Await synth.SpeakTextAsync("Ciao a tutti!")
End Sub
10. Text to Speech – le voci
La classe InstalledVoices mette a disposizione l’elenco delle voci
installate nel dispositivo.
La classe VoiceInformation contiene informazioni riguardo la
specifica voce come lingua, genere (maschile o femminile), nome
visualizzato e descrizione estesa.
Public Sub SetItalianVoice()
Dim synth = New SpeechSynthesizer()
Dim italianVoices = From v In InstalledVoices.All
Where v.Language = "it-IT"
Select v
synth.SetVoice(italianVoices.First)
End Sub
11. Text to Speech - Speech Synthesis Markup Language
Il Synthesizer è in grado di utilizzare anche file XML secondo lo
standard SSML.
Dim ssmlUri = New Uri("ms-appx:///SSML.xml",
UriKind.RelativeOrAbsolute)
Await _synth.SpeakSsmlFromUriAsync(ssmlUri)
12. Text to Speech - Speech Synthesis Markup Language
SSML è uno standard W3C (http://www.w3.org/TR/speech-
synthesis/)
<!DOCTYPE speak PUBLIC "-//W3C//DTD SYNTHESIS 1.0//EN«
"http://www.w3.org/TR/speech-synthesis/synthesis.dtd">
<speak version="1.0«
xmlns=http://www.w3.org/2001/10/synthesis
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://www.w3.org/2001/10/synthesis
http://www.w3.org/TR/speech-synthesis/synthesis.xsd"
xml:lang="it-IT">
<p>
<voice gender="female">
<s>Utilizzare le <voice xml:lang="en-US">Speech API</voice>
per dialogare con il proprio <emphasis>Windows Phone 8</emphasis></s>
</voice>
</p>
</speak>
15. Comandi Vocali
• Possiamo utilizzare la voce per avviare le nostre applicazioni.
• Per l’utilizzo dei Comandi Vocali non è necessaria una connessione ad
internet.
• Le classi che permettono la gestione dei comandi vocali sono nel
namespace Windows.Phone.Speech.VoiceCommands.
• Sono necessarie le seguenti capability:
• ID_CAP_MICROPHONE
• ID_CAP_NETWORKING
• ID_CAP_SPEECH_RECOGNITION
16. Comandi Vocali – Voice Command Definition File
E’ un file XML che contiene le
informazioni relative ai comandi vocali
supportati dalla nostra applicazione.
Deve essere «installato» almeno una
volta prima di poter essere disponibile
nel sistema.
Ogni applicazione ha, al massimo, un
solo VCD.
Può contenere comandi localizzati
17. Comandi Vocali – Voice Command Definition File
Nome identificativo
del set di comandi
Vocabolo che avvia
l’applicazione
Tag che identifica il singolo comando
Esempio di comando
visualizzato dal sistema nell’help
Sintassi del comando:
possono esserci vocaboli non obbligatori e placeholder
che possono essere sostituiti da liste di valori
Feedback visivo (e vocale) che il sistema
restituisce all’utente quando il comando
è compreso
Pagina dell’applicazione che deve
essere aperta dal sistema
Elenco di valori (Phrase List)
utilizzabili cone «variabili» nei
comandi
18. Comandi Vocali - Installare un VCD
La classe VoiceCommandService ci consente di installare un VCD:
Try
Dim vcdUri = New System.Uri("ms-appx:///VoiceCommandDefinition.xml",
UriKind.Absolute)
Await VoiceCommandService.InstallCommandSetsFromFileAsync(vcdUri)
MessageBox.Show("VCD Installato correttamente!")
Catch ex As Exception
MessageBox.Show("Errore: " & ex.Message)
End Try
20. Comandi Vocali e QueryString
Nel momento in cui avviamo la nostra applicazione utilizzando un comando
vocale, i parametri riconosciuti dal sistema e definiti nel VCD vengono restituiti
nella query string del NavigationContext.
Private Sub MainPage_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
If NavigationContext.QueryString.ContainsKey("voiceCommandName") Then
Dim voiceCommand = NavigationContext.QueryString("voiceCommandName")
Select Case voiceCommand
Case ”OpenDocument”
' Apri il document
Dim docNumber = NavigationContext.QueryString("number")
Case ”SearchDocument”
' Ricerca document
Dim docTitle = NavigationContext.QueryString("title")
End Select
End If
End Sub
22. Comandi Vocali - Phrase list
• Non è possibile aggiungere dinamicamente dei comandi
• Si possono aggiungere dinamicamente valori alle phrase list
• Per modificare una phrase list occorre:
• Recuperare il set di comandi in base alla lingua;
• Eseguire l’update della phrase list (la lista può essere solo
completamente riscritta).
Dim voiceCommandSet = VoiceCommandService.InstalledCommandSets("DemoIta")
If voiceCommandSet IsNot Nothing Then
Await voiceCommandSet.UpdatePhraseListAsync("title",
{"promessi sposi", "divina commedia", "guerra e pace"})
End If
25. Riconoscimento Vocale
• WP8 include:
• un runtime di Speech Recognition;
• delle API per interagire con l’utente;
• grammatiche di default;
• GUI per permettere all’utente di conoscere e scoprire le funzionalità di speech
recognition.
• Per il riconoscimento vocale è necessaria una connessione ad internet.
• Le classi per il riconoscimento vocale sono nel namespace
Windows.Phone.Speech.Recognition
• Per utilizzare le funzionalità di riconoscimento vocale sono necessarie le seguenti
capability:
• ID_CAP_MICROPHONE
• ID_CAP_NETWORKING
• ID_CAP_SPEECH_RECOGNITION
26. Riconoscimento Vocale - Grammatiche
• Una grammatica definisce le parole e le frasi che un motore di
riconoscimento vocale è in grado di comprendere.
• In WP8 abbiamo tre tipologie di grammatiche :
• Grammatiche predefinite: sono due, una pensata per le ricerche web e
l’altra per le piccole frasi (tipicamente gli SMS);
• Lista di vocaboli: è una grammatica custom, molto leggera, composta
da una lista di vocaboli (o brevissime frasi). Adatta alla selezione di
opzioni;
• Grammatica XML: basata sullo standard SRGS (Speech Recognition
Grammar Specification) versione 1.0. Permette di avere anche
grammatiche complesse.
27. Riconoscimento Vocale – facile facile
La modalità più semplice per implementare delle funzionalità di
riconoscimento vocale è l’utilizzo della classe SpeechRecognizerUI.
La SpeechRecognizerUI apre l’interfaccia che
comunica all’utente che il sistema è in ascolto.
Se non vogliamo la UI possiamo utilizzare la classe
SpeechRecognizer
Dim _RecoUI = New SpeechRecognizerUI
Dim recoResult = Await _RecoUI.RecognizeWithUIAsync()
If recoResult.ResultStatus = SpeechRecognitionUIStatus.Succeeded Then
Me.txtRecognized.Text = recoResult.RecognitionResult.Text
Else
MessageBox.Show(recoResult.ResultStatus.ToString())
End If
28. Riconoscimento Vocale – Phrase List Grammar
Se vogliamo limitare le parole che il motore di riconoscimento vocale è in
grado di riconoscere possiamo utilizzare una lista di vocaboli come
grammatica.
La collezione Grammars della classe SpeechRecognizer permette di
aggiungere permette di gestire la grammatica.
Possiamo aggiungere quante liste vogliamo identificandole con una chiave
(nell’esempio «phraseList», detta anche «Rule»)
08/10/201328
Private Async Function InitializeSpeechRecognizer() As task
' Istanzio l'oggetto da utilizzare per il riconoscimento
recognizer = New SpeechRecognizer
' Imposto il file di grammatica ed eseguo il preloading
recognizer.Grammars.AddGrammarFromList("phraseList",
{"topolino", "minni", "paperino", "pluto", "paperina", "pippo"})
Await recognizer.PreloadGrammarsAsync()
End Function
29. Riconoscimento Vocale – Custom Grammar
Il formato SRGS permette di ottenere
grammatiche complesse e custom.
SRGS è standard W3C
http://www.w3.org/TR/speech-grammar/
08/10/201329
Private Async Function InitializeSpeechRecognizer() As task
' Istanzio l'oggetto da utilizzare per il riconoscimento
recognizerUI = New SpeechRecognizerUI
' Imposto alcune proprietà di interfaccia
recognizerUI.Settings.ListenText = "Dimmi quali album o artisti vuoi trovare“
recognizerUI.Settings.ExampleText = "Trova artisti nella categoria rock“
' Creo l'URI relativo al file di grammatical
Dim grammarFileUri = New Uri("ms-appx:///SRGSGrammar.xml")
' Imposto il file di grammatica ed eseguo il preloading
recognizerUI.Recognizer.Grammars.AddGrammarFromUri("myGrammar", grammarFileUri)
Await recognizerUI.Recognizer.PreloadGrammarsAsync()
End Function