讯飞语音唤醒和语义识别同时使用,错误代码20006的解决方法

今天测试了一下语音唤醒和语义识别,在我Android5.1的手机上用着好好的,换了一台Android6.0的设备就不能用了,报了一个20006的错误,这个错误的官方解释是“录音失败没有录音权限添加录音权限,确保录音机可用,没有被其他服务占用”。看了一些log,大概意思是“已经有一个线程在占用了声音通道,导致不能录音了”。但是这种情况为什么在Android5.1能用,在Android6.0就不能用了呢。之后有下了一个带有语音唤醒和语义识别的app,不对啊,这不是可以使用么?!

所以就觉得应该是有解决的方法而不单单是系统和设备版本的问题,所以想了一下,想到的思路就是在唤醒之后调用语义识别的时候,关闭唤醒,这样,就不再产生冲突了,在语义识别的回调中,说完话就重新调用语音唤醒。试了一下是可行的,为了让做这个的同学少走弯路在这分享出来。

我是在唤醒之后调用的语义识别的,所以在启用了语义识别后先写了下面的代码

//判断唤醒是否在监听,监听的话就停止监听
if (mywakeuper.isListening()) {
        mywakeuper.stopListening();
}

if (myUnderstander.isUnderstanding()) {
            myUnderstander.cancel();
            myUnderstander.stopUnderstanding();
            Log.e(TAG, "停止录音");
        }

之后在SpeechUnderstanderListener的回调方法onEndOfSpeech中写

@Override
        public void onEndOfSpeech() {
            // 通知结束说话
            Log.e(TAG, "结束说话");
            //判断语音唤醒是否处于监听状态,不处于则开始监听
            if (!mywakeuper.isListening()) {
                mywakeuper.startListening(mWakeuperListener);
            }

        }

这样写的话就是在不同时段占用录音通道了,也不会造成异常了。

你可能感兴趣的:(Android)