百度语音

最近折腾了一下百度语音,遇到 一些坑马克一下。

关于安卓sdk基础语音识别:

导入百度语音识别sdk的jar包so库后。SO easy!

/**
    最简单的在线识别例子,所有调用均尽可能使用默认参数
*/
//创建EventManager
EventManager manager=EventManagerFactory.create(<请传入Context对象>,"asr");
EventListener listener=new EventListener(){
    public void onEvent(String eventName,String params,byte[]data,int i,int i2){
        //eventName可以在SpeechConstant中查找相关常量
        //params均为JSON参数,识别结果包含其中,具体参数含义在百度语音官网有售
        //data多为字节型数据如录入的原始音频数据
    }
};
//注册监听器
manager.registerListener(listener);
//开始识别
manager.send(SpeechConstant.ASR_START,"{}",null,0,0);
//需要停止识别时可以等待识别超时或者send ASR_STOP事件
//注意停止识别与取消识别的区别
//以下代码请在button的回调方法中调用,以停止识别
manager.send(SpeechConstant.ASR_STOP,"{}",null,0,0);
//释放资源,释放时一定要取消所有识别
manager.send(SpeechConstant.ASR_CANCLE,"{}",null,0,0);
//卸载监听器及其它加载的资源
manager.unregisterListener(listener);

(愣是在java中写出了c的感觉)

然而坑爹的内容出现了,我本想用本地语法文件识别用户意图,怎么改参数都不成功,看了一天才弄明白原来在线语义是指百度UNIT,文档中在语音识别目录下的语义理解协议也是指UNIT,然而UINT也有与语音识别同级的分类,这也就算了离线在线并不重要,然而百度主打的UNIT所说的语义理解只能在特定场景下使用,不能进行自定义语法识别,WF?并且这玩意主打的是对话机器人。。。因为"语义理解协议"这个名字浪费我一天时间。非要名字高大上就叫语音助手协议不是很好吗?

更令我慒的还在后面,见下图:

百度语音_第1张图片

百度说这是两个功能,然而我找不到这两个功能的开关参数,也不知道有什么差别

不吐槽了,看下语义识别(百度所说的离线命令词)怎么用吧

//-------构建识别对象
EventManager manager=EventManagerFactory.create(<请传入Context对象>,"asr");
EventListener listener=new EventListener(){
    public void onEvent(String eventName,String params,byte[]data,int i,int i2){
    }
};
manager.registerListener(listener);
//-------构建识别参数
JSONObject startParam=new JSONObject();
//使用的语法文件,此值支持assets文件夹下载和res文件夹以及绝对路径
startParam.put(SpeechConsatnt.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH,"assets:///<文件名>.bsg");
/**//此段用于替换语法文件中的词槽,可选
    JSONObject json = new JSONObject();
    json.put("name", new JSONArray().put("王自强").put("叶问")).put("appname", new
    JSONArray().put("手百").put("度秘"));
    initParam.put(SpeechConstant.SLOT_DATA, json.toString());
*/
manager.send(SpeechConstant.ASR_KWS_LOAD_ENGINE,startParam.toString(),null,0,0);
//PID为使用的识别模型,令词只能使用1536、15362、15363.使用其它选项有的识别结果没有NLU_result(就是语义识别结果)有的提示BotId不能为空,就是使用了UNIT的对话机器人。。。
startParam.put(SpeechConstant.PID,1536);
//是否启用本地语义解析
startParam.put(SpeechConstant.NLU,"enable");

//-----------开始录音&识别
manager.send(SpeechConstant.ASR_START,startParam.toString(),null,0,0);


//------------识别结束后释放资源
manager.send(SpeechConstant.ASR_STOP,"{}",null,0,0);
manager.send(SpeechConstant.ASR_CANCLE,"{}",null,0,0);
manager.unregisterListener(listener);

百度的做法是使用EventManager.send(SpeechConstant.ASR_KWS_LOAD_ENGINE,loadParam,null,0,0)来加载离线资源,但我试了好多次CALLBACK_EVENT_ASR_LOADED事件始终没有发给监听器。不知何故。

你可能感兴趣的:(百度语音,语音识别,命令词)