1

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 がすべてのプロセッサ時間を占有しているためだと思います。これを実現できるアーキテクチャを教えてください。ありがとうございました。

4

2 に答える 2

3

Android の Speech Recognition API のメソッドはメイン スレッドからのみ呼び出すことができ、すべてのコールバックはアプリケーションのメイン スレッドで実行されることに注意してください。

その結果、メインスレッドがブロックされると、認識リスナーもブロックされるため、質問に示されている方法で音声認識を実行しようとしても何も起こりません。

受け入れられた回答からヒントを得て、以下に示すように、インターフェイスのonResultsメソッドを使用してリスナーを再起動しました。RecognitionListener

public void onResults(Bundle results) {
    ...
    sr.startListening(intent);
}
于 2015-06-30T05:58:08.400 に答える
3

結果を受け取ったらリスニングを再開します。ループも待機も必要ありません。

私は Android での音声認識の専門家ではありませんが、呼び出しでメイン スレッドをブロックしている可能性があります。

new Task().execute().get();

したがって、音声認識はおそらく開始されません。

于 2015-04-01T13:22:35.327 に答える