語音輸入功能可讓你打造完全不必動手操作的介面。玻璃 提供三種語音輸入功能。
主要語音指令會從 Google Home 資訊卡啟動 Glassware,情境語音 指令可在活動內執行動作以及系統的語音 辨識活動可讓您接收使用者提供的任意形式語音輸入內容。
主要語音指令
這些語音指令可透過 Google Home 資訊卡 (時鐘卡) 啟動 Glassware。當您 宣告主要語音指令,Glass 會自動建立觸控選單項目 如果使用者決定輕觸 首頁資訊卡。
如何將語音指令新增至 ok Glass 語音主選單:
為語音指令建立 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 就會在 ok, Glass 觸控選單。<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>
情境語音指令
情境式語音指令可讓使用者透過活動執行動作。 您可以使用標準 Android 選單 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); }
同時支援語音和觸控選單
內容語音指令會使用現有的 Android 選單 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 中沒有的語音指令,
您可以在 AndroidManifest.xml
檔案中要求 Android 權限:
<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
意圖。 啟動活動時,系統支援下列意圖額外項目: 覆寫
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); }