asr.registerListener(yourListener);
2.2.2 开始识别/唤醒
- 1.设置识别/唤醒输入参数
SDK中,您需要根据文档或者demo确定您的输入参数。DEMO中有UI界面简化选择和测试过程。demo中,在点击“开始录音”按钮后,您可以在界面或者日志中看见ASR_START事件的json格式的参数。
- 2.发送start开始事件
asr.send(SpeechConstant.ASR_START, json, null, 0, 0);
2.2.3 回调事件
- 1.开始回调事件
回调事件在您实现的EventListener中获取。OnEvent方法中, name是输出事件名,params该事件的参数,(data,offset, length)三者一起组成额外数据。如回调的音频数据,从data[offset]开始至data[offset + length] 结束,长度为length。
public void onEvent(String name, String params, byte [] data, int offset, int length);
2.2.4. 控制识别/唤醒
- 1.控制停止识别/唤醒,可以向SDK发送停止事件
asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0);
//发送停止录音事件,提前结束录音等待识别结果
- 2.取消本次识别,可以向SDK发送取消事件
asr.send(SpeechConstant.ASR_CANCEL null, null, 0, 0);
//发送停止录音事件,提前结束录音等待识别结果
2.2.5. 事件管理器退出
- 1.释放资源
asr.unregisterListener(this);
demo 根目录下有doc_integration_DOCUMENT目录,里面有demo的测试图文教程和集成图文教程。其中 “ASR-INTEGRATION-helloworld-V3.01.docx” 中描述了如何集成Android识别SDK到新项目。
2.3.1 导入core 模块
- 1.导入demo的core module
此时查看项目目录下的settings.gradle, 可以看见core module已经被加载,同时可以看见core目录的图标。
2.3.2 配置app依赖core
- 1.右击app目录选择Open Module Settings
- 2.在打开的界面选择Dependencies.然后选择app----+号-----选择3 Module Dependency
- 3.在弹出的界面勾选core后点击OK
此时观察build.gradle(module :app)文件,发现自动添加了如下一行implementation project(path: ‘:core’)。
并根据core/build.gradle(module :core)更改app/build.gradle(module :app)部分版本号。至此,成功集成。
2.3.3 测试及解决运行问题
修改app/java/com.baidu.speech.recognizerdemo/MainActivity.java,集成完毕,直接启动app即可测试。
- 运行app时可能会出现下面这个问题:
Compatible side by side NDK version was not found. Default is 20.0.5594570.
- *解决方法:tools–>sdk manager–>Android sdk–>sdk tools–>show package detail–>找到相对应NDK
2.3.4 集成方法对比
网上还有一种分别在新项目的 core/libs和新项目下新建一个core/src/main/jniLibs文件夹中导入jar和.so库的集成操作。但这种操作比起上述详细说明的操作,在我看来相对更为复杂,且容易出错。
主要是对 core模块中的 “ActivityMiniRecog类” 进行仿写。
2.4.1 配置AndroidManifest.xml 文件
a.设置权限
b.设置APP_ID, APP_KEY, SECRET_KEY及注意点
<meta-data android:name=“com.baidu.speech.APP_ID”
android:value=“15590577” />
<meta-data
android:name=“com.baidu.speech.API_KEY”
android:value=“q2uPyBe6LmWTZlvb0g1dzcHV” />
<meta-data
android:name=“com.baidu.speech.SECRET_KEY”
android:value=“y7S7hAI894BB3LF1yHYmvQEus1B6wPvj” />
- 关于APP_ID, APP_KEY, SECRET_KEY的使用,许多网上的教程说要到百度上去注册账号,然后创建应用啥的,但如果只是简单的做个demo的话,完全没有必要。可以在demo的core\src\main\AndroidManifest.xml中找到包名ApplicationId:com.baidu.speech.recognizerdemo(官方提供)的上述信息,进行简单使用。
2.4.2 Main.java
package com.example.speechtest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.baidu.speech.EventListener;
import com.baidu.speech.EventManager;
import com.baidu.speech.EventManagerFactory;
import com.baidu.speech.asr.SpeechConstant;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
// 继承百度内部的监听
public class Main extends AppCompatActivity implements EventListener {
protected EditText Result;
protected Button btn;
// 设置事件管理器
private EventManager asr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 动态申请权限
initPermission();
// 基于sdk集成1.1 初始化EventManager对象 设置自定义监听
asr = EventManagerFactory.create(this, “asr”);
// 基于sdk集成1.3 注册自己的输出事件类
asr.registerListener(this);
Result = findViewById(R.id.EditView);
btn = findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast toast = Toast.makeText(getApplicationContext(),“开始识别”,Toast.LENGTH_LONG);
toast.show();
start();
}
});
}
/**
-
基于SDK集成2.2 发送开始事件
-
点击开始按钮
*/
private void start(){
Map<String, Object> params = new LinkedHashMap<String, Object>();
// 基于SDK集成2.1 设置识别参数
params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false);
String json = null; // 可以替换成自己的json
json = new JSONObject(params).toString(); // 这里可以替换成你需要测试的json
// 基于SDK集成2.2 发送start开始事件
asr.send(SpeechConstant.ASR_START, json, null, 0, 0);
}
/*
*基于sdk集成1.2 自定义输出事件类
*EventListener 回调方法
*/
@Override
public void onEvent(String name, String params, byte[] data, int offset, int length) {
if (SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL.equals(name)){
// 识别相关的结果都在这里CALLBACK_EVENT_ASR_PARTIAL
try {
// 结果类型result_type(临时结果partial_result,最终结果final_result)
// best_result最佳结果参数
//在2.2熟悉源码的2.2.1设置识别/唤醒输入参数中可查看原始Json
JSONObject object = new JSONObject(params);
String result = object.getString(“best_result”);
String resultType = object.getString(“result_type”);
// 判断识别是否结束
if (“final_result”.equals(resultType)){
Result.setText(result);
Toast toast = Toast.makeText(getApplicationContext(),“识别已结束”,Toast.LENGTH_SHORT);
toast.show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
/**
-
android 6.0 以上需要动态申请权限
-
(以下可直接从ActivityMiniRecog类中复制)
*/
private void initPermission() {
String permissions[] = {Manifest.permission.RECORD_AUDIO,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.INTERNET,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
ArrayList toApplyList = new ArrayList();
for (String perm : permissions) {
if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) {
toApplyList.add(perm);
// 进入到这里代表没有权限.
}
}
String tmpList[] = new String[toApplyList.size()];
if (!toApplyList.isEmpty()) {
ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123);
}
}
尾声
最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
Android进阶学习资料库
一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
[外链图片转存中…(img-PpOLW2iE-1715114529423)]
Android进阶学习资料库
一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
[外链图片转存中…(img-OEo7kwPG-1715114529425)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!