wtorek, 22 stycznia 2013

Windows Phone 8 na żywo - odc.3 (rozmowa z telefonem!)

Kontynuacja mojego gadania do telefonu. Tym razem dłuższy dialog… Zapraszam do rzucenia okiem na krótki filmik, który to przedstawia.

Jak zrobić rozmowę? Wystarczy, że umiejętnie wykorzystamy API do zamiany tekstu na mowę i do rozpoznawania mowy. W poprzednio prezentowanej aplikacji dodałem przycisk mikrofonu, który pozwala głosowo odpowiedzieć na pytania zadawane przez telefon i w ten sposób wybrać utwór do zagrania. U mnie sprowadziło się do jednej metody:

        private async void PromptThenPlayVideoByVoice()
        {
            try
            {
                var speechSynthesizer = new SpeechSynthesizer();
                var speechRecognizerUI = new SpeechRecognizerUI();               

                var videoList = GetVideoPhrases(new string[] { "ostatni", "losowy" });
                var confirmationList = new List<string> { "OK", "nie" };

                speechRecognizerUI.Recognizer.Grammars.AddGrammarFromList("videos", videoList);
                speechRecognizerUI.Recognizer.Grammars.AddGrammarFromList("confirmation", confirmationList);
                await speechRecognizerUI.Recognizer.PreloadGrammarsAsync();


                await speechSynthesizer.SpeakTextAsync("Jaki utwór mam zagrać?");
               
                speechRecognizerUI.Recognizer.Grammars["confirmation"].Enabled = false;
                speechRecognizerUI.Settings.ListenText = "Jaki utwór mam zagrać?";
                speechRecognizerUI.Settings.ExampleText = "'Ostatni', 'losowy' lub tytuł";
                speechRecognizerUI.Settings.ShowConfirmation = false;

                var videoResult = await speechRecognizerUI.RecognizeWithUIAsync();

                if (videoResult.ResultStatus == SpeechRecognitionUIStatus.Succeeded
                    && videoResult.RecognitionResult.TextConfidence == SpeechRecognitionConfidence.High)
                {
                    await speechSynthesizer.SpeakTextAsync("Usłyszałam " + videoResult.RecognitionResult.Text + ". Czy prawidłowo?");

                    speechRecognizerUI.Recognizer.Grammars["confirmation"].Enabled = true;
                    speechRecognizerUI.Recognizer.Grammars["videos"].Enabled = false;                   
                    speechRecognizerUI.Settings.ListenText = videoResult.RecognitionResult.Text + "?";
                    speechRecognizerUI.Settings.ExampleText = "'OK' lub 'Nie'";                   

                    var confirmationResult = await speechRecognizerUI.RecognizeWithUIAsync();

                    if (confirmationResult.ResultStatus == SpeechRecognitionUIStatus.Succeeded
                        && confirmationResult.RecognitionResult.TextConfidence == SpeechRecognitionConfidence.High)
                    {
                        if (confirmationResult.RecognitionResult.Text == "OK")
                        {
                            var title = videoResult.RecognitionResult.Text;

                            await speechSynthesizer.SpeakTextAsync("Gram " + title + ".");

                            var files = await ApplicationData.Current.LocalFolder.GetFilesAsync();
                            var file = FindVideoWithTitle(files, title);

                            …

                            if (file != null)
                            {
                                Play(file.Name);
                            }
                        }
                        else if (confirmationResult.RecognitionResult.Text == "nie")
                            await speechSynthesizer.SpeakTextAsync("Przepraszam za pomyłkę.");                       
                    }
                    else
                        await speechSynthesizer.SpeakTextAsync("Nie zrozumiałam twojej odpowiedzi.");
                }
                else
                {                   
                    await speechSynthesizer.SpeakTextAsync("Nie zrozumiałam nazwy utworu.");
                }
            }
            catch(Exception ex)
            {
               
            }
        }

Wnikliwe oko zauważy, że wykorzystałem tutaj proste listowe gramatyki. Warto też dodać, że postanowiłem reużytkować moduł rozpoznawczy i wybrałem opcję z załadowaniem wszystkich gramatyk i ich włączaniem/wyłączaniem w zależności od pytania, które zadaję.

W zasadzie możnaby na tym poprzestać. Ale dorobiłem alternatywny sposób wyzwolenia tego dialogu. W tym celu pozwoliłem sobie dopisać… komendę głosową (obok tej prezentowanej w poprzednim poście):

   <Command Name="play">
      <Example>Graj</Example>
      <ListenFor>Graj</ListenFor>
      <Feedback>Granie na żądanie</Feedback>
      <Navigate Target="/StartPage.xaml"/>
    </Command>

Teraz mogę mówić także “Tuba, graj” (obok “Tuba, (graj) {tytuł}”, “Tuba, (graj) ostatni” czy “Tuba, (graj) losowy”).  Gdy powiem tylko “Tuba, graj”, to aplikacja owszem otworzy się, ale ponieważ nie wie, co chcemy, więc się nas zaczyna pytać –;)  Taki scenariusz trafił właśnie do mojego filmiku.

Brak komentarzy: