Androidの音声認識に認識リスナーを使用しています。私のクラスの基本的な構成は次のとおりです。
class SpeechInput implements RecognitionListener {
Intent intent;
SpeechRecognizer sr;
boolean stop;
public void init() {
sr = SpeechRecognizer.createSpeechRecognizer(context);
sr.setRecognitionListener(this);
intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,context.getPackageName());
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,3);
}
...
}
私はアンドロイド認識リスナーをループで実行したい状況で立ち往生しています。
for(int i=0; i<N; i++) {
// Some processing code
sr.startListening(intent);
}
ここで、再びリッスンを開始する前に、出力を待ちたいと思います。これを実現するために、次のようにロック機構を使用しようとしました。
for(int i=0; i<N; i++) {
// Some processing code
sr.startListening(intent);
stop = false;
new Task().execute().get();
}
ここで、Task は次のように定義された asyncTask です。
private class Task extends AsyncTask<Void,Void,Void> {
@Override
protected Void doInBackground(Void... params) {
try {
int counter = 0;
while(!stop) {
counter++;
}
} catch(Exception e) {
}
return null;
}
}
ブール値「stop」は、RecognitionListener の「onResults」メソッドで次のように更新されます。
public void onResults(Bundle results) {
...
stop = true;
}
問題は、音声認識がまったく機能しないことです。何も起きていない、始まってもいない。これは、asyncTask がすべてのプロセッサ時間を占有しているためだと思います。これを実現できるアーキテクチャを教えてください。ありがとうございました。