Android SDK

一. 离线ASR概述

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

二. SDK使用说明

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

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

2.1 语法构建

2.1.1 准备

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

so:libgram.solibduiutils.so

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

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

2.1.2 编写语法文件

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

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

 

xbnf 文件示例:

2.1.3 引擎运行流程图

2.1.4 使用流程

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

 

2.1.4.1 创建结果接口

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重新加载识别引擎...");
            initLocalAsr();
        }

        @Override
        public void onInit(int status) {
            if (status == 0) {
                showInfo("资源定制引擎加载成功");
                if (mAsrEngine == null) {
                    setResBtnEnable(true);
                }
            } else {
                showInfo("资源定制引擎加载失败");
            }
        }
    }

返回值释义与结果如下表所示:

方法名 说明 参数值
onError(AIError error) 资源生成错误时回调 DUI Lite 2.0 - 错误码
onBuildCompleted(String path) 资源生成/更新成功时回调 返回生成资源路径
onInit(int status) 初始化结果 0:初始化成功;否则返回失败

 

2.1.4.2 创建并初始化engine实例

AILocalGrammarEngine mGrammarEngine;
mGrammarEngine = AILocalGrammarEngine.createInstance();
mGrammarEngine.init(SampleConstants.EBNFC_RES, new AILocalGrammarListenerImpl());

部分方法使用以及参数含义如下:

方法名 说明 备注
createInstance() 创建实例 非单例
init(String grammarResource, AILocalGrammarListener listener) 初始化本地语法编译引擎

grammarResource是资源所在目录,有两种格式:

1,如在 sd 里设置为绝对路径 如/sdcard/speech/***.bin

2, 如在 assets 里设置为名称

startBuild(String grammarContent, String outputPath) 构建语法,生成或更新本地识别需要的资源,如果资源文件不存在,则生成,如果存在,则覆盖

grammarContent 语法内容, 语法内容生成的过程请参考 demo

outputPath     编译语法后生成的本地识别所需要的资源的输出文件路径

destroy() 销毁本地语法编译引擎

 

 

2.1.4.3 开始语法构建

String NET_BIN_PATH = "/sdcard/speech/local_asr.net.bin";//需要事先确保/sdcard/speech路径存在
// ebnf 是从语法文件 asr.xbnf 的内容
mGrammarEngine.startBuild(ebnf, NET_BIN_PATH);

编译成功后会回调 onBuildCompleted(String path) ,可以在这个方法的实现中进行之后的操作

 

2.1.4.4 销毁引擎

使用之后需要在合适的位置销毁引擎。

mGrammarEngine.destroy();

2.1.4.5 完整流程代码如下,更为详细内容可以参考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.XXX.bin(ebnfr开头,后面的可能因为版本号不同,文件名字不一样),

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

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

2.2.2 引擎运行流程图



2.2.3 示例代码

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

 

2.2.3.1 配置config信息 

AILocalASRConfig config = new AILocalASRConfig();
config.setAcousticResources(SampleConstants.EBNFR_RES);
config.setNetbinResource(NET_BIN_PATH);
config.setVadEnable(true);
config.setVadResource(SampleConstants.VAD_RES);

更多的config配置信息如下,请根据需要配置自己的config信息

参数名 取值 说明 是否必须 默认值
setVadEnable(boolean vadEnable) true/false 设置是否使用vad 建议使用 true
setVadResource(String vadResource)

1. 如在 sd 里设置为绝对路径 如/sdcard/speech/***.bin

2. 如在 assets 里设置为名称

设置本地vad资源 如果使用vad,则必须设置此属性 NA
setNetbinResource(String netbinResource)

1. 如在 sd 里设置为绝对路径 如/sdcard/speech/***.bin

2. 如在 assets 里设置为名称

设置网络资源 NA
setAcousticResources(String acousticResources)

1. 如在 sd 里设置为绝对路径 如/sdcard/speech/ebnfr.aicar.1.3.0.bin

2. 如在 assets 里设置为名称,如:ebnfr.aicar.1.3.0.bin

设置声学资源 NA

 

2.2.3.2 实现识别引擎的回调接口

/**
* 识别引擎回调接口,用以接收相关事件
*/
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) {

}

}

部分方法说明如下表:

方法名 返回值说明 备注
onBeginningOfSpeech()   检测到说话时回调
onEndOfSpeech()   语音停止时回调
onReadyForSpeech()   准备完成,请说话
onRmsChanged(float rmsdB) 声音变化信息 声音产生变化时调用
onError(AIError error) 错误码请参考 DUI Lite 2.0 - 错误码 识别错误
onResults(AIResult results)

中间结果(如果设置开启实时反馈)

{

      "grammar": {

           "rec": "打 开 WIFI",

           "var": 0

       }

}

最终返回结果

{

    "version": "1.0.12.2020.6.11.11:11:30",

    "res": "aicar.1.3.0",

     "eof": 1,

     "rec": "打 开 WIFI",

     "conf": 0.6936,

     "pinyin": "da kai WIFI",

     "wavetime": 1880,

     "prutime": 0,

     "systime": 1977,

     "rectime": 0,

     "sestime": 1977,

     "delaytime": 5,

     "delayframe": 0,

     "net_type": 0,

     "post": {

           "sem": {}

     }

}

返回识别结果
onInit(int status)

0代表初始化成功,否则失败

返回初始化结果

更多信息请参考 javadoc

 

2.2.3.3 初始化

mAsrEngine = AILocalASREngine.createInstance();
mAsrEngine.init(config, new AIASRListenerImpl());

初始化会回调onInit(int status),0代表init成功。

 

2.2.3.4 配置intent信息并启动识别引擎

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);

更多intent配置信息如下表:

方法名 参数说明 默认值 说明
setFespxEngine(IFespxEngine fespxEngine) 传入引擎实例 设置关联的信号处理引擎AILocalSignalAndWakeupEngine实例,只在使用内部录音机且多麦模式下才需要设置
setNoSpeechTimeOut(int noSpeechTimeOut) 超时时长,单位毫秒 5000ms 设置无语音超时时长,如果达到该设置值时,自动停止录音并放弃请求识别内核
setMaxSpeechTimeS(int maxSpeechTimeS) 允许的最大录音时长 单位秒,取值范围 1-60秒 60s 设置音频最大录音时长,达到该值将取消语音引擎并抛出异常
setSaveAudioPath(String saveAudioPath) 路径 NA 设置保存的音频路径,最终的音频路径为path + local_asr_+ recordId + ".pcm"
setUseOneShot(boolean useOneShot) true 使用 oneshot功能,false 不使用 false 是否使用oneshot功能
setUseOneShot(boolean useOneShot, int intervalTimeThresh)

useOneShot         true 使用 oneshot功能,false 不使用

intervalTimeThresh useOneShot 为 true 时才有效

useOneShot:false

intervalTimeThresh:600ms

设置是否使用oneshot功能,以及oneshot功能的唤醒词和命令词之间的时间间隔阈值,如果小于该阈值,就认为是oneshot,如果大于该阈值,就认为不是oneshot
setUseConf(boolean useConf) useConf true为启用 true 设置是否开启置信度
setUseXbnfRec(boolean useXbnfRec) useXbnfRec true 启用 false 设置是否启用基于语法的语义识别
setUseRealBack(boolean useRealBack) true为使用实时反馈 false 设置是否开启实时反馈
setUseHoldConf(boolean useHoldConf) true/false true 设置是否开启ngram置信度
setUsePinyin(boolean usePinyin) true/false false 设置是否开启拼音输出
setDynamicList(List<String> dynamicList) 热词列表字符串,比如:"北京市,YOU ARE RIGHT,BLUCE,tfboys,天安门博物馆" NA 设置识别热词列表字符串
setUseCustomFeed(boolean useCustomFeed) true/false false 设置是否自行feed数据,不使用内部录音机(包括MockRecord和AIAudioRecord)
setPauseTime(int pauseTime) pauseTime 单位:ms 300ms 设置VAD右边界
setUseFiller(boolean useFiller) true/false false 设置是否开启 Filler,用于减少误识别。例如:asr.xbnf 里有词 “周杰伦的歌”,用户只说了 “周杰伦”。当不使用 Filler 时,会回调 “周杰伦的歌”;当使用 Filler 时,会回调 ""
setVadEnable(Boolean vadEnable) true/false
null 设置是否启用本地vad。启用前提是AILocalASRConfig#isVadEnable() 为true,否则该参数无效。此参数可设置本轮start的引擎是否使用vad功能

更多的方法请参阅 demo或者 javadoc

 

2.2.3.5 引擎停止取消与销毁

mAsrEngine.cancel();
mAsrEngine.stop();
mAsrEngine.destroy();

以上三个方法可以分开使用,请根据自己的需要在合适的位置进行配置。

 

2.2.3.6 引擎的使用代码整合

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) {

}

}

三. 错误码

DUI Lite 2.0 - 错误码

 

四. 接口文档

 

更多的接口内容与描述请参阅 javadoc