下载demo
首先要下载demo获取sdk,下载地址
下载下来的项目是这样的(如果更新后不适用,建议查看官方文档自己摸索)
依赖core
在自己需要的添加语音识别的项目里面依赖core这个包
具体依赖方法可以参考demo文件夹中的
sdk_asr_baidu_speech_ASR_V3_20191210_81acdf5_3.1.6\doc_integration_DOCUMENT\ASR-INTEGRATION-TTS-DEMO V3.0.docx中的(二)
添加实现代码
依赖成功后在需要添加的Avtivity里面添加如下代码:
protected MyRecognizer myRecognizer;
/**
* 控制UI按钮的状态
*/
protected int status;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
handleMsg(msg);
}
};
IRecogListener listener = new MessageStatusRecogListener(handler);
myRecognizer = new MyRecognizer(this, listener);
}
protected void handleMsg(Message msg) {
switch (msg.what) { // 处理MessageStatusRecogListener中的状态回调
case STATUS_FINISHED:
if (msg.arg2 == 1) {
//这里会出现错误弹窗
//同时这里也是输出结果
if (msg.obj.toString().contains("识别错误")) {
Toast.show(msg.obj.toString());//弹窗
} else {
mEtSearch.setText(msg.obj.toString());
}
dialog.dismiss();
}
status = msg.what;
updateBtnTextByStatus();
break;
case STATUS_NONE:
case STATUS_READY:
case STATUS_SPEAKING:
case STATUS_RECOGNITION:
status = msg.what;
updateBtnTextByStatus();
break;
default:
break;
}
}
private void updateBtnTextByStatus() {
switch (status) {
case STATUS_NONE:
//开始录音时候页面状态可以在这里修改
break;
case STATUS_WAITING_READY:
case STATUS_READY:
case STATUS_SPEAKING:
case STATUS_RECOGNITION:
//停止录音时候页面状态可以在这里修改
break;
case STATUS_LONG_SPEECH_FINISHED:
case STATUS_STOPPED:
//取消整个识别过程页面状态可以在这里修改
break;
default:
break;
}
}
/**
* 开始录音,点击“开始”按钮后调用。
* 基于DEMO集成2.1, 2.2 设置识别参数并发送开始事件
*/
protected void start() {
// DEMO集成步骤2.1 拼接识别参数: 此处params可以打印出来,直接写到你的代码里去,最终的json一致即可。
final Map<String, Object> params = new HashMap<>();
// params 也可以根据文档此处手动修改,参数会以json的格式在界面和logcat日志中打印
//params为语音等设置
int language = 123456;
// params.put("pid", language);
Log.i(TAG, "设置的start输入参数:" + params);
// 复制此段可以自动检测常规错误
(new AutoCheck(getApplicationContext(), new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 100) {
AutoCheck autoCheck = (AutoCheck) msg.obj;
synchronized (autoCheck) {
String message = autoCheck.obtainErrorMessage(); // autoCheck.obtainAllMessage();
// txtLog.append(message + "\n");
; // 可以用下面一行替代,在logcat中查看代码
Log.w("AutoCheckMessage", message);
}
}
}
}, false)).checkAsr(params);
// 这里打印出params, 填写至您自己的app中,直接调用下面这行代码即可。
// DEMO集成步骤2.2 开始识别
myRecognizer.start(params);
}
/**
* 开始录音后,手动点击“停止”按钮。
* SDK会识别不会再识别停止后的录音。
* 基于DEMO集成4.1 发送停止事件 停止录音
*/
protected void stop() {
myRecognizer.stop();
}
/**
* 开始录音后,手动点击“取消”按钮。
* SDK会取消本次识别,回到原始状态。
* 基于DEMO集成4.2 发送取消事件 取消本次识别
*/
protected void cancel() {
myRecognizer.cancel();
}
/**
* 销毁时需要释放识别资源。
*/
@Override
protected void onDestroy() {
// 如果之前调用过myRecognizer.loadOfflineEngine(), release()里会自动调用释放离线资源
// 基于DEMO5.1 卸载离线资源(离线时使用) release()方法中封装了卸载离线资源的过程
// 基于DEMO的5.2 退出事件管理器
myRecognizer.release();
Log.i(TAG, "onDestory");
// BluetoothUtil.destory(this); // 蓝牙关闭
super.onDestroy();
}
使用方法
只要调用start();方法就可以使用,调用stop();就能手动停止录音
需要动态获取录音、读写文件的动态权限后才能使用,可以在获取权限成功的时候调用start方法
返回数据
语音识别后的数据会出现在handleMsg中的case STATUS_FINISHED:
数据格式在MessageStatusRecogListener.java 中
onAsrFinalResult的 String message是成功的格式
onAsrFinishError的 String message是失败的格式
注意事项
当跳转了同样需要语音的页面时候当前页面需要用myRecognizer.release();来结束当前的进程,不然会闪退/报错8001