Unity 接讯飞离线语音识别

Unity 接入讯飞离线SDK , 有一些坑记录一下。

在开发者平台注册之后,申请应用,下载SDK包。这个sdk包和你的appid是对应的,不能使用别人的sdk包,然后用自己的appid

这是SDK文件夹,sample是一个示例工程,将libs文件中jar文件放入AndroidStudio中的libs中 

新建jni文件夹,然后放入对应so文件

文件夹中assets文件放入AndroidStudio assets文件,res中的iat文件也放进去

 

 

代码部分简单讲一下:

 SpeechUtility.createUtility(context,SpeechConstant.APPID + "=" + id);
 SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(context, mInitListener);

这是初始化识别,mInitListener是初始化回调,主要方便问题调试。

 public void setParam(){
        // 清空参数
        mIat.setParameter(SpeechConstant.PARAMS, null);
        String lag = "mandarin";
        // 设置引擎
        mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
        // 设置返回结果格式
        mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");

        mIat.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());

        //设置语言,目前离线听写仅支持中文
        if (lag.equals("en_us")) {
            // 设置语言
            mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");
            mIat.setParameter(SpeechConstant.ACCENT, null);

        }else {
            // 设置语言
            mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
            // 设置语言区域
            mIat.setParameter(SpeechConstant.ACCENT,lag);

        }

        // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
        mIat.setParameter(SpeechConstant.VAD_BOS, "4000");

        // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
        mIat.setParameter(SpeechConstant.VAD_EOS, "2000");

        // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
        mIat.setParameter(SpeechConstant.ASR_PTT, "0");

        mIat.setParameter(SpeechConstant.AUDIO_SOURCE, "-1");

        // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
     //   mIat.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");
   //     mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/iat.wav");
    }

 private String getResourcePath(){
        StringBuffer tempBuffer = new StringBuffer();
        //识别通用资源
        tempBuffer.append(ResourceUtil.generateResourcePath(context, ResourceUtil.RESOURCE_TYPE.assets, "iat/common.jet"));
        tempBuffer.append(";");
        tempBuffer.append(ResourceUtil.generateResourcePath(context, ResourceUtil.RESOURCE_TYPE.assets, "iat/sms_16k.jet"));
        //识别8k资源-使用8k的时候请解开注释
        return tempBuffer.toString();
    }

这是设置识别的对应参数,讯飞文档里面有详细介绍的 , 还有一个函数是获取离线资源路径

 public  void Recognize(byte[] data)
    {
        mIat.startListening(mRecognizerListener);

        mIat.writeAudio(data, 0, data.length);

        mIat.stopListening();
    }

 private RecognizerListener mRecognizerListener = new RecognizerListener() {

        @Override
        public void onBeginOfSpeech() {
            callback.Start();
        }

        @Override
        public void onError(SpeechError error) {
          
        }

        @Override
        public void onEndOfSpeech() {
          
        }

        @Override
        public void onResult(RecognizerResult results, boolean isLast) {
            String text = JsonParser.parseIatResult(results.getResultString());

            if(isLast) {
                callback.RecognizeSuccess(text);
            }

        }

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

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

这是识别函数,传入Unity中声音的byte[] ,然后下面是一个回调函数。

Unity 中AudioClip转byte[]可以参考我之前的文章这里

 

AndroidStudio要导出aar包,然后放入Unity中,这部分之前也有写

©️2020 CSDN 皮肤主题: 我行我“速” 设计师:Amelia_0503 返回首页