Android 连续语音识别返回 ERROR_NO_MATCH 太快

2023-11-26

我尝试实现连续语音识别机制。 当我开始语音识别时,我在 logcat 中收到以下消息:

06-05 12:22:32.892 11753-11753/com.aaa.bbb D/SpeechManager: startSpeechRecognition: 
06-05 12:22:33.022 11753-11753/com.aaa.bbb D/SpeechManager: onError: Error 7
06-05 12:22:33.352 11753-11753/com.aaa.bbb D/SpeechManager: onReadyForSpeech: 
06-05 12:22:33.792 11753-11753/com.aaa.bbb D/SpeechManager: onBeginningOfSpeech: Beginning
06-05 12:22:34.492 11753-11753/com.aaa.bbb D/SpeechManager: onEndOfSpeech: Ending
06-05 12:22:34.612 11753-11753/com.aaa.bbb D/SpeechManager: onError: Error 7

这个错误7意味着ERROR_NO_MATCH。如您所见,它几乎立即被调用。这不是不当行为吗?

以下是 startSpeechRecognition 和第一个错误 7 之间的完整日志:

06-05 12:22:32.892 11753-11753/com.aaa.bbb D/SpeechManager: startSpeechRecognition: 
06-05 12:22:32.932 4600-4600/? I/GRecognitionServiceImpl: #startListening [en-US]

                                                      --------- beginning of system
06-05 12:22:32.932 3510-7335/? V/AlarmManager:  remove PendingIntent] PendingIntent{6307291: PendingIntentRecord{2af25f6 com.google.android.googlequicksearchbox startService}}
06-05 12:22:32.932 4600-4600/? W/LocationOracle: Best location was null
06-05 12:22:32.932 3510-4511/? D/AudioService: getStreamVolume 3 index 90
06-05 12:22:32.942 3510-7335/? D/SensorService: SensorEventConnection::SocketBufferSize, SystemSocketBufferSize - 102400, 2097152
06-05 12:22:32.942 3510-7360/? D/Sensors: requested delay = 66667000, modified delay = 0
06-05 12:22:32.942 3510-7360/? I/Sensors: Proximity old sensor_state 16384, new sensor_state : 16512 en : 1
06-05 12:22:32.952 4600-4600/? D/SensorManager: registerListener :: 5, TMD4903 Proximity Sensor, 66667, 0,  
06-05 12:22:32.952 4600-11932/? D/SensorManager: Proximity, val = 8.0  [far]
06-05 12:22:32.952 3510-5478/? I/Sensors: Acc old sensor_state 16512, new sensor_state : 16513 en : 1
06-05 12:22:32.952 3510-4705/? I/Sensors: Mag old sensor_state 16513, new sensor_state : 16529 en : 1
06-05 12:22:32.952 3510-4037/? I/AppOps: sendInfoToFLP, code=41 , uid=10068 , packageName=com.google.android.googlequicksearchbox , type=startOp
06-05 12:22:32.962 3510-4511/? D/SensorService: GravitySensor2 setDelay  ns = 66667000  mindelay = 66667000
06-05 12:22:32.962 3510-4511/? I/Sensors: RotationVectorSensor old sensor_state 16529, new sensor_state : 147601 en : 1
06-05 12:22:32.972 3510-3617/? V/BroadcastQueue: [background] Process cur broadcast BroadcastRecord{f9fab82 u0 com.google.android.apps.gsa.search.core.location.GMS_CORE_LOCATION qIdx=4}, state= (APP_RECEIVE) DELIVERED for app ProcessRecord{cb66323 4600:com.google.android.googlequicksearchbox:search/u0a68}
06-05 12:22:32.972 3510-4040/? D/NetworkPolicy: isUidForegroundLocked: 10068, mScreenOn: true, uidstate: 2, mProxSensorScreenOff: false
06-05 12:22:32.982 3510-7360/? D/AudioService: getStreamVolume 3 index 90
06-05 12:22:32.982 3510-3971/? I/Sensors: ProximitySensor - 8(cm)
06-05 12:22:32.992 4600-11315/? I/MicrophoneInputStream: mic_starting com.google.android.apps.gsa.speech.audio.ah@ef02224
06-05 12:22:32.992 3140-3989/? I/APM::AudioPolicyManager: getInputForAttr() source 6, samplingRate 16000, format 1, channelMask 10,session 84, flags 0
06-05 12:22:32.992 3140-3989/? V/audio_hw_primary: adev_open_input_stream: request sample_rate:16000
06-05 12:22:32.992 3140-3989/? V/audio_hw_primary: in->requested_rate:16000, pcm_config_in.rate:48000 in->config.channels=2
06-05 12:22:32.992 3140-3989/? D/audio_hw_primary: adev_open_input_stream: call echoReference_init(12)
06-05 12:22:32.992 3140-3989/? V/echo_reference_processing: echoReference_init +
06-05 12:22:32.992 3140-3989/? I/audio_hw_primary: adev_open_input_stream: input is null, set new input stream
06-05 12:22:32.992 4600-11932/? D/SensorManager: Proximity, val = 8.0  [far]
06-05 12:22:32.992 3510-3555/? I/MediaFocusControl:  AudioFocus  requestAudioFocus() from android.media.AudioManager$8c7dfbdcom.google.android.apps.gsa.speech.audio.c.a$1$c7409b2 req=4flags=0x0
06-05 12:22:32.992 3140-11937/? I/AudioFlinger: AudioFlinger's thread 0xecac0000 ready to run
06-05 12:22:33.012 4600-11317/? W/CronetAsyncHttpEngine: Upload request without a content type.
06-05 12:22:33.012 4600-12335/? I/FavoriteContactNamesSup: get()
06-05 12:22:33.012 4600-12335/? I/FavoriteContactNamesSup: get() : Execute directly (BG thread)
06-05 12:22:33.012 4600-12335/? I/FavoriteContactNamesSup: get()
06-05 12:22:33.012 4600-12335/? I/FavoriteContactNamesSup: get() : Execute directly (BG thread)
06-05 12:22:33.012 4600-12335/? I/FavoriteContactNamesSup: get()
06-05 12:22:33.012 3510-4533/? D/BatteryService: !@BatteryListener : batteryPropertiesChanged!
06-05 12:22:33.012 4600-12335/? I/FavoriteContactNamesSup: get() : Execute directly (BG thread)
06-05 12:22:33.012 3510-4533/? D/BatteryService: level:80, scale:100, status:2, health:2, present:true, voltage: 4093, temperature: 337, technology: Li-ion, AC powered:false, USB powered:true, POGO powered:false, Wireless powered:false, icon:17303446, invalid charger:0, maxChargingCurrent:0
06-05 12:22:33.012 3510-4533/? D/BatteryService: online:4, current avg:48, charge type:1, power sharing:false, high voltage charger:false, capacity:280000, batterySWSelfDischarging:false, current_now:240
06-05 12:22:33.012 3510-3510/? D/BatteryService: Sending ACTION_BATTERY_CHANGED.
06-05 12:22:33.022 11753-11753/com.aaa.bbb D/SpeechManager: onError: Error 7

这是我的代码:

public class SpeechManager {

private static final String TAG = "SpeechManager";
private final MainActivity mActivity;
private final SpeechRecognizer mSpeechRecognizer;
private boolean mTurnedOn = false;
private final Intent mRecognitionIntent;
private final Handler mHandler;

public SpeechManager(@NonNull MainActivity activity) {
    mActivity = activity;
    mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(mActivity.getApplicationContext());
    mSpeechRecognizer.setRecognitionListener(new MySpeechRecognizer());

    mHandler = new Handler(Looper.getMainLooper());

    mRecognitionIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
//  mRecognitionIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    mRecognitionIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, false);
    mRecognitionIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "en-US");
}

public void startSpeechRecognition() {
    Log.d(TAG, "startSpeechRecognition: ");
    mTurnedOn = true;
    mSpeechRecognizer.startListening(mRecognitionIntent);
}

public void stopSpeechRecognition() {
    Log.d(TAG, "stopSpeechRecognition: ");
    if (mTurnedOn) {
        mTurnedOn = false;
        mSpeechRecognizer.stopListening();
    }
}

public void destroy() {
    Log.d(TAG, "destroy: ");
    mSpeechRecognizer.destroy();
}

private class MySpeechRecognizer implements RecognitionListener {
    @Override
    public void onReadyForSpeech(Bundle params) {
        Log.d(TAG, "onReadyForSpeech: ");
    }

    @Override
    public void onBeginningOfSpeech() {
        Log.d(TAG, "onBeginningOfSpeech: Beginning");
    }

    @Override
    public void onRmsChanged(float rmsdB) {
    }

    @Override
    public void onBufferReceived(byte[] buffer) {
        Log.d(TAG, "onBufferReceived: ");
    }

    @Override
    public void onEndOfSpeech() {
        Log.d(TAG, "onEndOfSpeech: Ending");
    }

    @Override
    public void onError(int error) {
        Log.d(TAG, "onError: Error " + error);
        if (error == SpeechRecognizer.ERROR_NETWORK || error == SpeechRecognizer.ERROR_CLIENT) {
            mTurnedOn = false;
            return;
        }

        if (mTurnedOn)
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
//                  mSpeechRecognizer.cancel();
                    startSpeechRecognition();
                }
            }, 100);
    }

    @Override
    public void onResults(Bundle results) {
        Log.d(TAG, "onResults: ");
        ArrayList<String> partialResults = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
        if (partialResults != null && partialResults.size() > 0) {
            for (String str : partialResults) {
                Log.d(TAG, "onResults: " + str);
                if (str.equalsIgnoreCase(mActivity.getString(R.string.turn_off_recognition))) {
                    FlashManager.getInstance().turnOff();
                    mTurnedOn = false;
                    return;
                }
            }
        }
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                startSpeechRecognition();
            }
        }, 100);
    }

    @Override
    public void onPartialResults(Bundle partialResults) {
        Log.d(TAG, "onPartialResults: ");
    }

    @Override
    public void onEvent(int eventType, Bundle params) {
        Log.d(TAG, "onEvent: " + eventType);
    }
}
}

我的设备是三星Note5。我该如何解决这个问题?


这是一个已知的错误,我已对此提交了报告。您可以重现该问题使用这个简单的要点.

解决这个问题的唯一方法是重新创建SpeechRecognizer每次都反对。see edit。正如要点中提到的,这会导致其他问题,但不会给您的应用程序带来问题。

Google 最终会找到一种方法来阻止持续监听,因为这不是 API 的设计目的。你最好看看袖珍狮身人面像作为长期选择。

编辑2016年6月22日- 随着最新的 Google 版本的发布,这种行为变得更糟了。一个新的解决方案是从要点中链接出来的,该解决方案是RecognitionListener仅对“真实”回调做出反应。

编辑 2016 年 7 月 1 日" - See 这个问题另一个新错误

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 连续语音识别返回 ERROR_NO_MATCH 太快 的相关文章

随机推荐

  • 如何将图像和录制文件保存在临时目录中?

    我想将从我的应用程序中拍摄的相机照片和视频录制存储在临时目录中的单独文件夹中一段时间 当任务完成时 他们将保存到数据库中 如何将从相机和视频录制文件中拍摄的图片保存在临时目录中的单独文件夹中 您正在寻找这个来访问缓存文件夹来存储临时文件 N
  • R:ggfortify:“自动绘图不支持 prcomp 类型的对象”

    我正在尝试使用 ggfortify 来可视化我使用 prcomp 所做的 PCA 结果 示例代码 iris pca lt iris c 1 2 3 4 autoplot prcomp iris pca 错误 自动绘图不支持 prcomp 类
  • JPA Hibernate n+1 问题(Lazy 和 Eager Diff)

    我试图理解 n 1 问题 从而找到正确的解决方案 我有两个实体 公司 Entity Table name company public class Company implements Serializable private static
  • 以最小总距离连接所有点的算法

    我有一组点和适用于每对点的距离函数 我想将所有点连接在一起 总距离最小 你知道我可以使用的现有算法吗 每个点都可以链接到几个点 所以这不是通常的 推销员行程 问题 Thanks 你想要的是一个最小生成树 生成一个最常见的两种算法是 Prim
  • List 是否有协变可变版本?

    我已经将我真正想要注释的代码简化为这个最小版本 def print it numbers or nones for i number in enumerate numbers or nones if number is None numbe
  • 通过浏览器上传大文件(100 GB)

    有没有办法上传大文件 超过 80 GB 通过网络浏览器 以前我一直使用 plupload 上传文件 img png jpg 但它似乎不适用于较大的文件 我还想知道如何实现一个用户可以上传的网页 例如 Mega co nz 或 Drive g
  • context:annotation-config 是 @AutoWired 的替代品吗?

    我可以这样说吗 context annotation config在我的 XML 配置中 它会自动注入 bean 类而不需要任何注释 因此 不要使用这些注释类型 public class Mailman private String nam
  • Flask-Restless 转储 Flask-Sqlalchemy 中的十进制值

    我有这个使用 Flask SQLAlchemy 的模型 class Menu Document db Model id db Column db Integer primary key True autoincrement True nam
  • 如何通过home-brew m1 mac安装anaconda

    我刚买了一台 m1 Mac 并使用 home brew 安装了 anaconda brew install anaconda 看起来它工作得很好 除了当我真正去使用 anaconda 并输入 conda 时 我得到了可怕的 conda 命令
  • 在 Python 中求解具有时滞的 ODE

    任何人都可以给我一些建议 如何解决Python中实现了时间延迟的ODE 我似乎无法弄清楚如何使用 scipy integrate odeint 来做到这一点 我正在寻找的内容应该如下所示 the constants in the equat
  • 如何在控件中嵌入 firemonkey 表单?

    我尝试在滚动框中嵌入表单 procedure TfrmMain FormCreate Sender TObject var Control TControlView begin Control TControlView Create Sel
  • 用 Emacs 替换正则表达式

    我正在尝试做一个搜索并用正则表达式替换 假设我有一个foreach foo1 txt foo2 txt foo3 txt foo4 txt 我想在列表中的每个项目周围加上 我认为 从文档 这个正则表达式可以工作 foo 1 4 txt gt
  • glmnet 如何计算最大 lambda 值?

    The glmnet包使用了一系列LASSO调整参数lambda从最大缩放lambda max在此情况下不选择预测变量 我想知道如何glmnet计算这个lambda max价值 例如 在一个简单的数据集中 set seed 1 librar
  • 如何使用正则表达式前瞻来限制输入字符串的总长度

    我有这个正则表达式 想要添加限制总长度不超过 15 个字符的规则 我看到了一些前瞻示例 但它们不太清楚 你能帮我修改这个表达式以支持新规则吗 A Z A Z 既然您在标题中提到了这一点 那么对您的案例的负面展望将是 16 regex goe
  • Ruby 中重做和重试语句的用途是什么?

    我能想到的唯一用例redo适用于写入套接字或从数据库读取等操作 但如果这些操作失败一次 后续尝试很可能也会失败 所以对我来说这仍然有点毫无意义 至于retry我真的想不出它会有什么用处 这对我来说似乎毫无意义 因为我不知道也不使用 Ruby
  • CanExecuteCommand 对性能有影响吗?

    使用 ICommand 对象的 CanExecuteCommand 对性能有何影响 该方法是否一遍又一遍地执行 我需要迭代大约 200 个对象的集合 根据这些对象决定是否应启用绑定到命令的按钮 CanExecuteCommand 是否会重复
  • 使用 JNA 的 C 回调使 JRE 崩溃

    我在 JNA 中处理回调时遇到问题 我正在尝试使用 C API 它使用回调来处理多个会话事件 登录 注销 连接问题 会话对象 称为sp session 是一个不透明的结构 所有回调都注册在sp session callbacks结构 根据
  • jQuery 分页 + Twitter Bootstrap

    我正在尝试修改 Jquery 分页 基于这个 Jquery 分页教程 demo 与很棒的 twitter bootstrap 一起工作 Twitter Bootstrap 的标准分页设置如下所示 因此这就是分页输出结构的目标 div cla
  • Android Studio 中的 NDK 集成错误

    我正在使用 Android studio 版本 1 3 1 并尝试通过转到 local proprties 并编写 ndk dir 来集成 NDK 但出现此错误 错误 任务 tesstwo compileReleaseNdk 执行失败 错误
  • Android 连续语音识别返回 ERROR_NO_MATCH 太快

    我尝试实现连续语音识别机制 当我开始语音识别时 我在 logcat 中收到以下消息 06 05 12 22 32 892 11753 11753 com aaa bbb D SpeechManager startSpeechRecognit