SpeechRecognizer提供虚假结果

时间:2013-06-11 14:40:37

标签: android speech-recognition android-4.2-jelly-bean

我正在试图找出脱机语音识别如何在Jelly Bean上运行。经过一些谷歌搜索,我开始使用SpeechRecognizer,但RecognitionListener的onResults方法总是给我相同的结果:“abc”。

我甚至试过这段代码(来自here):

package voice.recognition.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.widget.Button;
import android.widget.TextView;
import java.util.ArrayList;
import android.util.Log;



public class voiceRecognitionTest extends Activity implements OnClickListener 
{

   private TextView mText;
   private SpeechRecognizer sr;
   private static final String TAG = "MyStt3Activity";

   @Override
   public void onCreate(Bundle savedInstanceState) 
   {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button speakButton = (Button) findViewById(R.id.btn_speak);     
        mText = (TextView) findViewById(R.id.textView1);     
        speakButton.setOnClickListener(this);
        sr = SpeechRecognizer.createSpeechRecognizer(this);       
        sr.setRecognitionListener(new listener());        
   }

   class listener implements RecognitionListener          
   {
        public void onReadyForSpeech(Bundle params)
        {
            Log.d(TAG, "onReadyForSpeech");
        }

        public void onBeginningOfSpeech()
        {
            Log.d(TAG, "onBeginningOfSpeech");
        }

        public void onRmsChanged(float rmsdB)
        {
            Log.d(TAG, "onRmsChanged");
        }

        public void onBufferReceived(byte[] buffer)
        {
            Log.d(TAG, "onBufferReceived");
        }

        public void onEndOfSpeech()
        {
            Log.d(TAG, "onEndofSpeech");
        }

        public void onError(int error)
        {
            Log.d(TAG,  "error " +  error);
            mText.setText("error " + error);
        }

        public void onResults(Bundle results)                   
        {
            String str = new String();
            Log.d(TAG, "onResults " + results);
            ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            for (int i = 0; i < data.size(); i++)
            {
                Log.d(TAG, "result " + data.get(i));
                str += data.get(i);
            }
            mText.setText("results: "+String.valueOf(data.size()));        
        }

        public void onPartialResults(Bundle partialResults)
        {
            Log.d(TAG, "onPartialResults");
        }

        public void onEvent(int eventType, Bundle params)
        {
            Log.d(TAG, "onEvent " + eventType);
        }
    }

    public void onClick(View v) {
        if (v.getId() == R.id.btn_speak) 
        {
            Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
            intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,"voice.recognition.test");
            intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,5); 
            sr.startListening(intent);
            Log.i("111111","11111111");
        }
    }
}

但它一直给我相同的结果。

我想补充一点,我在设备上启动了代码(Nexus 4,OS 4.2.2)。

有关如何处理此问题的任何建议?

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为你是以错误的方式从包中提取结果。 捆绑包是最佳结果的列表,您只需要第一个。 尝试使用此代码提取结果。

public void onResults(Bundle results) {
    ArrayList<String> voiceResults = 
                results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
    if (voiceResults != null) {
       String text = voiceResults.get(0);
    }
}