谈谈 科大讯飞持续的语音监听

最近要做与机器的对话app,包括命中词,唤醒啥的,持续监听语音输入,做语义解析,播报解析结果,但科大讯飞只提供单次的点击式语音监听解析,所以需要手动实现,解放双手,话不多说,开干!!!

1、首先在科大官网去申请秘钥,然后在控制台找到创建的应用,点击下载demo 集成


WX20201125-173127@2x.png

2、集成完毕看两个回调函数:

 private RecognizerListener mRecognizerListener = new RecognizerListener() {
    @Override
    public void onBeginOfSpeech() {
    }

    @Override
    public void onError(SpeechError error) {
        Log.d(TAG, "======onError=======" + error.getErrorCode());
        // Tips:
        // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
        //            if (mTranslateEnable && error.getErrorCode() == 14002) {
        //                showTip(error.getPlainDescription(true) + "\n请确认是否已开通翻译功能");
        //            } else {
        //                if (error.getErrorCode() == 20006) {
        //                    LogUtil.d("xiaopeng", "捕获到开启录音失败的bug");
        //                }
        //                showTip(error.getPlainDescription(true));
        //            }
    }

    @Override
    public void onEndOfSpeech() {
        //  这里是 讯飞 自己停止之后的回调
        //  设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理  我这里设置的3秒
      // mIat.setParameter(SpeechConstant.VAD_BOS, SpUtils.getInstance().getString(SpUtils.iatVadbos, "3000"));
        IatStart(); // 这里实现自己断掉之后再开启监听
    }

    @Override
    public void onResult(RecognizerResult results, boolean isLast) {
        if (results != null) {
            // 这里是你断断续续的语音输入,是不连续的语音输入
          }
        if(isLast){
            // 此处是 手动点击识别语音完毕之后的回调,这里会将你断断续续的说话拼接成一个完成句子;
            //  就是你从 Down 事件,到Up事件 所说的一条句子
        }

    }

    @Override
    public void onVolumeChanged(int volume, byte[] data) {
    }

    @Override
    public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
    }
};

说明:要实现持续监听做到2点:
1、 在讯飞自己检测到停止的回调中再次开启;

   @Override
   public void onEndOfSpeech() {
        // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
              IatStart();
     }

2、在语音解析回来的回调中,先 IatStop() 停止监听,送后端做语义解析,解析完成之后再手动开启 IatStart()

@Override
 public void onResult(RecognizerResult results, boolean isLast) {
        if (results != null) {
            // 这里是你断断续续的语音输入,是不连续的语音输入
          }
        if(isLast){
            // 此处是 手动点击识别语音完毕之后的回调,这里会将你断断续续的说话拼接成一个完成句子;
            //  就是你从 Down 事件,到Up事件 所说的一条句子
        }

 }

这样就能持续的监听了,就不需要手动识别语音了!附上 start 和 stop 的方法!

  /**
 * 开始录音监听
 *
 * @return
 */
public void IatStart() {
    mIatResults.clear();
    int ret = mIat.startListening(mRecognizerListener);
    if (ret != ErrorCode.SUCCESS) {
        showTip("听写错误,错误码:" + ret);
    }
}

  /**
 * 停止录音监听
 */
public void IatStop() {
    mIat.stopListening();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容