讯飞AIUI语音初体验

集成SDK

      近期使用科大讯飞AIUI开发一款智能语音灯控项目,因此在这记录一下我的心得,写的不好忘各位大佬见谅,不喜勿喷呐,下面就像大家介绍一下我的使用心得,注册讯飞账号,添加项目这些个常规操作就不用多说了吧,直接进入正题:

     AIUI主要的技能分为两种:开放技能和自定义技能,开放技能包含的内容有天气,计算,百科,笑话等通用技能,自定义技能则是开发者自己定义的Intent(意图),等会会详细介绍怎么自定义自己的意图。开放技能只要在添加就可以了,如图所示:   讯飞AIUI语音初体验_第1张图片 

        接下来是自定义技能的使用,进入到我的技能一栏,选择创建技能,以下是我创建好的技能列表

   讯飞AIUI语音初体验_第2张图片

 

      开放技能中没有想要的功能时需要自己实现自定义技能,通过语义理解提取到关键字,在“后处理”服务器去执行一些操作,比如在自定义技能中,设置语料“开灯”,当用户说“请帮我打开灯”之后,AIUI会触发这个自定义技能,其中的query就是“开灯”,后处理服务收到这个语义后,可以做一些操作,返回数据;  

     {

  • "category": "TESTLIGHT.device_lamp:1.0",
  • "intentType": "custom",
  • "rc": 0,
  • "service": "TESTLIGHT.device_lamp",
  • "uuid": "atn0001a722@ch4bad0e38d7b96f1d01",
  • "vendor": "TESTLIGHT",
  • "version": "1.0",
  • -

    "semantic": [
    • -

      {
      • "entrypoint": "ent",
      • "intent": "lamp_control_on_off",
      • "score": 1,
      • -

        "slots": [
        • -

          {
          • "begin": 0,
          • "end": 1,
          • "name": "DeviceOnOff",
          • "normValue": "on",
          • "value": "开"
          }
        ]
      }
    ],
  • "state": null,
  • "sid": "atn0001a722@ch4bad0e38d7b96f1d01",
  • "text": "开灯"

}

   此时就能通过返回的数据中的intent和normvalue来判断是否开灯,其他自己定义的语义同理。此时把后台的东西差不多都配置好了,就可以下载SDK了,AIUI开放平台首页底部找到sdk下载中心,选择自己要下载的sdk。讯飞AIUI语音初体验_第3张图片

 

 下载完毕之后就是导入到项目中,解压下载的包,把对应的lib文件夹中的文件分别导入到自己的项目中,此时可能会出现libaiui.so找不到,别方兄弟,你直接如下操作:讯飞AIUI语音初体验_第4张图片 

把-v7a中的libaiui.so复制一份到armeabi.so中,此时也许还会出现一个问题,编译so库是报错,那你就要来这个操作了,在app的build中添加一下代码:

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

此时不要惊喜,你还需要配置你的APPID,在你的清单文件中和Application配置你的APPID,注意必须要保持一致APPID,不然会报出错误码10407,如需查看错误码,可以到此查看,这里面列举了会出现的一些错误码和详细说明讯飞AIUI语音初体验_第5张图片   

再从新编译一遍,此时就导入SDK成功了,这里只是介绍了怎么使用自定义后台意图和导入SDK,下面就要对其的使用了。

 AIUI的使用  

   由于AIUI文档介绍的少之又少,所以本人踩的坑也比较多,开发AIUI特别要注意细节,很多小的细节要处理好,不然会爆出很多莫名其妙的错误。

    创建代理AiuiAgent,因为在语音识别前,AIUI会检查代理是否创建成功,如果此时出现错误码,这时你要检查你的APPID是否保持了一致,成功之后才会调用识别功能。

   /**
     * 检查代理是否创建成功
     */
    private boolean checkAIUIAgent() {
        if (null == mAIUIAgent) {
            Log.e(TAG, "create aiui agent");
            mAIUIAgent = AIUIAgent.createAgent(this, getAIUIParams(), mAIUIListener);
            AIUIMessage startMsg = new AIUIMessage(AIUIConstant.CMD_START, 0, 0, null, null);
            mAIUIAgent.sendMessage(startMsg);
            updateLexicon();// 更新词典,语音拼音符合提交的文字的拼音,那么直接匹配为词典里的词语
        }


        if (null == mAIUIAgent) {
            Log.e("tag", "HAO的方法:【checkAIUIAgent】: " + "创建 AIUI Agent 失败!");
        }


        return null != mAIUIAgent;

    }

 

识别语音和语义数据则最主要在AIUIListener中操作,不多说,直接上代码:

/**
     * 语音识别和语义数据监听器
     */
    private class AIUIResultListener implements AIUIListener {


        @Override
        public void onEvent(AIUIEvent event) {
            switch (event.eventType) {
                case AIUIConstant.EVENT_WAKEUP:
                    Log.e(TAG, "on event: 进入识别状态" + event.eventType);
                    break;


                case AIUIConstant.EVENT_RESULT: {
                    Log.e(TAG, "on event: " + event.eventType);
               
                        }
                    } catch (Throwable e) {
                        e.printStackTrace();
                        Log.e("tag", "【AIRecognizeServer】类的方法:【onEvent】:Throwable " + e.getLocalizedMessage());
                    }


                }
                break;


                case AIUIConstant.EVENT_ERROR: {
                    Log.i(TAG, "on event: " + event.eventType + "\n" + "错误: " + event.arg1 + "\n" + event.info);
                }
                break;


                case AIUIConstant.EVENT_VAD: {
                    if (AIUIConstant.VAD_BOS == event.arg1) {
                        Log.e("tag", "HAO的方法:【onEvent】: " + "找到vad_bos");
                    } else if (AIUIConstant.VAD_EOS == event.arg1) {
                        Log.e("tag", "HAO的方法的方法:【onEvent】: " + "找到vad_eos");


                    } else {
                        Log.e("tag", "HAO的方法的方法:【onEvent】: " + event.arg2);
                    }
                }
                break;


                case AIUIConstant.EVENT_START_RECORD: {
                    Log.e(TAG, "on event: " + event.eventType + " 开始录音");
                   
                }
                break;


                case AIUIConstant.EVENT_STOP_RECORD: {
                    Log.i(TAG, "on event: " + event.eventType + " 停止录音");
              
                }
                break;


                case AIUIConstant.EVENT_STATE: {    // 状态事件
                    mAIUIState = event.arg1;


                    if (AIUIConstant.STATE_IDLE == mAIUIState) {
                        // 闲置状态,AIUI未开启
                        Log.e("tag", "HAO的方法:【onEvent】: " + "STATE_IDLE");
                        
                    } else if (AIUIConstant.STATE_READY == mAIUIState) {
                        // AIUI已就绪,等待唤醒
                        Log.e("tag", "HAO的方法:【onEvent】: " + "STATE_READY");
                 
                    } else if (AIUIConstant.STATE_WORKING == mAIUIState) {
                        // AIUI工作中,可进行交互
                        Log.e("tag", "HAO的方法:【onEvent】: " + "STATE_WORKING");
                        setStateResult("STATE_WORKING");
                    }
                }
                break;


                case AIUIConstant.EVENT_CMD_RETURN: {
                    if (AIUIConstant.CMD_UPLOAD_LEXICON == event.arg1) {
                        Log.e("tag", "HAO的方法:【onEvent】: " + "上传" + (0 == event.arg2 ? "成功" : "失败"));
                    }
                }
                break;


                default:
                    break;
            }
        }

    }

监听器中对各个状态都做了详细的说名,代码在这,理解应该不难得把。语音监听结束之后就是语音合成,合成语音直接使用:SynthesizerListener synthesizerListener = new SynthesizerTTSListener(); TTS朗读状态监听器,这个时候也可能会出现一个错误,语音播放不出来,这个就是你没有加入权限和你没有导入包所导致的,此监听器中有开始播放,结束播放等几个方法,根据自己的需求在相应的方法中进行操作。

      /**
     * 合成监听器
     */
    private class SynthesizerTTSListener implements SynthesizerListener {


        @Override
        public void onSpeakBegin() {
           //语音开始播放
          
        }


        @Override
        public void onBufferProgress(int i, int i1, int i2, String s) {


        }


        @Override
        public void onSpeakPaused() {


        }


        @Override
        public void onSpeakResumed() {


        }


        @Override
        public void onSpeakProgress(int i, int i1, int i2) {


        }


        @Override
        public void onCompleted(SpeechError speechError) {
             //语音播放结束
          
        }


        @Override
        public void onEvent(int i, int i1, int i2, Bundle bundle) {


        }
    }

 以上就是利用AIUI实现语音播放和语音识别的基本操作思路,如有不详之处,欢迎留言,鄙人一定详细解答,谢谢大家的支持。

你可能感兴趣的:(讯飞AIUI语音初体验)