5.3.本地识别
离线识别包含两部分内容:语法构建、本地语音识别。 语法构建引擎允许开发者自定义离线说法并生成本地识别引擎可用的资源形式(net.bin)作为本地识别引擎启动参数。本地识别引擎依赖语法构建引擎生成离线识别资源。
初始化
private void initLocalAsr() {
mAsrEngine = AILocalASREngine.createInstance();
mAsrEngine.setResBin("ebnfr.aicar.1.2.0.bin");
mAsrEngine.setNetBinPath(NET_BIN_PATH);
mAsrEngine.setUseConf(true);//识别结果返回阈值
mAsrEngine.setUsePinyin(true);//识别结果返回拼音
mAsrEngine.setUseXbnfRec(true);//识别结果返回语义信息
// mAsrEngine.setUseRealBack(true);//设置开启实时反馈
mAsrEngine.setVadEnable(true);
mAsrEngine.setVadRes("vad.bin");
mAsrEngine.setPauseTime(500);
mAsrEngine.init(new AIASRListenerImpl());
mAsrEngine.setSaveAudioPath("/sdcard/speech");
// mAsrEngine.setLanguage(Languages.CHINESE) //设置语种,init 之前设置生效 , 默认 {@link Languages#CHINESE}
mAsrEngine.setUseFormat(true); //设置离线语义是否格式化为与在线语义相同的格式;默认为false;
}
/**
* 识别引擎回调接口,用以接收相关事件
*/
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) {
showInfo("识别发生错误");
showTip(error.getErrId() + "");
setAsrBtnState(true, "识别");
}
@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 onRawDataReceived(byte[] bytes, int i) {
//原始多路pcm音频数据,只针对多麦模式下使用
}
@Override
public void onResultDataReceived(byte[] bytes, int i) {
//识别模块接收到的单路pcm音频数据
}
@Override
public void onNotOneShot() {
//在oneshot模式下,当检测到非连说会回调该接口
Log.e(TAG, "not one shot");
}
}
开始录音并识别
mAsrEngine.start();
//在启用vad的情况下,当使用者说完话了,sdk内部会自动检测到声音停止,并抛出识别结果
//如果没有启用vad,或者启用了vad,使用者想要提前获取识别结果(比如松开按钮的使用场景)
//可以调用
mAsrEngine.stopRecording();
//如果想要取消识别
//可以调用
mAsrEngine.cancel();
销毁引擎
mAsrEngine.destroy();
本地识别结果
{
"version": "1.0.1.2019.1.26.15:23:46",
"res": "aicar.1.2.0_1",
"eof": 1,
"rec": "我 想 听 Passenger 的 let her go",
"conf": 0.555805,
"pinyin": "wo xiang ting Passenger de let her go",
"wavetime": 3080,
"vadtime": 3080,
"prutime": 0,
"systime": 3494,
"rectime": 0,
"sestime": 3494,
"delaytime": 0,
"delayframe": 0,
"net_type": 0,
"post": {
"sem": {
"singer": "Passenger",
"song": "let her go",
"skill": "测试"
}
}
}