Android распознаватель речи на разных устройствах - PullRequest
0 голосов
/ 04 октября 2018

После тестирования нескольких различных подходов речи к тексту я наконец пришел к выводу, что проблема связана с моим конкретным устройством, код работает нормально на одном устройстве Android 5, в то время как я продолжаю получать сообщение об ошибке на другом устройстве под управлением Android 6 * 1001.*

Второе устройство - это китайское устройство, использующее пользовательский SDK. Мне интересно, есть ли какая-то специальная служба, которая необходима в Android сама по себе, чтобы включить распознаватель речи, учитывая, что я установил голосовое приложение Google и включил его?использование 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;
}
}

1 Ответ

0 голосов
/ 05 октября 2018

Да, есть зависимость от приложения "Google" (с идентификатором com.google.android.googlequicksearchbox):
вы можете проверить, установлено ли устройство на нем, а если нет, установить его из Google Play Store.

...
есть ли способ или стратегия отладки, если я должен использовать источник этой проблемы.

Нет ли сообщения об ошибке в LogCatвыход

...