Android SDK接入

1. 离线ASR概述

DUI Lite SDK离线识别可使在无网的情况下,提供将声音信息转化为文字信息的能力。

2.SDK使用说明

使用当前功能时,请先授权,否则禁止使用。请参考 授权说明

离线语音是被包含两个部分:1.语法构建 2.语音识别

2.1 语法构建

2.1.1 准备

jar:DUI-lite-SDK-for-Android-x.x.x.jar

so:libgram.solibduiutils.so

资源:ebnfc.aicar.1.2.0.bin(ebnfc开头,后面的可能因为版本号不同,文件名字不一样)

资源可以放在assets目录中,也可以自己手动放在磁盘中,比如/sdcard/

2.1.2 编写语法文件

a .语法内容编写请参考XBNF语法文件编写指导

b. 在assets目录或者其他磁盘目录新建文件asr.xbnf(文件名或后缀都没有要求), 将语法内容写入该文件。(当然也可以直接写在代码中,后面会从把该文件中的语法内容字符串,通过sdk的接口传入执行)

 

xbnf 文件示例:

2.1.3 引擎运行流程图

2.1.4 使用流程

涉及引擎类:AILocalGrammarEngine详细使用示例请参考 demo

AILocalGrammarEngine mGrammarEngine;
mGrammarEngine = AILocalGrammarEngine.createInstance();
mGrammarEngine.init(SampleConstants.EBNFC_RES, new AILocalGrammarListenerImpl());
 
 
String NET_BIN_PATH = "/sdcard/speech/local_asr.net.bin";//需要事先确保/sdcard/speech路径存在
// ebnf 是从语法文件 asr.xbnf 的内容
mGrammarEngine.startBuild(ebnf, NET_BIN_PATH);
 
 
mGrammarEngine.destroy();
 
public class AILocalGrammarListenerImpl implements AILocalGrammarListener {
 
@Override
public void onError(AIError error) {
showInfo("资源生成发生错误");
showTip(error.getError());
setResBtnEnable(true);
}
 
 
@Override
public void onBuildCompleted(String path) {
showInfo("资源生成/更新成功\npath=" + path + "\n重新加载识别引擎...");
Log.i(TAG, "资源生成/更新成功\npath=" + path + "\n重新加载识别引擎...");
mGrammarEngine.destroy();
initLocalAsr();
}
 
@Override
public void onInit(int status) {
if (status == 0) {
showInfo("资源定制引擎加载成功");
if (mAsrEngine == null) {
setResBtnEnable(true);
}
else {
showInfo("资源定制引擎加载失败");
}
}
}

2.2 离线语音识别

2.2.1 准备

jar:DUI-lite-SDK-for-Android-x.x.x.jar

so:libasr.so, libduiutils.so,libvad.so

资源:vad.bin

ebnfr.aicar.1.2.0.bin(ebnfr开头,后面的可能因为版本号不同,文件名字不一样),

xxxx.ne.t.bin(该文件由上一步的语法构建生成,可以在代码中动态生成,也可以事先生成好,放入自定义目录或assets目录中)

资源可以放在assets目录中,也可以自己手动放在磁盘中,比如/sdcard/

2.2.2 引擎运行流程图



2.2.3 示例代码

涉及引擎类:AILocalASREngine 详细使用示例请参考 demo

AILocalASREngine mAsrEngine;
AILocalASRConfig config = new AILocalASRConfig();
config.setAcousticResources(SampleConstants.EBNFR_RES);
config.setNetbinResource(NET_BIN_PATH);
config.setVadEnable(true);
config.setVadResource(SampleConstants.VAD_RES);
 
mAsrEngine = AILocalASREngine.createInstance();
mAsrEngine.init(config, new AIASRListenerImpl());
 
 
AILocalASRIntent aiLocalASRIntent = new AILocalASRIntent();
aiLocalASRIntent.setPauseTime(500);
aiLocalASRIntent.setUseConf(true);//识别结果返回阈值
aiLocalASRIntent.setUsePinyin(true);//识别结果返回拼音
aiLocalASRIntent.setUseXbnfRec(true);//识别结果返回语义信息
// aiLocalASRIntent.setUseRealBack(true);//设置开启实时反馈
aiLocalASRIntent.setSaveAudioPath("/sdcard/speech");
aiLocalASRIntent.setNoSpeechTimeOut(0);
// aiLocalASRIntent.setMaxSpeechTimeS(0);
 
// 更新热词,res资源(setResBin)必须需要使用ebnfr.dymc.0.1.0.bin,否则会崩溃
/*ArrayList dynamicList = new ArrayList<String>();
dynamicList.add("北京市");
dynamicList.add("天安门博物馆");
aiLocalASRIntent.setDynamicList(dynamicList);*/
 
mAsrEngine.start(aiLocalASRIntent);
 
mAsrEngine.cancel();
mAsrEngine.stop();
mAsrEngine.destroy();
 
 
/**
* 识别引擎回调接口,用以接收相关事件
*/
public class AIASRListenerImpl implements AIASRListener {
 
@Override
public void onBeginningOfSpeech() {
showInfo("检测到说话");
 
}
 
@Override
public void onEndOfSpeech() {
showInfo("检测到语音停止,开始识别...");
}
 
@Override
public void onReadyForSpeech() {
showInfo("请说话...");
}
 
@Override
public void onRmsChanged(float rmsdB) {
showTip("RmsDB = " + rmsdB);
}
 
@Override
public void onError(AIError error) {
Log.d(TAG, error.toString());
showTip(error.toString());
setAsrBtnState(false"识别");
}
 
@Override
public void onResults(AIResult results) {
 
Log.i(TAG, results.getResultObject().toString());
try {
showInfo(new JSONObject(results.getResultObject().toString()).toString(4));
catch (JSONException e) {
e.printStackTrace();
}
setAsrBtnState(true"识别");
}
 
@Override
public void onInit(int status) {
if (status == 0) {
Log.i(TAG, "end of init asr engine");
showInfo("识别引擎加载成功");
setResBtnEnable(true);
setAsrBtnState(true"识别");
else {
showInfo("识别引擎加载失败");
}
}
 
@Override
public void onNotOneShot() {
 
}
 
@Override
public void onResultDataReceived(byte[] buffer, int size) {
 
}
 
@Override
public void onRawDataReceived(byte[] buffer, int size) {
 
}
 
}

 

3.错误码

DUI Lite 2.0 - 错误码

 

4. 接口文档

javadoc   https://www.duiopen.com/duilite-doc/android