【问题标题】:Android Speech Recognizer on different Devices不同设备上的 Android 语音识别器
【发布时间】:2024-01-13 00:37:02
【问题描述】:

在测试了多种不同的语音转文本方法后,我最终得出结论,问题出在我的特定设备上,代码在一台 Android 5 设备上运行良好,而我在另一台运行 Android 6 的设备上一直收到错误

第二个设备是使用自定义 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;
}
}

【问题讨论】:

    标签: android speech-recognition audio-recording speech-to-text


    【解决方案1】:

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

    ...
    我应该使用什么方法或调试策略来找到这个问题的根源。

    LogCat 输出中是否没有错误消息?

    【讨论】:

    • 我确实安装了谷歌服务并使用 adb 从 adb 启用它:(adb shell==>su==>pm enable com.google.android.googlequicksearchbox Got Package com.google.android.googlequicksearchbox new state :启用)仍然是同样的问题,我得到错误代码 3(记录错误)我相信麦克风被另一个我无法识别的包占用
    最近更新 更多