Greetings, Cortana.

4 במאי 2014

תגיות: , ,
3 תגובות

אחד הפיצ'רים המלהיבים (אם לא המלהיב ביותר) ב-Windows Phone 8.1 הבאה עלינו לטובה היא Cortana, העוזרת האישית החדשה הכלולה עם גרסתה האחרונה של מערכת ההפעלה.

1

Cortana היא הרבה מעוד שירות בסמארטפון שלנו, היא עוזרת אישית חכמה ויעילה הלומדת את צרכי המשתמש השונים ופועלת על פיהם – כפי שהייתם מצפים מעוזרת אישית אמיתית.

לנו כמפתחים, Microsoft נותנת את היכולת והכוח להרחיב את היכולות של Cortana ולאפשר לה לתמוך במגוון רחב של פקודות ופעולות.

תהליך האינטגרציה עם Cortana מתבצע בצורה פשוטה מאוד וכולל 4 צעדים פשוטים:

1. הוספת תמיכה במיקרופון ויכולת זיהוי דיבור (Microphone capability) לקובץ ה-manifest של האפליקציה.

2. יצירת קובץ פקודות אשר בו נגדיר את הפקודות החדשות ובאיזו צורה נרצה לבצע זאת מבחינה סמנטית.
הקובץ שאותו ניצור יהיה קובץ VCD (Voice Command Definition) בפורמט xml.

3. רישום קובץ הפקודות הנ"ל במערכת ההפעלה על מנת שנוכל להפעיל אותן בכל עת שנרצה ע"י Cortana.
את הרישום נבצע ע"י המתודה האסינכרונית VoiceCommandService.InstallCommandSetsFromFileAsync.

4. כתיבת קוד שיגיב לפקודות השונות ויבצע כל דבר שנחפוץ בהתאם לפקודה שנאמרה.

אז לאחר שהסברנו מעט תיאוריה, הגיע הזמן לכתוב קצת קוד, לראות כיצד הדברים עובדים הלכה למעשה… J
לשם כך, אנו נבנה ביחד דוגמא קטנה ובסיסית אשר תאפשר ל-Cortana לקבל שם של קבוצת כדורגל (מתוך שלוש קבוצות אפשריות) ולפתוח את אתר הבית שלה כדי שנוכל לגלוש בו.
יתרה מכך, Cortana תדע לפתוח את אתר הבית של קבוצת הכדורגל המועדפת עלי.
את הדוגמא אנו כתוב מההתחלה עד הסוף, ונראה כיצד לממש את כל השלבים הדרושים לכך.

ראשית, נוסיף את תמיכת ה-speech לאפליקציה.
על מנת לעשות זאת אנו צריכים לגשת אל קובץ ה-manifest, להיכנס לטאב ה-Capabilities ולסמן את האפשרות Microphon, דבר מוסיף לנו מאחורי הקלעים תמיכה ב- ID_CAP_SPEECH_RECOGNITION.

1

1. השלב הבא הוא להוסיף לפרויקט קובץ VCD הכולל את הפקודות שאותן נרצה ללמד את Cortana.
את קובץ ה-VCD נוסיף כקובץ xml נקי אשר בו נתחיל לכתוב את כל מה שאנו צריכים בשביל התהליך.
תחביר קובץ הפקודות הוא פשוט מאוד וכולל מס' חלקים שיש להכיר (אשר לא כולם הם חובה):
CommandSet – אלמנט חובה המשמש כמכולה לכל הפקודות בשפה מסויימת.
האלמנט את ה-xml:lang attribute ייחודי אשר בו נגדיר את השפה של הפקודות אשר יהיו תחתיה וכוללת גם פרמטר אופציונאלי מסוג Name המאפשר לנו לגשת לאלמנט בצורה תכנותית.

<CommandSet xml:lang="en-us" Name="demoEnglishCommands">

      ...

</CommandSet>

CommandPrefix – אלמנט אופציונאלי המאפשר לנו להכניס ערך "ידידותי למשתמש" על מנת לפשט את הגישה לאפליקציה שלנו ע"י פקודות קוליות. אחד השימושים הנפוצים לכך הוא כאשר יש לאפליקציה שלנו שם ארוך, מסובך ו/או שם שלא ניתן להגייה בצורה נוחה.

<CommandPrefix>Sport</CommandPrefix>

Example – אלמנט זה הוא חובה הן ברמת ה- CommandSetוהן ברמת ה- Command (אשר נרחיב על כך בסעיף הבא) ומאפשר לנו להציג למשתמש דוגמאות כיצד לגשת אל האפליקציה שלנו ע"י אותן פקודות קוליות.
פקודות אלו יופיעו למשתמש כאשר הוא יצפה במסך ה-"What can I say" של Cortana. מסך אשר ניתן להגיע אליו גם בפקודה קולית וגם בלחיצה על See more.
שימו לב שהערך שאתם מכניסים לא יכלול את שם או ה-prefix של האפליקציה מכיוון שזה מטופל ומופיע אוטומטית בעת ההצגה למשתמש.

<Example>open my favorite team's official website</Example>

Command – אלמנט חובה המאפשר לנו להגדיר פקודה קולית מול האפליקציה שלנו.
אלמנט זה כולל 4 חלקים עיקריים אשר חייבים להיות כתובים בסדר זה בעת הגדרת ה-Command:

· Example – פעולה זהה למה שהגדרנו בסעיף הנ"ל.

· ListenFor – ההגדרה הסמנטית של הפקודה שלנו. ההגדרה כוללת ביטוי או מילה שהאפליקציה שלנו תדע לזהות ולפעול בהתאם כאשר ניתן להגדיר עד 10 הגדרות שכאלה לפקודה אחת.
נוכל לכתוב את ההגדרה כך שתדע לתמוך במס' ביטויים ידועים מראש, כפי שנסביר בסעיף הבא, או לחילופין תדע לתמוך ב- wildcard דבר המאפשר לנו לבצע התאמה חופשית יותר.

· Feedback – הטקסט שיוצג למשתמש כתגובה לפקודה הקולית שלו.

· Navigate – דף הנחיתה של הפקודה שלנו במידה והיא תזוהה ע"י Cortana.
בדף זה אנו נקבל את המידע מהמשתמש, נעבד ונגיב בהתאם.

<Command Name="SearchForTeams">

  <Example>open 'Manchester United'</Example>

  <ListenFor>Open {teams}</ListenFor>

  <Feedback>Opening official website...</Feedback>

  <Navigate Target="Team.xaml" />

</Command>

PhraseList – אלמנט המאפשר לנו למלא בצורה דינאמית תבנית של פקודה מסויימת. כך בעצם אנו לא צריכים לשכפל אותה ויכולים להחליף בה רק ערכים מסויימים בהתאם למידת התמיכה שאנו רוצים לספק.
אלמנט זה מאפשר לנו לגשת אליו בצורה תכנותית ולבצע שינוי ברשימת הערכים ב-run time.

<PhraseList Label="teams">

   <Item>Manchester United</Item>

   <Item>Barcelona</Item>

   <Item>Liverpool</Item>

</PhraseList>

PhraseTopic – קיים אלמנט אופציונאלי המאפשר לנו להכניס "טקסט חופשי" לפקודה הקולית שלנו ו/או ליצור חיפוש ממוקד ומתאים יותר עפ"י צרכי המשתמש והאפליקציה (בדוגמא זו אין בו שימוש).

אז לאחר שסקרנו את חלקי קובץ ה-VCD השונים, להלן הקובץ המלא הכולל שתי פקודות בסיסיות:

<?xml version="1.0" encoding="utf-8"?>

<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.1">

  <CommandSet xml:lang="en-us" Name="englishCommands">

    <CommandPrefix>Sport</CommandPrefix>

    <Example>Sport demo app</Example>

    <Command Name="SearchForTeams">

      <Example>open 'Manchester United'</Example>

      <ListenFor>Open {teams}</ListenFor>

      <Feedback>Opening official website...</Feedback>

      <Navigate Target="Team.xaml" />

    </Command>

    <Command Name="OpenFavoriteTeam">

      <Example>open my favorite team's official website</Example>

      <ListenFor>open my favorite team's official website</ListenFor>

      <Feedback>Opening 'Manchester United' official website...</Feedback>

      <Navigate Target="Team.xaml" />

    </Command>

    <PhraseList Label="teams">

      <Item>Manchester United</Item>

      <Item>Barcelona</Item>

      <Item>Liverpool</Item>

    </PhraseList>

    <PhraseTopic Label="favouritTeameNaturalLanguage" Scenario="Search">

      <Subject>my favorite</Subject>

    </PhraseTopic>

  </CommandSet>

</VoiceCommands>

אוקי, הגדרנו את קובץ הפקודות שלנו וכעת נצטרך לרשום אותו במערכת ההפעלה על מנת ש-Cortana תוכל ותדע לזהות אותן.
את הרישום אנו נעשה בצורה אסינכרונית ע"י המתודה InstallCommandSetsFromFileAsync של המחלקה הסטטית VoiceCommandService.

Task.Run(async () =>

{

    try

    {

        var vcdFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///MyDemoVoiceCommands.xml"));

        await Windows.Media.SpeechRecognition.VoiceCommandManager.InstallCommandSetsFromStorageFileAsync(vcdFile);

    }

    catch (Exception ex)

    { }

});

כאשר מתודה זו רצה, היא בעצם מתקינה את קובץ ה-VCD במערכת ההפעלה ומסירה אותו רק כאשר האפליקציה מוסרת מהמכשיר.

1. לבסוף, נשאר לנו רק לכתוב את הקוד של עמוד הנחיתה שלנו. העמוד שיקבל את האינפורמציה מהמשתמש ויגיב בהתאם.
על מנת לעשות זאת אנו נשתמש במתודה Application.OnActivated הנמצאת בקובץ ה-App.xaml.cs שלנו.
בעת כתיבת הקוד, אוכל לזהות שהאפליקציה שלי הופעלה ע"י פקודה קולית ולחלץ את כל הפרמטרים הדרושים כדי לבצע מה שהמשתמש ביקש ממני.

if (args.Kind == Windows.ApplicationModel.Activation.ActivationKind.VoiceCommand)

{

    var vcArgs = args as VoiceCommandActivatedEventArgs;

    SpeechRecognitionResult speechRecognitionResult = vcArgs.Result;


    string vcName = speechRecognitionResult.RulePath[0];

    string vcUserInput = speechRecognitionResult.Text;

    string vcNavigationTarget = speechRecognitionResult.SemanticInterpretation.Properties["NavigationTarget"][0];


    var rootFrame = ((Frame)Window.Current.Content);

    switch (vcName)

    {

        case "SearchForTeams":

            if (vcUserInput.Contains("Manchester United"))

            {

                rootFrame.Navigate(typeof(Teams), "http://www.manutd.com");

            }

            else if (vcUserInput.Contains("Barcelona"))

            {

                rootFrame.Navigate(typeof(Teams), "http://www.fcbarcelona.com");

            }

            else if (vcUserInput.Contains("Liverpool"))

            {

                rootFrame.Navigate(typeof(Teams), "http://www.liverpoolfc.com");

            }

            break;

        case "OpenFavoriteTeam":

            rootFrame.Navigate(typeof(Teams), "http://www.manutd.com");

            break;

        default:

            break;

    }

}

זהו! J
כעת, כל מה שנותר לעשות הוא להתחיל לדבר עם Cortana!

לדוגמא, על מנת לפתוח את אתר הבית של קבוצת Liverpool, פשוט אמרו ל-Cortana "sport open Liverpool" ועמוד הבית של הקבוצה יפתח בהתאם.
או לחילופין אם ברצונכם לפתוח את אתר הבית של הקבוצה המועדפת עלי, פשוט אמרו: "sport open my favorite team's official website" ואתר הבית של קבוצת מנצ'סטר יונייטד יפתח בצורה אוטומטית.

1

שימו לב כיצד הערכים שהכנסנו ל-Example בקובץ ה-VCD, מופיעים למשתמש בצורה נוחה על מנת שידע אלו פקודות הוספתם וכיצד יש להפעיל אותן:

1

למאמר זה מצורפת הדוגמא המלאה למי שרוצה להסתכל, לבדוק ולהבין כיצד הדברים נכתבים, מוגדרים ומתחברים.

כפי שאתם רואים להרחיב את היכולות של Cortana זה משהו שניתן לעשות די בקלות וללא הרבה עבודה – בין אם אתם מוסיפים את התמיכה לאפליקציה קיימת או מפתחים אפליקציה חדשה.

ניתן לעשות איתה המון דברים מעניינים ומגוונים ולהעצים את חווית השימוש של המשתמש באפליקציה שלכם ובמערכת ההפעלה Windows Phone עצמה.

שאלות בנושא פיתוח ל- Windows Phone? כנסו לפורום שלנו בעברית והתייעצו עם מיטב מומחי הקהילה!

liron selaהפוסט נכתב ע”י לירון רצבי, יועץ ומרצה בקבוצת סלע (Sela Group).
לירון יועץ, מפתח ומרצה בארגונים ובאקדמיה על Windows Phone, Windows 8/8.1, Web וכל מה שנגזר מכך.

ללירון יש ניסיון רב ותשוקה שלא נגמרת לחדשנות, סקירת טכנולוגיות, מציאת פתרונות וחקירת תחומים שונים ומגוונים.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

3 תגובות

  1. רפי5 במאי 2014 ב 10:53

    תודה! מעולה

    הגב
  2. יוסי27 במאי 2014 ב 10:43

    מחכים למדריך הבא שלך!……….

    הגב
  3. כרמל10 ביוני 2014 ב 15:23

    רק חבל שקורטנה לא זמינה בארץ. או בעברית

    הגב