Android SpeechRecognizer не заметит микрофонный ввод

У меня проблема с моим приложением для Android. Мое устройство Vuzix M300, и я пытаюсь заставить работать голосовое управление. Моя проблема в том, что когда я инициализирую свой SpeechRecognizer и вызываю метод startListining, все запускается, ожидая, что речь не будет распознана. Я попробовал тот же код на телефоне Android, он работал нормально.

Вот мой код:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //grant access to internet
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    //set layout
    setContentView(R.layout.activity_main);

    speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
    speechRecognizerIntent = new Intent(RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE);
    speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getApplication().getPackageName());
    speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "de-DE");
    speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, false);

    speechRecognizer.setRecognitionListener(prepareRegnitionListener());
    speechRecognizer.startListening(speechRecognizerIntent);
    //startListening(0);
}

private RecognitionListener prepareRegnitionListener() {
    // TODO Auto-generated method stub
    return new RecognitionListener() {

        @Override
        public void onRmsChanged(float rmsdB) {
            //Didn´t use
        }

        @Override
        public void onResults(Bundle results) {
            ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            Log.d(MainActivity,"Completed speech recognition: Result: " + matches);
            String match = matches.get(0);
        }

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

        @Override
        public void onPartialResults(Bundle partialResults) {
            // Nothing
            ArrayList<String> matches = partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            Log.d(MainActivity,"Completed speech recognition: Result: " + matches);
        }

        @Override
        public void onEvent(int eventType, Bundle params) {
            // Nothing

        }

        @Override
        public void onError(int error) {
            switch (error){
                case SpeechRecognizer.ERROR_AUDIO:
                    Log.e(MainActivity,"Failed to recognize speech: Audio recording error.");
                    startListening(1000);
                    break;
                case SpeechRecognizer.ERROR_CLIENT:
                    Log.e(MainActivity,"Failed to recognize speech: Insufficient permissions.");
                    startListening(1000);
                    break;
                case SpeechRecognizer.ERROR_NO_MATCH:

                    Log.d(MainActivity,"Failed to recognize speech: No recognition results matched. Retrying...");
                    startListening(1000);
                    break;
                default:
                    Log.e(MainActivity,"Failed to recognize speech. Unknown error" + error);
                    startListening(1000);

            }


        }

        @Override
        public void onEndOfSpeech() {
            Log.d(MainActivity, "EndofSpeech");
        }

        @Override
        public void onBufferReceived(byte[] buffer) {
            //Didn´t use

        }

        @Override
        public void onBeginningOfSpeech() {
            Log.d(MainActivity, "beginnofSpeech");//Do something when speaking starts
        }
    };
}

private void startListening(int delay){
    if(delay > 0){
        Timer t = new Timer();
        t.schedule(new TimerTask(){

                       @Override
                       public void run() {
                           mainHandler.post(new Runnable() {

                               @Override
                               public void run() {
                                   speechRecognizer.startListening(speechRecognizerIntent);
                                   Log.d(MainActivity,"Start delayed listening to speech");
                                   speechRecognizer.stopListening();
                               }
                           });

                       }}
                , delay);
    }else{
        speechRecognizer.startListening(speechRecognizerIntent);
        Log.d(MainActivity,"Start instant listening to speech.");
    }


}

Я использую Vuzix с Android 6 и прошивку Vuzix 1.2 (последняя версия).

Я получаю код ошибки ERROR_SPEECH_TIMEOUT, как если бы я не получил речевой ввод (но я даю).

Я уже пробовал несколько вещей, таких как использование метода startActivityForResult для запуска голосового управления (с такими же результатами...)

1 ответ

Вы должны установить разрешения для своего приложения и для APK-файлов Google вручную, после этого он работал для меня с помощью распознавателя речи Google в моем приложении.

Другие вопросы по тегам