另一個Android語音識別的例子
這個例子實現的功能和上衣個基本類似,只不過識別引擎換成了Google自家的識別器了。
訊飛的語音云主要還是在普通話方面的識別,識別英語的話就會比較坑(比如你想語音輸入banana基本是不可能),Google可以識別多種語言,英語當然是毫無壓力啦。
效果:
例子中需要注意的一個問題是:startActivity(Intent)和startActivityForResult(Intent,int)的區別使用。
startActivity(Intent) 方法可以用來啟動一個新的 activity ,這個 activity 將被放置在 activity 棧的棧頂。這個方法只有一個參數 Intent ,這個參數描述了將被執行的 activity 。
有時候你希望在一個 activity 結束時得到它返回的結果。舉個例子,你可能啟動一個 activity 來讓用戶從通訊簿中選擇一個人;當它結束的時候將會返回這個所選擇的人。為了得到這個返回的信息,你可以使用 startSubActivity(Intent, int) 這個方法來啟動新的 activity ,第二個整形參數將會作為這次調用的識別標記。這個 activity 返回的結果你可以通過 onActivityResult(int, int, String, Bundle) 方法來獲得,此方法的第一個參數就是之前調用所使用的識別標記。
當 activity 退出的時候,它可以調用 setResult(int) 來將數據返回給他的父進程。這個方法必須提供一個結果碼,這個結果碼可以使標準結果 RESULT_CANCELED, RESULT_OK ,也可以是其他任何從 RESULT_FIRST_USER 開始的自定義值。此外,它還可以返回一段字符串(經常是一段數據的 URL 地址),一個包含它所有希望值的 Bundle 。這些信息都會在父 activity 的回調函數 Activity.onActivityResult() 中出現,并連同最初提供的識別標記一起(此處有些拗口,意思其實就是子activity 返回的內容、返回碼、識別標記都將作為參數,按照不同的返回情況來調用父activity 的Activity.onActivityResult() 方法,以實現出現各種返回時父activity 做出響應的處理)。
代碼清單:package com.example.googlevoice;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
private Button btn ;
private TextView myTextView;
private static final int REQUEST_CODE = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) this.findViewById(R.id.btn);
myTextView = (TextView) this.findViewById(R.id.ResultText);
/**
* 下面是判斷當前手機是否支持語音識別功能
*/
PackageManager pm = getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
if(list.size()!=0)
{
btn.setOnClickListener(this);
}else{
btn.setEnabled(false);
btn.setText("當前語音識別設備不可用...");
}
}
public void onClick(View v) {
if(v.getId()==R.id.btn)
{
/**
* 啟動手機內置的語言識別功能
*/
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,"en-US"); //設置為當前手機的語言類型
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "請說話,我識別");//出現語言識別界面上面需要顯示的提示
startActivityForResult(intent,REQUEST_CODE);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
/**
* 回調獲取從谷歌得到的數據
*/
if(requestCode==REQUEST_CODE&&resultCode==RESULT_OK)
{
List<String> list = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
//只選取第一個結果顯示
myTextView.setText(list.get(0));
}
super.onActivityResult(requestCode, resultCode, data);
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/ResultText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="ResultText" />
<LinearLayout
android:id="@+id/bottom"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal" >
<Button
android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="GoogleVoice" />
</LinearLayout>
</RelativeLayout>