开发者社区> 问答> 正文

实时语音识别AndroidSDK,这算不算画蛇添足?

正逍遥0716 2017-05-28 15:08:49 1288

今天在ReactNative里想用语音识别sdk,结果发现得不到onRecognizingResult的回调。调了半天,在sdk源码里看到这么段代码:

            JoyPrint.d("NlsClient", "onRecognizeResult: parsing");
            this.runOnUIThread(new Runnable() {
                public void run() {
                    if(result.getResult() != null) {
                        NlsClient.this.mRecognizeListener.onRecognizingResult(0, result);
                    } else if(NlsClient.this.mRecognizeListener != null) {
                        NlsClient.this.mRecognizeListener.onRecognizingResult(NlsClient.ErrorCode.getErrorCode(flag), result);
                    }

                }
            });

注意那个JoyPrint.d,在Android LogCat里可以看到,这说明什么?只有onRecognizingResult没有回调。而在我看来,原因就出在runOnUIThreadonRecognizingResult,顾名思义,当识别到结果时就应该得到调用,谁规定的识别到结果一定要显示在UI上?如果要刷新UI我自己不会做?runOnUIThread在我看来是绝对的画蛇添足!

再者,ReactNative前端Js与后台Java之间的调用时异步的,文档是这么说的:原生模块不应对自己被调用时所处的线程做任何假设 。这大概就是为什么得不到识别成功的回调只能看到LogCat了,因为识别成功时根本不是在UI线程,于是被塞到队列里了。

移动开发 前端开发 JavaScript Java 语音技术 开发工具 Android开发
分享到
取消 提交回答
全部回答(1)
  • 正逍遥0716
    2019-07-17 21:13:49

    更讽刺的来了:

        public void stop() {
            JoyPrint.e("NlsClient", "stop is called");
            if(this.mIsStarted.get()) {
                if(this.mVoiceActDetector.getRecordTime() < this.mMinimalSpeechLength) {
                    this.mVoiceRecorder.immediateStop();
                    this.mRecognizeListener.onRecognizingResult(4, (NlsResponse)null);
                    this.onRealRecogizeEnd();
                } else {
                    this.mVoiceRecorder.immediateStop();
                    this.onRealRecogizeEnd();
                    L.i("User stop recognize manually!");
                }
            } else if(this.mVoiceRecorder != null) {
                this.mVoiceRecorder.immediateStop();
            }
    
        }

    呵呵哒,这里怎么不runOnUIThread了?我说怎么停止的时候反而收到一个空的识别结果的回调。这里就可以看出SDK设计时onRecognizingResult的语义的混乱

    0 0

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题