【Android】【Java】音声入力(音声認識)で文字列を取得する 
2017/09/23 Sat [edit]
いずれネイティブプラグイン作ったりするときのための布石。最近はVRでも音声入力できるものあるので Cardboard などでもできたら面白いかもね(Cardboard の場合、ハンディマイクでも付けない限り、構造的な問題が大きいが…)。とりあえずいつものように一番簡単にしたコードを書いておく。簡略のため細かいチェックなどは入れてないが、実際のアプリに使う場合は、色々と手を加えた方が良いだろう。

(※) Android Studio 2.3.3 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認
●簡単な構成
例えばオブジェクト(ウィジェット)の構成が以下のようになっているものとする。配置などは任意で構わないが、とりあえず音声入力を開始するボタンと入力されたテキストを表示できるものがあれば良い。ここではそれぞれ Button と TextView を使っている。
仕様としては、「音声入力」のボタンを押したとき、音声入力のウィジェットが表示され入力開始→入力終了したらテキストビューに認識された文字列が列挙されるといった具合だ。その実装クラスを MainActivity とすると、コードは以下のようになる(テンプレートとしては「Empty Activity」を使っている)。
●音声入力された文字列を表示する
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private TextView textDisplay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textDisplay = (TextView)findViewById(R.id.text_display);
}
public void onClick(View v) {
//音声入力がサポートされているか?
if (getPackageManager().queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0).size() == 0) {
Log.d("tag", "Voice Input is not supported.");
return; //サポートされてないとき無視
}
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
startActivityForResult(intent, 0); //0:requestCode
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 0 && resultCode == RESULT_OK) {
if (data.hasExtra(RecognizerIntent.EXTRA_RESULTS)) {
//ここで認識された文字列を取得
List<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
if (results.size() > 0) {
String str = "";
for (String s : results) {
str += s + "\n";
}
textDisplay.setText(str);
}
}
}
}
}
ここではコードを減らすため、ボタンのクリック動作をレイアウトの「activity_main.xml」で「Button」の属性に「android:onClick="onClick"」を追加しているので注意。自分で実装するなら「View.OnClickListener」を implements し、ボタンに setOnClickListener() を付ける必要がある。
また本来 onClick の引数の View の id を調べて音声入力のボタンかどうかをチェックする必要もあるが、ここでは1つしかボタンがないので省略している。また、システムが音声入力をサポートしているかどうかもここで判別しているが、OnCreate() で判別して使用できなかったら、ボタンを無効にするのも良いだろう。
ボタンを押下したときの動作は、音声入力の Intent を生成し startActivityForResult() でシステムに処理を委ねているだけである。音声が認識されたら、onActivityResult() で受信し、TextView に表示することになる。ここでの注意点は onActivityResult() は他の Intent のやり取りも含まれるので、予め音声入力用の requestCode を合わせておくことと、認識されたデータ(文字列)があるか否かというくらいだ。ここではデータがないときは単に無視している。
この例では認識された文字列を拡張for文(foreach)で結合して TextView に表示しているだけだが、ここで各々の文字列によって処理を分岐すれば、音声認識でアクションを起こせるアプリが作れる。
(実装例)
・ユニティちゃんと音声認識でじゃんけん(Android 版)
(関連記事)
【Unity】Androidで音声認識を使う
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】Androidのテキスト読み上げ(TextToSpeech)を使う
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/271-0b55e8d6
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |