【问题标题】:Android Speech Recognition API does not work in Android 7 NougatAndroid 语音识别 API 在 Android 7 Nougat 中不起作用
【发布时间】:2017-07-18 13:28:47
【问题描述】:

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

我在 Android 4-5 中表现出色,

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

在 Android 6 中,语音也会在 5 秒后消失,没有任何错误或任何内容。 我们为此提供了另一种 hack 解决方法,它检测到 5 秒内没有活动并重新启动它...

现在在 Android 7 中,语音识别似乎根本不起作用? 到目前为止,我还无法调试原因,但是否有人在让语音 API 在 Android 7 中工作时遇到问题?

另外,如果有人知道为什么 Android 似乎会在每个版本的语音 API 中添加新的错误而不是修复它们,也请回复。 这是应该在 Android 中支持的东西,还是他们希望您使用 Google Intent 来代替?

【问题讨论】:

  • 你用的是什么设备?许多 nugat 设备不支持某些 64 位应用程序,即使他们说支持。尝试使用 32 位构建它。我有一个类似的问题并通过这种方式解决了。
  • API 已经有大约 2 年没有改变了(参见 android.googlesource.com/platform/frameworks/base/+log/refs/…)。您正在描述此 API 的实现中的问题,但您没有提及它是哪个实现(名称、版本号等)。Android 本身不包含语音识别器实现,尽管许多手机确实预装了 Google 的实现.
  • Samsung G7 with Android 7,语音不工作
  • 其他错误发生在搭载 Android 6 的三星 G6 以及我们测试过的各种其他手机型号上,通常旧手机效果更好,新手机则没那么多
  • 您确定安装了提供程序吗? SpeechRecognizer.isRecognitionAvailable(mContext)。您是否确定三星设备中的提供商未设置为 Vlingo?它会在代码中告诉你它有效,但它没有。 Google 的实施随着每个版本的发布而变得更糟。如果您想自己处理所有事情,我建议您切换到他们的 Cloud Speech API。

标签: java android speech-recognition speech-to-text android-7.0-nougat


【解决方案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" />

【讨论】:

    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多