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.so,libduiutils.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
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 引擎的使用代码整合
三. 错误码
四. 接口文档
更多的接口内容与描述请参阅 javadoc