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);
    }

    ...

}

我陷入了一种情况,我想在循环中运行 android 识别侦听器,其中包括:

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 语音识别方面的专家,但您可能正在通过调用阻塞主线程

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

所以语音识别可能永远不会开始。

于 2015-04-01T13:22:35.327 回答
3

需要注意的是,Android语音识别API的方法只能从主线程调用,所有回调都在应用程序的主线程上执行。

结果,当主线程被阻塞时,识别侦听器也被阻塞,这就是为什么当我尝试按照问题中所示的方式执行语音识别时什么都没有发生。

从接受的答案中得到提示,我使用接口的onResults方法RecognitionListener重新启动侦听器,如下所示:

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