实现多所说的话进行识别,开灯 、 关灯。
这里通过使用百度的 语音识别 sdk 来实现。
百度智能语音网站:http://ai.baidu.com/docs#/
SDK 下载网址:http://ai.baidu.com/sdk
在下载的sdk 中寻找 开发最简单的语音识别的文档,
路径如下:
当然百度 SDK 里本身 就包含一个可以直接运行的 语音识别 apk ,他包含了很多模块,
而这个文档时一个模块模块的介绍的。
apk 源码 下载连接:
https://download.csdn.net/download/qq_27061049/11032320
我们虽然通过百度sdk 可以识别 语音转文字了 ,但是我们还是要提取出来,转化的文字,同时判断是符合我们的命令。
分析代码 我们发现 ,对于语音识别这一块 ,在 ActivityMiniRecog.java 文件中,有回调函数,我们分析发现,是返回的 语音转文字的Json 数据:
// 基于sdk集成1.2 自定义输出事件类 EventListener 回调方法
// 基于SDK集成3.1 开始回调事件
@Override
public void onEvent(String name, String params, byte[] data, int offset, int length) {
String logTxt = "name: " + name;
if (params != null && !params.isEmpty()) {
logTxt += " ;params :" + params;
}
if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)) {
if (params != null && params.contains("\"nlu_result\"")) {
if (length > 0 && data.length > 0) {
logTxt += ", 语义解析结果:" + new String(data, offset, length);
}
}
} else if (data != null) {
logTxt += " ;data length=" + data.length;
}
Log.i(TAG,"返回语音解析: " + params);
if (params != null && params != "") {
jsonDataAnalysis.getCommandFromJsonData(params); //如果 不是空的数据 就传递过去
}
printLog(logTxt);
}
比如我们说 你好:
{
"results_recognition": ["你好"],
"result_type": "final_result",
"best_result": "你好",
"origin_result": {
"corpus_no": 6668176002664336518,
"err_no": 0,
"result": {
"word": ["你好"]
},
"sn": "f8e1b32e-d235-484c-b89c-1108b4b75da3",
"voice_energy": 24559.5546875
},
"error": 0
}
我们发现 只要是能够获取到 best_result 这个属性值 就可以获取到我们说的话,
于是我们添加了 Json 数据解析。
主要功能代码如下:
public void getCommandFromJsonData(String str) {
JSONObject jsonObject = null; //整体文件是一个对象
try {
jsonObject = new JSONObject(str);
if (jsonObject.has("best_result")) { //判断 json 对象中有没有这个属性值
String best_result = jsonObject.getString("best_result"); //根据键值对寻找数据
Log.i(TAG,"说出的命令是:" + best_result);
if (best_result.contains("启动")) {
Log.i(TAG,"开始启动");
} else {
Log.i(TAG,"无效命令");
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
实现效果如下: