实现百度语音识别功能
最近换了工作,新公司现在主推人脸识别,底层C++大神们写好算法打包so文件给前端使用,我大部分的工作是处理逻辑业务和调用。所以最近都没怎么记录用到的技术,闲暇时间看了下语音识别的功能,写了个demo给记录一下。
好了,废话不多说,开始今天的工作。
首先平台注册账号,有百度账号的可以直接登陆。http://yuyin.baidu.com/
登陆成功后到应用管理中创建一个新应用,绑定包名等就不再说了,然后开通语音识别功能。
到sdk页面下载对应的语音识别demo。
导入依赖架包和so文件
然后根据官网的步骤,导入权限和设置APP_ID,APP_KEY和SECRET_KEY。
接下来就正式开始敲代码,我这里写了一个方法,包含了6.0权限动态申请,语音识别结果回掉等方法,初始化后可直接调用。
public class OnLineUtils implements EventListener { private EventManager asr; private OnLineCallBack onLineCallBack; public OnLineUtils (Context context, OnLineCallBack onLineCallBack){ asr = EventManagerFactory.create(context,"asr"); asr.registerListener(this); this.onLineCallBack = onLineCallBack; initPermission(context); } /* * android 6.0 以上需要动态申请权限 */ private void initPermission(Context context) { String permissions[] = {Manifest.permission.RECORD_AUDIO, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.INTERNET, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; ArrayList<String> toApplyList = new ArrayList<String>(); for (String perm : permissions) { if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(context, perm)) { toApplyList.add(perm); // 进入到这里代表没有权限. } } String tmpList[] = new String[toApplyList.size()]; if (!toApplyList.isEmpty()) { ActivityCompat.requestPermissions((Activity) context, toApplyList.toArray(tmpList), 123); } } @Override public void onEvent(String name, String params, byte[] data, int offset, int length) { if (params != null && !params.isEmpty()) { if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)) { try { JSONObject jsonObject = new JSONObject(params); String resultType = jsonObject.getString("result_type"); if (resultType.equals("final_result")){ String finalResult = jsonObject.getString("best_result"); onLineCallBack.onSuccess(finalResult); } } catch (JSONException e) { e.printStackTrace(); } } } } public interface OnLineCallBack{ void onSuccess(String result); } /** * 开始识别 */ public void start(){ Map<String,Object> params = new LinkedHashMap<>(); String event = SpeechConstant.ASR_START; params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME,false); String json = new JSONObject(params).toString(); asr.send(event,json,null,0,0); } /** * 停止识别 */ public void stop() { asr.send(SpeechConstant.ASR_STOP,null,null,0,0); } }https://github.com/XW837156540/StandYunyinDemo