קלט קולי מאפשר לכם ליצור ממשק מלא בהפעלה קולית. זכוכית מספק שלוש דרכים להשתמש בקלט קולי.
הפקודות הקוליות הראשיות מפעילות את Glassware מכרטיס הבית, קול תלוי-הקשר פקודות יכולות לבצע פעולות בתוך פעילות, והדיבור של המערכת פעילות הזיהוי מאפשרת לך לקבל ממשתמשים קלט קולי בפורמט חופשי.
פקודות קוליות ראשיות
הפקודות הקוליות מפעילות את Glassware מכרטיס הבית (כרטיס השעון). אחרי ש הצהרה על פקודה קולית ראשית, Glass יוצר באופן אוטומטי פריט בתפריט המגע כברירת מחדל אם המשתמשים מחליטים להפעיל את ה-Glassware על ידי הקשה על כרטיס דף הבית.
כדי להוסיף פקודה קולית לתפריט הראשי של ok G סמל:
יצירת משאב 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>
לרשום מסנן 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>
צריך להצהיר על מאפיין
android:icon
לפעילות או לשירות שלך. הדבר מאפשר ל-Glass להציג סמל עבור ה-Glassware ב- תפריט מגע אוקיי, זכוכית.<activity |service android:icon="@drawable/my_icon" ...> ... </activity | service>
אם הפקודה הקולית משתמשת בהנחיה קולית ומתחילה פעילות, צריך להשיג כל טקסט מתומלל עם הקוד הבא (למשל
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, המשתמשים יכולים להפעיל את האפשרויות בתפריט באמצעות פקודות קוליות במקום במגע.
כדי להפעיל פקודות קוליות לפי הקשר לפעילות מסוימת:
התקשרות אל
getWindow().requestFeature(
WindowUtils.FEATURE_VOICE_COMMANDS
)
בפעילות הרצויה כדי להפעיל פקודות קוליות לפי הקשר. עם התכונה הזו מופעלת, התפריט "אישור זכוכית" יופיע באזור הכותרת התחתונה של המסך בכל פעם שהפעילות הזו ממוקדת.שינוי מברירת המחדל של
onCreatePanelMenu()
ומטפל במקרה שבוWindowUtils.FEATURE_VOICE_COMMANDS
מופעלת. אם האפשרות מופעלת, כאן מבצעים הגדרה חד-פעמית של התפריט, כמו ניפוח משאב תפריט או קריאה לMenu.add()
שיטות ליצירת תפריט קולי.שינוי מברירת המחדל של
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>
(אופציונלי) שינוי מברירת המחדל
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" />
שימוש בפקודות קוליות לא רשומות
יש להצהיר על ערך מחרוזת ב-
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>
יצירת משאב 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 ממתין למשתמשים לדבר ומחזיר את מתומללות אחרי שמסיימים. כדי להתחיל את הפעילות:
- התקשרות אל
startActivityForResult()
עם ההכוונהACTION_RECOGNIZE_SPEECH
. התוספות הבאות של Intent נתמכות כשמתחילים את הפעילות: לשנות את
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); }