windows phone 8 - speech api
DESCRIPTION
Sessione "Windows Phone 8 - Speech API" tenuta durante l'evento Community Days 2013 Catania.TRANSCRIPT
![Page 1: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/1.jpg)
WP801– Windows Phone 8: Speech API
#CDays13CT – 20 e 21 maggio 2013
Massimo Bonanni
Senior .NET Developer @ THAOS s.r.l.
[email protected]: @massimobonannihttp://codetailor.blogspot.com
![Page 2: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/2.jpg)
Grazie aSponsor
![Page 3: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/3.jpg)
• WP7.x vs WP8• Comandi Vocali• Text to Speech• Riconoscimento Vocale• Conclusioni
agenda
![Page 4: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/4.jpg)
• 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!!!
WP7.x vs WP8
![Page 5: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/5.jpg)
• Windows Phone 8 permette allo sviluppatore di utilizzare completamente il supporto legato all’utilizzo della voce;
• Le nostre applicazioni possono essere avviate utilizzando comandi anche complessi (Voice Command);
• Le nostre applicazioni possono «parlare» utilizzando le funzionalità di Speech Synthesis (Text To Speech);
• Le applicazioni sono in grado di comprendere ciò che l’utente pronuncia (Speech Recognition).
WP7.x vs WP8
![Page 6: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/6.jpg)
Le funzionalità di Speech Recognition possono utilizzare una connessione internet:
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.
WP7.x vs WP8
![Page 7: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/7.jpg)
• 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
Comandi Vocali
![Page 8: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/8.jpg)
• 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
Voice Command Definition File
![Page 9: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/9.jpg)
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.0">
<CommandSet xml:lang="it-IT" Name="DemoIta">
<CommandPrefix>Demo</CommandPrefix>
<Example>Apri nuovo documento.</Example>
<Command Name="OpenDocument">
<Example> apri documento 1</Example>
<ListenFor> apri documento [numero] {number}</ListenFor>
<Feedback> Sto aprendo il documento numero {number}... </Feedback>
<Navigate />
</Command>
.
.
.
<PhraseList Label="number">
<Item> 1 </Item>
<Item> 2 </Item>
<Item> 3 </Item>
</PhraseList>
</CommandSet>
</VoiceCommands>
Voice Command Definition FileNome 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 viene
correttamente interpretato
Pagina dell’applicazione che deve essere aperta dal sistema
Elenco di valori (Phrase List) utilizzabili cone «variabili» nei comandi
![Page 10: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/10.jpg)
La classe VoiceCommandService ci consente di installare un VCD:
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
![Page 11: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/11.jpg)
Come funzionano
Demo, cerca Promessi
Sposi
/MainPage.xaml?voiceCommandNa
me=SearchDocument&reco=Demo%
20cerca%20promessi
%20sposi&title=pro....
![Page 12: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/12.jpg)
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.
Comandi Vocali e QueryString
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
![Page 13: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/13.jpg)
Comandi Vocali - Help dei comandi
Il file dei comandi viene utilizzato anche per l’help visuale da mostrare all’utente:
![Page 14: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/14.jpg)
• 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).
Comandi Vocali - Phrase list
Dim voiceCommandSet = VoiceCommandService.InstalledCommandSets("DemoIta")If voiceCommandSet IsNot Nothing Then Await voiceCommandSet.UpdatePhraseListAsync("title", {"promessi sposi", "divina commedia", "guerra e pace"})End If
![Page 15: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/15.jpg)
DEMOComandi Vocali
![Page 16: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/16.jpg)
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
Text to Speech
![Page 17: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/17.jpg)
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à.
Text to Speech – facile facile
Public Async Sub Speak() Dim synth = New SpeechSynthesizer() Await synth.SpeakTextAsync("Ciao a tutti!")End Sub
![Page 18: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/18.jpg)
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.
Text to Speech – le voci
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
![Page 19: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/19.jpg)
Il Synthesizer è in grado di utilizzare anche file XML secondo lo standard Speech Synthesis Markup Language (SSML)
Text to Speech - Speech Synthesis Markup Language
Dim synth = New SpeechSynthesizer()Dim ssmlUri = New Uri("ms-appx:///SSML.xml", UriKind.RelativeOrAbsolute) Await synth.SpeakSsmlFromUriAsync(ssmlUri)
![Page 20: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/20.jpg)
SSML è standard W3C (http://www.w3.org/TR/speech-synthesis/)
Text to Speech - Speech Synthesis Markup Language
<!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>
![Page 21: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/21.jpg)
DEMOText to Speech
![Page 22: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/22.jpg)
• 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 potrebbe essere 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
Riconoscimento Vocale
![Page 23: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/23.jpg)
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.
Riconoscimento Vocale - Grammatiche
![Page 24: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/24.jpg)
La modalità più semplice per implementare delle funzionalità di riconoscimento vocale è l’utilizzo della classe SpeechRecognizerUI.
La SpeechRecognizerUI apre l’interfaccia checomunica all’utente che il sistema è in ascolto.Se non vogliamo la UI possiamo utilizzare la classeSpeechRecognizer
Riconoscimento Vocale – facile facile
Dim _RecoUI = New SpeechRecognizerUI Dim recoResult = Await _RecoUI.RecognizeWithUIAsync() If recoResult.ResultStatus = SpeechRecognitionUIStatus.Succeeded Then Me.txtRecognized.Text = recoResult.RecognitionResult.TextElse MessageBox.Show(recoResult.ResultStatus.ToString()) End If
![Page 25: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/25.jpg)
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»).Usando le phrase list non si ha la necessità della connessione internet.
Phrase List Grammar
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
![Page 26: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/26.jpg)
Il formato SRGS permette di ottenere grammatiche complesse e custom.
Se utilizziamo l’SRGS non abbiamo bisognodella connessione ad internet.SRGS è standard W3Chttp://www.w3.org/TR/speech-grammar/
Custom Grammar
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
![Page 27: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/27.jpg)
DEMORiconoscimento Vocale
![Page 28: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/28.jpg)
Utilizzare la voce permette di fornire una user experience migliore rispetto alla sola interazione touch ma…..
– Usate comandi semplici e “naturali”;– Implementate sempre la controparte touch (non solo voce);– Scegliete un numero di comandi congrui (non ne prevedete troppi);– Mantenete le frasi corte per evitare “falsi positivi”;– Date un feedback all’utente e la possibilità di annullare un commando;– Localizzate l’utilizzo della voce in tutte le lingue previste dall’applicazione;– Permettete all’utente di selezionare la voce che più preferisce;– Gli scenari vocali debbono essere interamente vocali (no mix con touch).
Conclusioni
![Page 29: Windows phone 8 - Speech API](https://reader035.vdocuments.site/reader035/viewer/2022062510/54b667114a795974768b45c0/html5/thumbnails/29.jpg)
Q&ATutto il nateriale di questa sessione suhttp://www.communitydays.it/
#CDays13CT