Android语音识别API在Android 7 Nougat中不起作用

Jam*_*mes 12 java android speech-recognition speech-to-text android-7.0-nougat

我正在使用android.speech.SpeechRecognizer API进行语音处理.

我在Android 4-5中工作得很好,

在Android 6中它现在有一堆错误,比如当麦克风打开时发生的响铃被检测为语音,所以它存在(并且当它重新启动时无限循环,因为检测到语音,我们有一个黑客解决方法,为此在播放铃声之前将音量设置为0 ...)

在Android 6中,演讲也会在5秒后死亡,没有任何错误或任何错误.我们有另一个黑客解决方法,它可以检测到没有活动5秒并重新启动它...

现在在Android 7中,语音识别似乎根本不起作用?我还没有能够调试为什么,但有没有人在Android 7中使用语音API的问题?

此外,如果有人知道为什么Android似乎在每个版本的语音API中添加新的错误而不修复它们,请回复.这是Android应该支持的内容,还是他们希望您使用Google意图?

Joe*_*uno 4

我的代码在 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

清单中的权限(可能是多余的):

<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" />
Run Code Online (Sandbox Code Playgroud)