百度 Asr集成

本文详细介绍如何在Android应用中集成百度ASR引擎,包括下载SDK、配置项目、实现识别流程及离线识别方法。

1、上篇我们讲解了如何调用android系统提供的接口实现Asr功能,本篇我们讲解如何集成Asr引擎,这里我们以集成百度Asr为例讲解。
2、百度Ai官网https://ai.baidu.com/下载SDK包,解压后里面也有相关的开发文档。
将libs中文件和res中的文件复制到项目工程对应的文件夹,如下图

在AndroidManifest.xml文件中

添加appId,权限等信息

3、接下来就详细看下集成中重点部分,看过上篇android Asr流程分析和调用的已经知道,Asr引擎的实现需要继承RecognitionService,所以百度Asr我们就集成到service的实现中,在这我们直接说下代码实现,关于实现的原理在这不做详细说明,集成文档中已经做了说明:

private void initRecognizer() {

    asrManager = EventManagerFactory.create(this, "asr");
    asrManager.registerListener(eventListener);
}


初始化实例和监听,监听是监听识别的事件,监听事件如下:

EventListener eventListener = new EventListener() {

    @Override
    public void onEvent(String name, String params, byte[] data, int offset, int length) {

        Log.i(TAG, " name=" + name + " \nparams=" + params + " \noffset=" + offset + " \nlength=" + length);

            // 引擎准备就绪,可以开始说话
        if(name.equals(SpeechConstant.CALLBACK_EVENT_ASR_READY)) {
            try {
                mRecognitionListener.readyForSpeech(new Bundle());
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }else if(name.equals(SpeechConstant.CALLBACK_EVENT_ASR_BEGIN)) {
            // 检测到说话开始
                try {

事件中的不同状态大家去参考继承文档中查询,接下来再实现开始监听整个流程就可以了,代码如下:

private void startListen(){

        JSONObject params=new JSONObject();
        try {
//            params.put(SpeechConstant.PID, 1536);  //语言、模型、是否需要在线语义
            if (enableOffline) {
                params.put(SpeechConstant.DECODER, 2);  //0,在线;2,离线
            }
            params.put(SpeechConstant.VAD, SpeechConstant.VAD_DNN);  //dnn,开启vad;touch,不开启vad,但会60s限制
            //params.put(SpeechConstant.VAD_ENDPOINT_TIMEOUT, 0);  //静音超时断句及长语音
            //params.put(SpeechConstant.IN_FILE, "");  //输入文件路径,文件长度不超过3分钟
            //params.put(SpeechConstant.OUT_FILE, 0);  //识别过程产生的录音文件, 该参数需要开启ACCEPT_AUDIO_DATA后生效
            params.put(SpeechConstant.ACCEPT_AUDIO_DATA, true);  //是否需要语音音频数据回调,开启后有CALLBACK_EVENT_ASR_AUDIO事件
            params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, true);
//            params.put(SpeechConstant.NLU, "enable");  //本地语义解析设置
//            params.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH, "assets://baidu_speech_grammar.bsg");  //本地语义解析文件路径
            //params.put(SpeechConstant.DISABLE_PUNCTUATION, false);  //在选择PID为长句(输入法模式)的时候,是否禁用标点符号
        } catch (JSONException e) {
            e.printStackTrace();
        }
        Log.i(TAG, " params=" + params.toString());
        asrManager.send(SpeechConstant.ASR_START, params.toString(), null, 0, 0);
    }

参考如上代码,在识别中最后调用了asrManager.send接口进入识别,识别结果在onEvent中反馈,至于在JSON组包时候的参数参考百度AI平台中参数说明。
另外百度识别还支持离线,在这也说下添加方法:

这个bsg是关键词包
,需要初始化的时候load。

private void loadOfflineEngine() {
    Map<String, Object> params = new LinkedHashMap<String, Object>();
    params.put(SpeechConstant.DECODER, 2);
    params.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH, "assets://baidu_speech_grammar.bsg");
    asrManager.send(SpeechConstant.ASR_KWS_LOAD_ENGINE, new JSONObject(params).toString(), null, 0, 0);
}

我们在初始化的时候把bag包加载进去,然后在组Json包发送的时候添加

params.put(SpeechConstant.DECODER, 2); //0,在线;2,离线

这个参数就可以,目前本人集成后进行简单测试,离线需要特定的关键词,而且使用离线的话必须要联网初始化一次后才能用离线,所以离线目前来说就是个鸡肋,不过离线不影响在线功能,所以在内存控制要求不高的情况下可以把离线也加上。

4、接下来说下事件处理:

@Override
public void onEvent(String name, String params, byte[] data, int offset, int length) {

在onEvent中我们拿到结果后调用RecognitionListener的callback把结果返回,再进一步处理,这也就是在上篇中我们要实现RecognitionListener监听的原因。
好了,上面就是集成百度Asr的流程,其实很简单,按照文档来就可以,主要在于事和数据的处理,这个大家多调试就可以了。
其次详细代码可以参考XunAsr模块内容,其他百度参数和错误码由于说明太多,在这不做过多讲解,可以到官网查看相关说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值