קלט קולי

קלט קולי מאפשר לכם ליצור ממשק מלא בהפעלה קולית. זכוכית מספק שלוש דרכים להשתמש בקלט קולי.

הפקודות הקוליות הראשיות מפעילות את Glassware מכרטיס הבית, קול תלוי-הקשר פקודות יכולות לבצע פעולות בתוך פעילות, והדיבור של המערכת פעילות הזיהוי מאפשרת לך לקבל ממשתמשים קלט קולי בפורמט חופשי.

פקודות קוליות ראשיות

הפקודות הקוליות מפעילות את Glassware מכרטיס הבית (כרטיס השעון). אחרי ש הצהרה על פקודה קולית ראשית, Glass יוצר באופן אוטומטי פריט בתפריט המגע כברירת מחדל אם המשתמשים מחליטים להפעיל את ה-Glassware על ידי הקשה על כרטיס דף הבית.

כדי להוסיף פקודה קולית לתפריט הראשי של ok G סמל:

  1. יצירת משאב XML לפקודה הקולית ב- res/xml/<my_voice_trigger>.xml שמשתמשת באחת מהפקודות הקוליות הקיימות מוגדר ב VoiceTriggers.Command. לדוגמה, כך משתמשים באפשרות 'התחלת ריצה'.

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="START_A_RUN" />
    

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

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="POST_AN_UPDATE">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    
  2. לרשום מסנן Intent באמצעות פעולה אחת (com.google.android.glass.action.VOICE_TRIGGER) ב מניפסט של Android. מסנן Intent מפעיל את הפעילות או השירות שלך. אם הוא מזהה משתמשים שאומרים את הפקודה הקולית שלך.

    <?xml version="1.0" encoding="utf-8"?>
    <application ...>
        <activity | service ...>
            <intent-filter>
                <action android:name=
                        "com.google.android.glass.action.VOICE_TRIGGER" />
            </intent-filter>
            <meta-data android:name="com.google.android.glass.VoiceTrigger"
                android:resource="@xml/my_voice_trigger" />
        </activity | service>
        // ...
    </application>
    
  3. צריך להצהיר על מאפיין android:icon לפעילות או לשירות שלך. הדבר מאפשר ל-Glass להציג סמל עבור ה-Glassware ב- תפריט מגע אוקיי, זכוכית.

    <activity |service
        android:icon="@drawable/my_icon" ...>
      ...
    </activity | service>
    
  4. אם הפקודה הקולית משתמשת בהנחיה קולית ומתחילה פעילות, צריך להשיג כל טקסט מתומלל עם הקוד הבא (למשל onResume()):

    ArrayList<String> voiceResults = getIntent().getExtras()
            .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
    

    אם הפקודה הקולית מפעילה שירות, ה-Intent הנוסף זמין onStartCommand() קריאה חוזרת:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        ArrayList<String> voiceResults = intent.getExtras()
                .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
        // ...
    }
    

הגדרת מגבלות

אם דרושות לכם אחת מהתכונות הבאות או את כולן כדי להפעיל את ה-Glassware, לציין אותם במשאב res/xml/<my_voice_trigger>.xml. אם התכונות אינן זמינות, Glass משבית את הפקודה הקולית:

  • camera
  • network
  • microphone

    <trigger command="POST_AN_UPDATE">
        <constraints
            camera="true"
            network="true" />
    </trigger>
    

פקודות קוליות לפי הקשר

פקודות קוליות לפי הקשר מאפשרות למשתמשים לבצע פעולות מפעילויות. אתם בונים פקודות קוליות לפי הקשר באמצעות ממשקי ה-API הרגילים של תפריטים ב-Android, המשתמשים יכולים להפעיל את האפשרויות בתפריט באמצעות פקודות קוליות במקום במגע.

כדי להפעיל פקודות קוליות לפי הקשר לפעילות מסוימת:

  1. התקשרות אל getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS) בפעילות הרצויה כדי להפעיל פקודות קוליות לפי הקשר. עם התכונה הזו מופעלת, התפריט "אישור זכוכית" יופיע באזור הכותרת התחתונה של המסך בכל פעם שהפעילות הזו ממוקדת.

  2. שינוי מברירת המחדל של onCreatePanelMenu() ומטפל במקרה שבו WindowUtils.FEATURE_VOICE_COMMANDS מופעלת. אם האפשרות מופעלת, כאן מבצעים הגדרה חד-פעמית של התפריט, כמו ניפוח משאב תפריט או קריאה לMenu.add() שיטות ליצירת תפריט קולי.

  3. שינוי מברירת המחדל של onMenuItemSelected() כדי לטפל בפקודות הקוליות כשמשתמשים אומרים אותן. כשהמשתמשים מסיימים בחירה של אפשרות בתפריט, הפקודה הקולית "OK, זכוכית" תופעל באופן אוטומטי מופיע שוב בקטע הכותרת התחתונה במסך, מוכן לקבלת קול חדש הפקודה, כל עוד הפעילות נשארת ממוקדת.

    הקוד הבא מפעיל פקודות קוליות לפי הקשר, ומנפח משאב בתפריט בעת הצורך, ומטפל בפקודות קוליות כשהן נאמרות:

    public class ContextualMenuActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle bundle) {
            super.onCreate(bundle);
    
            // Requests a voice menu on this activity. As for any other
            // window feature, be sure to request this before
            // setContentView() is called
            getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        public boolean onCreatePanelMenu(int featureId, Menu menu) {
            if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) {
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
            }
            // Pass through to super to setup touch menu.
            return super.onCreatePanelMenu(featureId, menu);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        @Override
        public boolean onMenuItemSelected(int featureId, MenuItem item) {
            if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) {
                switch (item.getItemId()) {
                    case R.id.dogs_menu_item:
                        // handle top-level dogs menu item
                        break;
                    case R.id.cats_menu_item:
                        // handle top-level cats menu item
                        break;
                    case R.id.lab_menu_item:
                        // handle second-level labrador menu item
                        break;
                    case R.id.golden_menu_item:
                        // handle second-level golden menu item
                        break;
                    case R.id.calico_menu_item:
                        // handle second-level calico menu item
                        break;
                    case R.id.cheshire_menu_item:
                        // handle second-level cheshire menu item
                        break;
                    default:
                        return true;
                }
                return true;
            }
            // Good practice to pass through to super if not handled
            return super.onMenuItemSelected(featureId, item);
        }
    }
    

    הנה דוגמה למשאב התפריט שבו נעשה שימוש בפעילות הקודמת. שימו לב איך אפשר ליצור פריטים בתפריט מקונן לקול היררכי מערכת תפריטים. בדוגמה הבאה, האפשרות הראשונה בתפריט יכולה אפשר לגשת אליהם בתור: אוקיי זכוכית, הראו לי כלבים, לברדור.

    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- Use the constants defined in the ContextualMenus.Command enum-->
        <item
            android:id="@+id/dogs_menu_item"
            android:title="@string/show_me_dogs">
            <menu>
                <item
                    android:id="@+id/lab_menu_item"
                    android:title="@string/labrador" />
                <item
                    android:id="@+id/golden_menu_item"
                    android:title="@string/golden" />
            </menu>
        </item>
        <item
            android:id="@+id/cats_menu_item"
            android:title="@string/show_me_cats">
            <menu>
                <item
                    android:id="@+id/cheshire_menu_item"
                    android:title="@string/cheshire" />
                <item
                    android:id="@+id/calico_menu_item"
                    android:title="@string/calico" />
            </menu>
        </item>
    </menu>
    
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- Use the constants defined in the ContextualMenus.Command enum-->
        <item
            android:id="@+id/play_menu_item"
            android:title="PLAY_MUSIC" />
        <item
            android:id="@+id/pause_menu_item"
            android:title="PAUSE_MUSIC" />
    </menu>
    
  4. (אופציונלי) שינוי מברירת המחדל onPreparePanel() בדיקה אם WindowUtils.FEATURE_VOICE_COMMANDS מופעל. אם מופעל, כאן אפשר להשתמש בלוגיקה אחרת כדי להגדיר את מערכת התפריטים, כגון הוספה והסרה של אפשרויות מסוימות בתפריט על סמך קריטריונים מסוימים. אפשר גם להפעיל או להשבית תפריטים קוליים לפי הקשר (חזרה true) ולכבות (צריך להחזיר false) בהתאם לקריטריונים מסוימים. לדוגמה:

        private boolean mVoiceMenuEnabled;
        ...
        @Override
        public boolean onPreparePanel(int featureId, View view, Menu menu) {
            if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) {
            // toggle this boolean on and off based on some criteria
                return mVoiceMenuEnabled;
            }
            // Good practice to call through to super for other cases
            return super.onPreparePanel(featureId, view, menu);
        }
    

תמיכה בו-זמנית בתפריטי קול ומגע

פקודות קוליות לפי הקשר משתמשות בממשקי ה-API הקיימים לתפריטים ב-Android, כך תוכלו להשתמש הרבה בקוד ובמשאבים שכבר יש לכם בתפריטי מגע לתמוך בו-זמנית בשני סוגי התפריטים.

כל מה שצריך לעשות הוא לחפש את התכונה Window.FEATURE_OPTIONS_PANEL בנוסף לפיצ'ר WindowUtils.FEATURE_VOICE_COMMANDS שכבר בודקים בכמה שיטות ואז מוסיפים לוגיקה כדי לפתוח את המגע לבצע פעולה מסוימת של המשתמש, כגון הקשה.

לדוגמה, אפשר לשנות את הפעילות הקודמת דוגמה להוספת תמיכה בתפריטי מגע כמו זה (השינויים מגיבים):

// 1. Check for Window.FEATURE_OPTIONS_PANEL
// to inflate the same menu resource for touch menus.
@Override
public boolean onCreatePanelMenu(int featureId, Menu menu) {
    if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
            featureId == Window.FEATURE_OPTIONS_PANEL) {
    ...
}

// 2. Check for Window.FEATURE_OPTIONS_PANEL
// to handle touch menu item selections.
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
            featureId == Window.FEATURE_OPTIONS_PANEL) {
    ...
}

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

שימוש בפקודות קוליות לא רשומות לצורכי פיתוח

כשרוצים להפיץ את כלי ה-Glassware, צריך להשתמש פקודות קוליות VoiceTriggers.Command ופקודות קוליות לפי הקשר שאושרו, ContextualMenus.Command

אם רוצים להשתמש בפקודות קוליות שלא זמינות ב-GDK, אפשר לבקש הרשאה ל-Android בקובץ AndroidManifest.xml:

<uses-permission
     android:name="com.google.android.glass.permission.DEVELOPMENT" />

שימוש בפקודות קוליות לא רשומות

  1. יש להצהיר על ערך מחרוזת ב-res/values/strings.xml שמגדיר שם הטריגר הקולי. אפשרות להצהיר על הנחיה קולית כדי להציג את כלי ה-Glassware לזיהוי הדיבור לפני שמפעילים את ה-Glassware.

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="glass_voice_trigger">read me a story</string>
        <string name="glass_voice_prompt">what story?</string>
    </resources>
    
  2. יצירת משאב XML עבור הטריגר הקולי ב- res/xml/<my_voice_trigger>.xml בפקודות קוליות לא רשומות, צריך להשתמש המאפיין keyword במקום המאפיין command ששימש לאישור פקודות קוליות. המאפיין keyword צריך להיות הפניה למחרוזת המשאב שמגדיר את הפקודה הקולית. בטריגר קולי פשוט שמתחיל פעילות או שירות באופן מיידי, פשוט מציינים את הרכיב trigger:

    <?xml version="1.0" encoding="utf-8"?>
    <trigger keyword="@string/glass_voice_trigger" />
    

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

    <?xml version="1.0" encoding="utf-8"?>
    <trigger keyword="@string/glass_voice_trigger">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    

שימוש בפקודות קוליות לפי הקשר ולא רשומות

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

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Use the constants defined in the ContextualMenus.Command enum-->
    <item
        android:id="@+id/pizza_menu_item"
        android:title="@string/find_pizza" />
</menu>

מתחיל זיהוי דיבור


זיהוי הדיבור ב-Glassware ממתין למשתמשים לדבר ומחזיר את מתומללות אחרי שמסיימים. כדי להתחיל את הפעילות:

  1. התקשרות אל startActivityForResult() עם ההכוונה ACTION_RECOGNIZE_SPEECH. התוספות הבאות של Intent נתמכות כשמתחילים את הפעילות:
  2. לשנות את onActivityResult() להתקשרות חזרה כדי לקבל את הטקסט המתומלל EXTRA_RESULTS כוונה נוספת. הקריאה החוזרת הזו מתבצעת כשהמשתמשים מסיימים לדבר.

    private static final int SPEECH_REQUEST = 0;
    
    private void displaySpeechRecognizer() {
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        startActivityForResult(intent, SPEECH_REQUEST);
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent data) {
        if (requestCode == SPEECH_REQUEST && resultCode == RESULT_OK) {
            List<String> results = data.getStringArrayListExtra(
                    RecognizerIntent.EXTRA_RESULTS);
            String spokenText = results.get(0);
            // Do something with spokenText.
        }
        super.onActivityResult(requestCode, resultCode, data);
    }