讯飞语音接入流程

语音识别技术在近几年可以说是飞速的发展,很多app种也接入了语音识别的功能。一般都是接入的第三方品台来进行语音的识别,几户没有公司会为了实现一个语音的功能来开发一套自己的语音识别技术。在市面上的语音识别技术,讯飞的技术在行业内可以说是顶尖的。下面就来介绍一下接入讯飞语音的流程。

前期准备

  • 去讯飞开放平台注册账号并申请新的appId。

这里写图片描述

  • 下载sdk,根据平台和需求来下来对应的sdk

下载地址:http://www.xfyun.cn/sdk/dispatcher

接入步骤

  • 拷贝jar包和对应手机架构的so库到工程中

这里写图片描述
这里只需要拷贝Msc.jar即可,一般手机的架构都是armeabi架构的,根据需要引入。

  • 添加权限
    在工程 AndroidManifest.xml 文件中添加如下权限

    <!--连接网络权限,用于执行云端语音能力 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <!--读取网络信息状态 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!--获取当前wifi状态 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <!--允许程序改变网络连接状态 -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <!--读取手机信息权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!--读取联系人权限,上传联系人需要用到此权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <!--外存储写权限,构建语法需要用到此权限 -->
    <uses-permission android:name="android.permission. WRITE_EXTERNAL_STORAGE"/>
    <!--外存储读权限,构建语法需要用到此权限 -->
    <uses-permission android:name="android.permission. READ_EXTERNAL_STORAGE"/>
    <!--配置权限,用来记录应用配置信息 -->
    <uses-permission android:name="android.permission. WRITE_SETTINGS"/>
    <!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
    <!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <!--如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
    <uses-permission android:name="android.permission.CAMERA" />

    这里的权限比较多,如果只是简单的语音识别为文字,不需要这么多的权限,根据需要进行添加

  • 初始化讯飞语音
    在程序的入口application中初始化语音,并修改appid

    SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");
  • 核心代码

    • 讯飞demo中功能比较多,这里就简单的介绍语音识别这一功能
    public class VoiceUtil {
        private SpeechRecognizer mIat;
        private String mEngineType = SpeechConstant.TYPE_CLOUD;
        private RecognizerDialog mIatDialog;
        private static Context mContext;
        int ret = 0; // 函数调用返回值
        private static VoiceUtil instance = null;
    
        private VoiceUtil() {
        }
    
        public synchronized static VoiceUtil getInstance(Context context) {
            mContext = context;
            if (instance == null) {
                instance = new VoiceUtil();
            }
            return instance;
        }
    
        public void startVoice() {
            initVoice();
            //一种带有友盟的动画,一种是没有动画的
            if (true) {
                mIatDialog.setListener(mRecognizerDialogListener);
                mIatDialog.show();
                AppUtil.showToastMsg(mContext, "请开始说话…");
            } else {
                ret = mIat.startListening(mRecognizerListener);
                if (ret != ErrorCode.SUCCESS) {
                    AppUtil.showToastMsg(mContext, "听写失败,错误码:" + ret);
                } else {
                    AppUtil.showToastMsg(mContext, "请开始说话…");
                }
            }
        }
    
        private void initVoice() {
            mIat = SpeechRecognizer.createRecognizer(mContext, mInitListener);
            mIatDialog = new RecognizerDialog(mContext, mInitListener);
            setParam();
    
            if (true) {
                mIatDialog.setListener(mRecognizerDialogListener);
                mIatDialog.show();
                AppUtil.showToastMsg(mContext, "请开始说话…");
            } else {
                ret = mIat.startListening(mRecognizerListener);
                if (ret != ErrorCode.SUCCESS) {
                    AppUtil.showToastMsg(mContext, "听写失败,错误码:" + ret);
                } else {
                    AppUtil.showToastMsg(mContext, "请开始说话…");
                }
            }
        }
    
        /**
         * 参数设置
         *
         * @param
         * @return
         */
        public void setParam() {
            // 清空参数
            mIat.setParameter(SpeechConstant.PARAMS, null);
    
            // 设置听写引擎
            mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
            // 设置返回结果格式
            mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
            // 设置语言
            mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
            // 设置语言区域
            mIat.setParameter(SpeechConstant.ACCENT, "mandarin");
    
            // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
            mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
    
            // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
            mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
    
            // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
            mIat.setParameter(SpeechConstant.ASR_PTT, "1");
    
            // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
            // 注:AUDIO_FORMAT参数语记需要更新版本才能生效
            mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
            mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/iat.wav");
        }
    
    
        /**
         * 初始化监听器。
         */
        private InitListener mInitListener = new InitListener() {
    
            @Override
            public void onInit(int code) {
                LogUtil.logByD("SpeechRecognizer init() code = " + code);
                if (code != ErrorCode.SUCCESS) {
                }
            }
        };
    
    
        /**
         * 听写监听器。
         */
        private RecognizerListener mRecognizerListener = new RecognizerListener() {
    
            @Override
            public void onBeginOfSpeech() {
                // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
            }
    
            @Override
            public void onError(SpeechError error) {
                // Tips:
                // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
                // 如果使用本地功能(语记)需要提示用户开启语记的录音权限。
            }
    
            @Override
            public void onEndOfSpeech() {
                // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
            }
    
            @Override
            public void onResult(RecognizerResult results, boolean isLast) {
                LogUtil.logByD(results.getResultString());
                printResult(results);
    
                if (isLast) {
                    // TODO 最后的结果
                }
            }
    
            @Override
            public void onVolumeChanged(int volume, byte[] data) {
                LogUtil.logByD("返回音频数据:" + data.length);
            }
    
            @Override
            public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
                // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
                // 若使用本地能力,会话id为null
                //  if (SpeechEvent.EVENT_SESSION_ID == eventType) {
                //      String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
                //      Log.d(TAG, "session id =" + sid);
                //  }
            }
        };
    
        /**
         * 听写UI监听器
         */
        private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {
            public void onResult(RecognizerResult results, boolean isLast) {
                printResult(results);
            }
    
            /**
             * 识别回调错误.
             */
            public void onError(SpeechError error) {
            }
    
        };
    
        private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
    
        private void printResult(RecognizerResult results) {
            String text = JsonParser.parseIatResult(results.getResultString());
    
            String sn = null;
            // 读取json结果中的sn字段
            try {
                JSONObject resultJson = new JSONObject(results.getResultString());
                sn = resultJson.optString("sn");
            } catch (JSONException e) {
                e.printStackTrace();
            }
    
            mIatResults.put(sn, text);
    
            StringBuffer resultBuffer = new StringBuffer();
            for (String key : mIatResults.keySet()) {
                resultBuffer.append(mIatResults.get(key));
            }
            LogUtil.logByE(resultBuffer.toString());
        }
    }

以上是封装后的工具类,使用的时候直接调用即可,这里没有封装回调,只是为了演示功能,如果需要请自行封装。

效果图:

对于6.0以上的系统需要动态的申请权限,这里就不在多做介绍
这里写图片描述

这里写图片描述

这里写图片描述

以上就是接入科大讯飞的流程及代码的调用,谢谢查阅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值