目次へ
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 件のコメント:
コメントを投稿