Android Speech Recognition API не работает в Android 7 Nougat

Я использую API android.speech.SpeechRecognizer для речи.

У меня отлично работает в Android 4-5,

В Android 6 теперь есть куча ошибок, например, звуковой сигнал, возникающий при включении микрофона, определяется как речь, поэтому он существует (и зацикливается на неопределенный срок при перезапуске, потому что речь была обнаружена, у нас есть обходной путь для этого, который устанавливает громкость на 0 перед воспроизведением звукового сигнала...)

В Android 6 речь также умирает без ошибок или чего-либо еще через 5 секунд. У нас есть еще один обходной путь для этого, который обнаруживает отсутствие активности в течение 5 секунд и перезапускает его...

Теперь в Android 7 распознавание речи вообще не работает? Мне пока не удалось отладить, почему, но у кого-нибудь были проблемы с работой API речи в Android 7?

Кроме того, если кто-нибудь знает, почему Android, кажется, добавляет новые ошибки в API речи в каждом выпуске, а не исправляет их, пожалуйста, ответьте. Это то, что должно поддерживаться в Android, или вместо этого они хотят, чтобы вы использовали намерение Google?


person James    schedule 27.02.2017    source источник
comment
какое устройство вы используете? многие устройства nugat не поддерживают некоторые 64-битные приложения, даже если они говорят, что поддерживают. попробуй собрать на 32бит. у меня была аналогичная проблема, и я решил ее таким образом.   -  person Andreas Constantinou    schedule 27.02.2017
comment
API не менялся около двух лет (см. android.googlesource.com/platform/frameworks/base/+log/refs/). Вы описываете проблему в реализации этого API, но не указываете, какая это реализация (название, номер версии и т. д.). Сам Android не содержит реализации распознавателя речи, хотя на многих телефонах предустановлена ​​реализация Google. .   -  person Kaarel    schedule 01.03.2017
comment
Samsung G7 с Android 7, речь не работает   -  person James    schedule 01.03.2017
comment
Другие ошибки возникают на Samsung G6 с Android 6 и других моделях телефонов, которые мы тестировали, обычно старые телефоны работают лучше, новые — не очень.   -  person James    schedule 01.03.2017
comment
Вы уверены, что у вас установлен провайдер? SpeechRecognizer.isRecognitionAvailable(mContext). Вы убедились, что провайдер не настроен на Vlingo на устройствах Samsung? Он скажет вам в коде, что работает, но это не так. Реализация Google становится все хуже с каждым выпуском. Я бы посоветовал переключиться на их Cloud Speech API, если вы хотите со всем справиться самостоятельно.   -  person brandall    schedule 01.03.2017
comment
Что значит провайдер установлен? Samsung G7 должен поддерживать речь из коробки, как G6 G5... не так ли?   -  person James    schedule 03.03.2017
comment
Нет, если по умолчанию используется Vlingo в настройках голосового поиска.   -  person brandall    schedule 04.03.2017
comment
Отсутствуют надлежащие запросы на разрешение?   -  person Avi Parshan    schedule 13.03.2017
comment
Похоже, проблема связана с используемыми свойствами RecognizerIntent.   -  person James    schedule 05.06.2017


Ответы (1)


Мой код отлично работает на Nexus5x(Nougat) и Nexus9(Nougat)

попробуй показать logcat.

SpeechRecognizer mGoogleSr;

void initGoogleSr(Context context) {
    mGoogleSr = SpeechRecognizer.createSpeechRecognizer(context);
    mGoogleSr.setRecognitionListener(new GoogleSrListener());
}

void startGoogleSr() {
    if (mGoogleSr != null) {
        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, getPackageName());
        intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
        mGoogleSr.startListening(intent);
    }
}
void cancelRecognizing() {
    if (mGoogleSr != null) {
        mGoogleSr.cancel();
    }
}

public class GoogleSrListener implements RecognitionListener {
    String lastPartialText;

    @Override
    public void onReadyForSpeech(Bundle params) {
        Log.v(TAG, ">>> onReadyForSpeech");
        showMessage("ready");
    }

    @Override
    public void onBeginningOfSpeech() {
        Log.v(TAG, ">>> onBeginningOfSpeech");
        showMessage("recognizing");
    }

    @Override
    public void onRmsChanged(float rmsdB) {
    }

    @Override
    public void onBufferReceived(byte[] buffer) {

    }

    @Override
    public void onEndOfSpeech() {
        Log.v(TAG, ">>> onEndOfSpeech");
        showMessage("waiting result");
    }

    @Override
    public void onError(int error) {
        Log.v(TAG, ">>> onError : " + error);
        switch (error) {
            case SpeechRecognizer.ERROR_AUDIO:
                Log.e(TAG, "ERROR_AUDIO");
                break;
            case SpeechRecognizer.ERROR_CLIENT:
                Log.e(TAG, "ERROR_CLIENT");
                break;
            case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
                Log.e(TAG, "ERROR_INSUFFICIENT_PERMISSIONS");
                break;
            case SpeechRecognizer.ERROR_NETWORK:
                Log.e(TAG, "ERROR_NETWORK");
                break;
            case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
                Log.e(TAG, "ERROR_NETWORK_TIMEOUT");
                break;
            case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
                Log.e(TAG, "ERROR_RECOGNIZER_BUSY");
                break;
            case SpeechRecognizer.ERROR_SERVER:
                Log.e(TAG, "ERROR_SERVER");
                break;
            case SpeechRecognizer.ERROR_NO_MATCH:
                Log.v(TAG, "ERROR_NO_MATCH");
                break;
            case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
                Log.v(TAG, "ERROR_SPEECH_TIMEOUT");
                break;
            default:
                Log.v(TAG, "ERROR_UNKOWN");
        }
    }

    @Override
    public void onPartialResults(Bundle partialResults) {
        Log.v(TAG, ">>> onPartialResults");
        List<String> resultList = partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
        if (resultList != null) {
            String text = resultList.get(0);
            if (text.equals(lastPartialText)) {
                return;
            }
            lastPartialText = text;
            Log.v(TAG, "partial : " + text);
        }
    }

    @Override
    public void onResults(Bundle results) {
        Log.v(TAG, ">>> onResults");
        List<String> resultList = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
        if (resultList != null) {
            String text = resultList.get(0);
            Log.v(TAG, "result : " + text);
            showMessage(text);
        }
    }

    @Override
    public void onEvent(int eventType, Bundle params) {
        Log.v(TAG, ">>> onEvent type = " + eventType);
    }
}

разрешения в манифесте (возможно, избыточные):

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
person Joe Mizuno    schedule 10.03.2017