目次へ
Androidでは、日本語の音声認識を、簡単に使うことができます。
Intentを使い音声認識のためのActivityを起動し、認識された文字列を元のActivityで受け取るのですが、自分で書くのは、ほんの少しです。
■■■■音声認識■■■■
下のプログラムでは「開始」と書いたボタンを押すと、 RecognizerIntent.ACTION_RECOGNIZE_SPEECHを指定して、Intentのインスタンスを作成します。このオブジェクトにputExtraメソッドを使って、いくつか情報を追加し、startActivityForResultメソッドを使って音声認識用Acyivityを起動します。
マイクの画面(これが音声認識用Activity)が表示され、話した内容を認識すると、元の画面に戻り、認識した内容をTextViewに表示します。
現在「Hello World」と表示している場所がTextViewです。
音声認識のActivityを表示するための部分が下のプログラムの(1)から(6)です
認識された文字列を使っているのが、(7)から
- まず音声認識用のActivityを指定しIntentのインスタンスを作ります。
- RecognizerIntent.EXTRA_LANGUAGE_MODELでは、
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH
のどちらかを指定しますが、LANGUAGE_MODEL_WEB_SEARCHは、Web検索の際に使います。 - RecognizerIntent.EXTRA_PROMPTで指定するのは、マイクの上に表示される文字列です。
- EXTRA_MAX_RESULTSは、認識した候補のうち、最大いくつ返すかを指定します。
これを1にして、どうぞといった場合「どうぞ」という文字列がひとつ返ってきましたが、
これを指定しなかった場合には「どうぞドウゾzozodmsoどうゾ」という文字列が返ってきました。
- Activityを起動します。
この時リクエストコードとして、適当な数字を渡すと、戻り値を受け取る場合に、このリクエストコードで起動したActivityからの戻り値であるかを確認できます。 - エミュレータで実行した場合には、音声認識機能が無いため、catchが必要です。
- onActivityResultは(5)のstartActivityForResultでスタートしたActivityが終了した時に呼び出されるメソッドです。
- (5)で自分が発行したIntentであるか判断するのが、REQUEST_CODEのチェックです。
- 音声認識された文字列の候補をArrayListとして受け取り、全てを表示しています。
もし、(4)で指定したように、候補を一つだけ受け取るようにしているのなら、for文など使わずに、results.get(0)を表示するだけです。
import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Intent; import android.os.Bundle; import android.speech.RecognizerIntent; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; public class MainActivity extends Activity implements View.OnClickListener { private static final int REQUEST_CODE = 100; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button1 = (Button)findViewById(R.id.button1); button1.setOnClickListener(this); } //button1をタップすると音声認識を行うActivityを起動する public void onClick(View v) { try { //--- (1) Intent intent = new Intent (RecognizerIntent.ACTION_RECOGNIZE_SPEECH); //--- (2) intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); //--- (3) intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "どうぞお話しください"); //--- (4) intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1); //--- (5) startActivityForResult(intent, REQUEST_CODE); //--- (6) } catch(ActivityNotFoundException e) { Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); } } //--- (7) public void onActivityResult(int requestCode,int resultCode,Intent data){ //--- (8) if(requestCode==REQUEST_CODE && resultCode==RESULT_OK) { String str = ""; //--- (9) ArrayList |
■■■■音声認識によるWeb検索■■■■
もしも、音声認識後、その文字列ですぐにWeb検索を行う場合には、上のプログラムの(1)(2)を次のようにし、(7)のメソッドは削除します。これだけで、音声認識後、Web検索へと進みます。
//--- (1) Intent intent = new Intent (RecognizerIntent.ACTION_WEB_SEARCH); //--- (2) intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); |
にほんブログ村
0 件のコメント:
コメントを投稿