百度识别参考链接:https://blog.csdn.net/qq_38436214/article/details/106636277
百度唤醒参考链接:https://blog.csdn.net/zhangyonggang886/article/details/52782799
百度朗读(这里使用的是omal )参考链接:
https://blog.csdn.net/Crystal_xing/article/details/84823992
omal参考文档:
https://cn.olami.ai/wiki/?mp=sdk&content=sdk/android/reference.html
源码地址 https://github.com/sunbo-ui/dialogue
在百度注册语音识别和omal注册完后获得相应密钥即可开始搭建项目.
语音识别(用户通过语音转文字显示到textView组件当中)
第一步:
① 创建平台应用
既然使用了百度语音,自然免不了要注册该平台的账号,否则凭什么让你使用,点击百度智能云进入,没有账号的可以先注册账号,注册应该就不用我讲解了吧?这里默认都有账号了,然后登录
然后左侧导航栏点击找到语音技术
然后会进入一个应用总览页面,
然后点击创建应用
立即创建
点击查看应用详情
这几个值都是等下项目中要用的,请注意,最好是复制粘贴,不要手打,上图中有一个下载SDK,点击进入下载页面,第一个就是
点击下载到本地,下载之后是一个压缩文件,解压之后先不用管它,然后在Android Studio里面创建一个项目(包名保持一致)
继续:
File → New → Import Module…
通过上面的步骤,插入一个模块进来
点击OK
点击Finish 就会在你当前的项目中加入这个模块,与app是平级的。
还要在你的app里面加入这个才能使用,
找到app下面的build.gradle配置文件,在dependencies闭包下,加入
implementation project(path: ':core')
然后右上角点击 Sync 同步到项目中
下面修改core的AndroidManifest.xml文件中的APP_ID、API_KEY、SECRET_KEY,以及添加权限,里面的值修改为之前在平台注册应用生成的值。
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 蓝牙录音使用,不需要可以去除 -->
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
改好之后,请注意,每个人都是不一样,你如果发现你创建的应用的配置的值和我创建的是一模一样的,你马上去百度提BUG,他们的程序员要就要下岗了~
注:
如果导入sdk中的core,导入不进去或者导入模块没有finish,可以手动复制core文件夹,粘贴到与app平级中,并在settings.gradle中添加
include ':app',':core'
OK,现在语音识别配置也完成了,接下来就是使用了。
首先是修改
布局修改的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_weight="2"
android:text="请唤醒'亚历山大':"
android:textColor="@color/black"
android:textSize="10dp" />
<TextView
android:id="@+id/userText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:textSize="16dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:gravity="center"
android:orientation="horizontal">
<Button
android:id="@+id/discern"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="30dp"
android:text="语音识别"
android:textColor="@color/black"
android:textSize="16dp" />
<Button
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="30dp"
android:text="语音停止"
android:textColor="@color/black"
android:textSize="16dp" />
<Button
android:id="@+id/open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="唤醒开启"
android:textColor="@color/black"
android:textSize="16dp" />
</LinearLayout>
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="10"
android:gravity="center"
android:textColor="@color/black"
android:textSize="16dp" />
<ImageView
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="10"
/>
</LinearLayout>
说道语音识别自然要用到这个麦克风,这个权限是需要动态申请的。
/**
* android 6.0 以上需要动态申请权限
*/
private void initPermission() {
String permissions[] = {Manifest.permission.RECORD_AUDIO,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.INTERNET,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
ArrayList<String> toApplyList = new ArrayList<String>();
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);
}
}
/**
* 权限申请回调,可以作进一步处理
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
// 此处为android 6.0以上动态授权的回调,用户自行实现。
}
得到权限之后就可以进行下一步了,首先是初始化控件以及语音是被的核心SDK
private EventManager asr;//百度语音识别核心库
//创建初始化
asr = EventManagerFactory.create(this, "asr");
//this是把当前类 实现了一个EventListener
asr.registerListener(this);
// SpeechConstant.ASR_START 开启语音识别 "{}"是传入的参数 如果填null可能会报错
asr.send(SpeechConstant.ASR_START, "{}", null, 0, 0);
//返回的结果 语音转文字 需要使用Gson去解析
@Override
public void onEvent(String name, String params, byte[] bytes, int i, int i1) {...}
语音唤醒(用户通过关键词进行唤醒)
点击查看文档,下一步我们要设置“语音唤醒关键词”
点击“语音唤醒”→“概述”→方块中的链接
点击“获取唤醒词”
输入你想使用的唤醒词,进行评估,勾选你想要的唤醒次,然后点击“导出”
在core模块中 src/main/assets中的WakeUp.bin 替换成自己刚刚导出的
百度唤醒的准备工作已经完成,在百度识别的步骤中已经报appid等设置好了.
//定义百度唤醒
private EventManager wp;//百度语音唤醒核心库
//初始化
wp = EventManagerFactory.create(this, "wp");
//自定义WpEventListener 去实现一个EventListener
wp.registerListener(new WpEventListener());
//
private class WpEventListener implements EventListener {
@Override
public void onEvent(String name, String params, byte[] bytes, int i, int i1) {
if ("wp.data".equals(name)) { // 每次唤醒成功, 将会回调name=wp.data的时间, 被激活的唤醒词在params的word字段
try {
JSONObject json = new JSONObject(params);
String word = null; // 唤醒词
word = json.getString("word");
if ("亚历山大".equals(word)) {
//自己的逻辑
}
} catch (Exception e) {
e.printStackTrace();
}
} else if ("wp.exit".equals(name)) {
// 唤醒已经停止
Toast.makeText(MainActivity.this, "唤醒已经停止", Toast.LENGTH_SHORT).show();
}
}
omal进行人机对话
注册登录欧拉蜜
找到我的应用
创建新应用
测试应用
测试成功即可进行集成.
首先导包
文档中有三种方法,但因不咋熟悉Android不知道为什么用不了,就是配置gradle依赖,可自行参考omal文档
我使用的方法是aar库导入的方法,在
https://github.com/olami-developers/olami-android-client-sdk/releases
下载olami-android-client-sdk-2.4.1-bin.zip
导入aar,放在app下面的libs当中 ,没有libs可以切换到Project工作环境.
然后在build.gradle中
implementation fileTree(dir: 'libs', include: ['*.aar'])
最后进行rebuild操作即可
omal搭建环境就可以写代码了
//定义
//omal必须的参数(参考文档)
private String api_key = "d69cdb980414463893ddf65cb7f7afc5";
private String api_secret = "9ec52067a93d4191936410fdd194595b";
private String url = "https://cn.olami.ai/cloudservice/api";
private Long timestamp = new Date().getTime();
//sign 等会需要通过md5加密
private String sign = api_secret + "api=nliappkey=" + api_key + "timestamp=" + timestamp + api_secret;
private TtsPlayer mTtsPlayer;//omal语音朗读核心库
//初始化
//MyITtsPlayerListener则是自己自定义实现了ITtsPlayerListener
mTtsPlayer = new TtsPlayer(MainActivity.this, new MyITtsPlayerListener());
public class MyITtsPlayerListener implements ITtsPlayerListener {
//播放结束时的
@Override
public void onPlayEnd() {
}
//播放停止时的
@Override
public void onStop() {
}
//正在播放时的 Callback
@Override
public void onPlayingTTS(String s) {
System.out.println(s);
}
}
通过语音识别出文字后,进行内容获取使用ohttp发送给omal官方url,获得的json使用Gson解析即可,下面是发送url代码
//对话方法
private void getData(String text) {
//发送请求
OkHttpClient okHttpClient = new OkHttpClient();
//2.创建一个RequestBody,可以用add添加键值对
RequestBody requestBody = new FormBody.Builder()
.add("appkey", api_key)
.add("api_secret", api_secret)
.add("api", "nli")
.add("timestamp", String.valueOf(timestamp))
.add("sign", MD5.encrypt(sign))
.add("rq", "{'data':{'input_type':1,'text':'" + text + "'},'data_type':'stt'}")
.build();
//3.创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入
Request request = new Request.Builder().url(url).post(requestBody).build();
//4.创建一个call对象,参数就是Request请求对象
//MyCallBack在自定义的对象中进行操作
okHttpClient.newCall(request).enqueue(new MyCallBack());
}