ورودی صوتی به شما امکان می دهد یک رابط واقعاً بدون دست ایجاد کنید. Glass سه راه برای استفاده از ورودی صوتی در اختیار شما قرار می دهد.
دستورات صوتی اصلی Glassware را از کارت Home شروع میکنند، فرمانهای صوتی متنی میتوانند اقداماتی را در یک فعالیت انجام دهند، و فعالیت تشخیص گفتار سیستم به شما امکان میدهد ورودی صوتی به شکل آزاد را از کاربران دریافت کنید.
دستورات صوتی اصلی
این دستورات صوتی Glassware را از کارت Home (کارت ساعت) راه اندازی می کنند. هنگامی که یک فرمان صوتی اصلی را اعلام می کنید، اگر کاربران تصمیم بگیرند که Glassware شما را با ضربه زدن روی کارت Home شروع کنند، Glass به طور خودکار یک آیتم منوی لمسی را به عنوان یک بازگشت ایجاد می کند.
برای افزودن یک فرمان صوتی به منوی اصلی صدای شیشه ok :
یک منبع 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>
با استفاده از عملکرد
com.google.android.glass.action.VOICE_TRIGGER
در مانیفست Android خود، یک فیلتر قصد ثبت کنید. فیلتر قصد فعالیت یا خدمات شما را در صورت تشخیص کاربرانی که فرمان صوتی شما را بیان می کنند، شروع می کند.<?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 شما در منوی لمسی شیشهای ok نمایش دهد.<activity |service android:icon="@drawable/my_icon" ...> ... </activity | service>
اگر فرمان صوتی شما از یک فرمان صوتی استفاده می کند و فعالیتی را شروع می کند، هر متن رونویسی شده ای را با کد زیر دریافت کنید (مانند
onResume()
):ArrayList<String> voiceResults = getIntent().getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
اگر فرمان صوتی یک سرویس را راه اندازی کند، هدف اضافی در پاسخ به تماس
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های منوی استاندارد اندروید می سازید، اما کاربران می توانند به جای لمس، آیتم های منو را با دستورات صوتی فراخوانی کنند.
برای فعال کردن دستورات صوتی متنی برای یک فعالیت خاص:
در فعالیت مورد نظر
getWindow().requestFeature(
WindowUtils.FEATURE_VOICE_COMMANDS
)
را فراخوانی کنید تا دستورات صوتی متنی را فعال کنید. با فعال بودن این ویژگی، هر زمان که این فعالیت فوکوس دریافت کرد، منوی "ok glass" در قسمت پاورقی صفحه ظاهر می شود.onCreatePanelMenu()
را لغو کنید و موردی را کهWindowUtils.FEATURE_VOICE_COMMANDS
فعال است رسیدگی کنید. اگر فعال باشد، اینجا جایی است که تنظیمات منوی یکباره را انجام میدهید، مانند افزایش یک منبع منو یا فراخوانی متدهایMenu.add()
برای ایجاد سیستم منوی صوتی خود.برای کنترل دستورات صوتی زمانی که کاربران آنها را بیان میکنند، روی
onMenuItemSelected()
را لغو کنید. هنگامی که کاربران انتخاب یک آیتم منو را به پایان میرسانند، فرمان صوتی «ok, glass» بهطور خودکار در قسمت پاورقی صفحه ظاهر میشود و آماده پذیرش فرمان صوتی جدید است، تا زمانی که فعالیت در تمرکز باقی بماند.کد زیر دستورات صوتی متنی را فعال میکند، در صورت لزوم یک منبع منو را افزایش میدهد، و دستورات صوتی را زمانی که گفته میشوند کنترل میکند:
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); } }
در اینجا یک نمونه از منبع منو استفاده شده توسط فعالیت قبلی است. توجه کنید که چگونه می توانید آیتم های منوی تودرتو برای یک سیستم منوی صوتی سلسله مراتبی ایجاد کنید. در مثال زیر، اولین آیتم منو را می توان به صورت زیر مشاهده کرد: ok glass، Show me dogs، Labrador .
<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های منوی اندروید موجود استفاده میکنند، میتوانید از بسیاری از کدها و منابعی که قبلاً در اختیار دارید برای منوهای لمسی دوباره استفاده کنید و به طور همزمان از هر دو نوع منو پشتیبانی کنید.
تنها کاری که باید انجام دهید این است که ویژگی 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 glass .
استفاده از دستورات صوتی فهرست نشده برای توسعه
وقتی میخواهید 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
فراخوانی کنید. هنگام شروع فعالیت، موارد اضافی هدف زیر پشتیبانی می شوند: برای دریافت متن رونویسی شده از قصد اضافی
EXTRA_RESULTS
فراخوانیonActivityResult()
لغو کنید. این تماس پس از اتمام صحبت کاربران فراخوانی می شود.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); }