Android如何添加語(yǔ)音功能

2018-08-02 17:50 更新

編寫: kesenhoo - 原文: http://developer.android.com/training/wearables/apps/voice.html

語(yǔ)音指令是可穿戴體驗(yàn)的一個(gè)重要的部分。這使得用戶可以釋放雙手,快速發(fā)出指令。穿戴提供了2種類型的語(yǔ)音操作:

  • 系統(tǒng)提供的

    這些語(yǔ)音指令都是基于任務(wù)的,并且內(nèi)置在Wear的平臺(tái)內(nèi)。我們?cè)赼ctivity中過(guò)濾我們想要接收的指令。例如包含"Take a note" 或者 "Set an alarm"的指令。

  • 應(yīng)用提供的

    這些語(yǔ)音指令都是基于應(yīng)用的,我們需要像聲明一個(gè)Launcher Icon一樣聲明這些指令。用戶通過(guò)說(shuō)"Start "來(lái)使用那些語(yǔ)音指令,然后會(huì)啟動(dòng)我們指定啟動(dòng)的activity。

聲明系統(tǒng)提供的語(yǔ)音指令

Android Wear平臺(tái)基于用戶的操作提供了一些語(yǔ)音指令,例如"Take a note" 或者 "Set an alarm"。用戶發(fā)出想要做的操作指令,讓系統(tǒng)啟動(dòng)最合適的activity。

當(dāng)用戶說(shuō)出語(yǔ)音指令時(shí),我們的應(yīng)用能夠過(guò)濾出用于啟動(dòng)activity的intent。如果我們想要啟動(dòng)一個(gè)在后臺(tái)執(zhí)行任務(wù)的service,需要顯示一個(gè)activity作為視覺(jué)線索,并且在該activity中啟動(dòng)service。當(dāng)我們想要廢棄這個(gè)視覺(jué)線索時(shí),需要確保執(zhí)行了finish()。

例如,對(duì)于"Take a note"的指令,聲明下面這個(gè)intent filter來(lái)啟動(dòng)一個(gè)名為MyNoteActivity的activity:

<activity android:name="MyNoteActivity">
      <intent-filter>
          <action android:name="android.intent.action.SEND" />
          <category android:name="com.google.android.voicesearch.SELF_NOTE" />
      </intent-filter>
  </activity>

下面列出了Wear平臺(tái)支持的語(yǔ)音指令:

voice_intent_1 voice_intent_2 voice_intent_3

關(guān)于注冊(cè)intent與獲取intent extra的信息,請(qǐng)參考Common intents.

聲明應(yīng)用提供的語(yǔ)音指令

如果系統(tǒng)提供的語(yǔ)音指令無(wú)法滿足我們的需求,我們可以使用"Start MyActivityName"語(yǔ)音指令來(lái)直接啟動(dòng)我們的應(yīng)用。

注冊(cè)一個(gè)"Start"指令的方法和注冊(cè)手持應(yīng)用上的Launcher Icon是一樣的。除了在launcher里面需要一個(gè)應(yīng)用圖標(biāo),而我們的應(yīng)用需要一個(gè)語(yǔ)音指令。

為了指定在"Start"指令之后需要說(shuō)出的文本, 我們需要指定想要啟動(dòng)的activity的label屬性。例如,下面的intent filter能夠識(shí)別"Start MyRunningApp"語(yǔ)音指令并啟動(dòng)StartRunActivity。

<application>
  <activity android:name="StartRunActivity" android:label="MyRunningApp">
      <intent-filter>
          <action android:name="android.intent.action.MAIN" />
          <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
  </activity>
</application>

獲取自由格式的語(yǔ)音輸入

除了使用語(yǔ)音指令來(lái)啟動(dòng)activity之外,我們也可以執(zhí)行系統(tǒng)內(nèi)置的語(yǔ)言識(shí)別activity來(lái)獲取用戶的語(yǔ)音輸入。這對(duì)于獲取用戶的輸入信息非常有幫助,例如執(zhí)行搜索或者發(fā)送一個(gè)消息。

在我們的應(yīng)用中,使用ACTION_RECOGNIZE_SPEECH action并調(diào)用startActivityForResult()。這樣可以啟動(dòng)系統(tǒng)語(yǔ)音識(shí)別應(yīng)用,并且我們可以在onActivityResult()中處理返回的結(jié)果:

private static final int SPEECH_REQUEST_CODE = 0;

// Create an intent that can start the Speech Recognizer activity
private void displaySpeechRecognizer() {
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
// Start the activity, the intent will be populated with the speech text
    startActivityForResult(intent, SPEECH_REQUEST_CODE);
}

// This callback is invoked when the Speech Recognizer returns.
// This is where you process the intent and extract the speech text from the intent.
@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);
}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)