android.speech.RecognizerIntentを使ってみる

ってことで、今度は音声入力。

android.speech.RecognizerIntentを使うんですが、使い方はちょっとぐぐればすぐに出てくるのでおいといて。ふつう、音声認識した候補を決めうちで入力することってあまりなくて、候補の一覧を出してユーザに選ばせると思うんですね。というわけで、そこも含めてActivityにしちゃえと云うことで。Javaもandroidも素人なのでお作法がどうかはわかりませんが、とりあえずこんな感じ?

import java.util.ArrayList;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;

public class SpeechInput extends Activity {
  private Intent intent;
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent0 = getIntent();
    if (intent0 == null) {
      finish();
    }
    
    intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtras(intent0.getExtras());
    
    startRecognizeSpeechActivity();
  }
  
  private void startRecognizeSpeechActivity() {
    startActivityForResult(intent, 0);
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent intent0) {
    if (resultCode == RESULT_OK) {
      final ArrayList<String> results = intent0.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

      if (results.size() > 0) {        
        new AlertDialog.Builder(this)
          .setTitle("候補")
          .setItems(results.toArray(new CharSequence[results.size()]), new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which) {
              Intent intent = new Intent();
              intent.putExtra("SPEECH_RESULT", results.get(which));
              setResult(RESULT_OK, intent);
              finish();
            }
          })
          .setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
              finish();
            }
          })
          .setNeutralButton("やり直す", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
              startRecognizeSpeechActivity();
            }
          })
          .show();
      }
    } else {
      finish();
    }
  }
}

リソースは行儀悪くべた書きなので、ちゃんと使いたい方は適当に。使うときは、

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;

public class XXXX extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    :
    try {
      Intent intent = new Intent(XXXX.this, SpeechInput.class);
      intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
      intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "音声認識してみるよっ");
      startActivityForResult(intent, requestCode);
    } catch (ActivityNotFoundException e) {
      Toast.makeText(getApplicationContext(), "音声入力に対応してないよっ", Toast.LENGTH_LONG).show();
    }
    :
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    Toast.makeText(getApplicationContext(), intent.getStringExtra("SPEECH_RESULT")),
      Toast.LENGTH_LONG).show();
  }
}

あとは、Manifestにこんなの入れておいた方がいいかもしれない。

<activity android:name="SpeechInput" android:theme="@android:style/Theme.Translucent.NoTitleBar"></activity>
Posted on

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>