首页 > 解决方案 > 不同设备上的 Android 语音识别器

问题描述

在测试了多种不同的语音转文本方法后,我终于得出结论,问题出在我的特定设备上

第二个设备是使用自定义 sdk 的中文设备我想知道在 Android 中是否需要特定的服务来启用语音识别器,因为我确实安装了谷歌语音应用程序并使用 adb 和相同的方式启用了它问题不断出现

我应该使用一种方法或调试策略来查找此问题的根源。

public class STT extends AppCompatActivity implements RecognitionListener {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

//android view initialization removed

    String[] PERMISSIONS = {Manifest.permission.RECORD_AUDIO};
    if(!Function.hasPermissions(this, PERMISSIONS)){
        ActivityCompat.requestPermissions(this, PERMISSIONS, REQUEST_PERMISSION_KEY);
    }


    progressBar.setVisibility(View.INVISIBLE);
    speech = SpeechRecognizer.createSpeechRecognizer(this);
    speech.setRecognitionListener(this);
    recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE,
            "en");
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
            this.getPackageName());
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);

    /*
    Minimum time to listen in millis. Here 5 seconds
     */
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 5000);
    recognizerIntent.putExtra("android.speech.extra.DICTATION_MODE", true);




    recordbtn.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View p1)
        {
            progressBar.setVisibility(View.VISIBLE);
            speech.startListening(recognizerIntent);
            recordbtn.setEnabled(false);

            /*To stop listening
                progressBar.setVisibility(View.INVISIBLE);
                speech.stopListening();
                recordbtn.setEnabled(true);
             */
        }


    });



}

@Override
public void onResume() {
    super.onResume();
}

@Override
protected void onPause() {
    super.onPause();
    if (speech != null) {
        speech.destroy();
        Log.d("Log", "destroy");
    }

}

@Override
public void onBeginningOfSpeech() {
    Log.d("Log", "onBeginningOfSpeech");
    progressBar.setVisibility(View.VISIBLE);
}

@Override
public void onBufferReceived(byte[] buffer) {
    Log.d("Log", "onBufferReceived: " + buffer);
}

@Override
public void onEndOfSpeech() {
    Log.d("Log", "onEndOfSpeech");
    progressBar.setVisibility(View.INVISIBLE);
    recordbtn.setEnabled(true);
}

@Override
public void onError(int errorCode) {
    String errorMessage = getErrorText(errorCode);
    Log.d("Log", "FAILED " + errorMessage);
    progressBar.setVisibility(View.INVISIBLE);
    returnedText.setText(errorMessage);
    recordbtn.setEnabled(true);
}

@Override
public void onEvent(int arg0, Bundle arg1) {
    Log.d("Log", "onEvent");
}

 @Override
public void onPartialResults(Bundle arg0) {
    Log.d("Log", "onPartialResults");

    ArrayList<String> matches = arg0.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
    String text = "";
    /* To get all close matchs
    for (String result : matches)
    {
        text += result + "\n";
    }
    */
    text = matches.get(0); //  Remove this line while uncommenting above    codes


    returnedText.setText(text);
}

@Override
public void onReadyForSpeech(Bundle arg0) {
    Log.d("Log", "onReadyForSpeech");
}

@Override
public void onResults(Bundle results) {
    Log.d("Log", "onResults");

}

@Override
public void onRmsChanged(float rmsdB) {
    Log.d("Log", "onRmsChanged: " + rmsdB);
    progressBar.setProgress((int) rmsdB);

}


public static String getErrorText(int errorCode) {
    String message;
    switch (errorCode) {
        case SpeechRecognizer.ERROR_AUDIO:
            message = "Audio recording error";
            break;
        case SpeechRecognizer.ERROR_CLIENT:
            message = "Client side error";
            break;
        case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
            message = "Insufficient permissions";
            break;
        case SpeechRecognizer.ERROR_NETWORK:
            message = "Network error";
            break;
        case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
            message = "Network timeout";
            break;
        case SpeechRecognizer.ERROR_NO_MATCH:
            message = "No match";
            break;
        case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
            message = "RecognitionService busy";
            break;
        case SpeechRecognizer.ERROR_SERVER:
            message = "error from server";
            break;
        case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
            message = "No speech input";
            break;
        default:
            message = "Didn't understand, please try again.";
            break;
    }
    return message;
}
}
class Function {

public static  boolean hasPermissions(Context context, String... permissions) {
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
    }
    return true;
}
}

标签: androidspeech-recognitionaudio-recordingspeech-to-text

解决方案


是的,对“Google”应用程序(具有 ID com.google.android.googlequicksearchbox)存在依赖性:
您可以检查设备是否已安装,如果没有,请从 Google 的 Play 商店安装。

...
有没有办法或调试策略我应该用来找到这个问题的根源。

LogCat输出中没有错误信息吗?


推荐阅读