android omal+百度识别+百度语音唤醒

百度识别参考链接: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组件当中)

第一步:
① 创建平台应用
既然使用了百度语音,自然免不了要注册该平台的账号,否则凭什么让你使用,点击百度智能云进入,没有账号的可以先注册账号,注册应该就不用我讲解了吧?这里默认都有账号了,然后登录


image.png

然后左侧导航栏点击找到语音技术


image.png

然后会进入一个应用总览页面,


image.png

然后点击创建应用


image.png

image.png

立即创建


image.png

点击查看应用详情


image.png

这几个值都是等下项目中要用的,请注意,最好是复制粘贴,不要手打,上图中有一个下载SDK,点击进入下载页面,第一个就是

image.png

点击下载到本地,下载之后是一个压缩文件,解压之后先不用管它,然后在Android Studio里面创建一个项目(包名保持一致)
继续:
File → New → Import Module…
image.png

通过上面的步骤,插入一个模块进来


image.png
image.png

点击OK


image.png

点击Finish 就会在你当前的项目中加入这个模块,与app是平级的。

这里就是在加载模块中的文件了,加载完毕之后,你可以打开settings.gradle,会发现多了一个 ‘:core’,当然这是在工程中加入了这个模块。
image.png

还要在你的app里面加入这个才能使用,


image.png

找到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" />
image.png

改好之后,请注意,每个人都是不一样,你如果发现你创建的应用的配置的值和我创建的是一模一样的,你马上去百度提BUG,他们的程序员要就要下岗了~

注:
如果导入sdk中的core,导入不进去或者导入模块没有finish,可以手动复制core文件夹,粘贴到与app平级中,并在settings.gradle中添加

include ':app',':core'
image.png

OK,现在语音识别配置也完成了,接下来就是使用了。

首先是修改


image.png

布局修改的代码如下:

<?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) {...}

语音唤醒(用户通过关键词进行唤醒)

点击查看文档,下一步我们要设置“语音唤醒关键词”


image.png

点击“语音唤醒”→“概述”→方块中的链接


image.png

点击“获取唤醒词”


image.png

输入你想使用的唤醒词,进行评估,勾选你想要的唤醒次,然后点击“导出”


image.png

image.png

image.png

在core模块中 src/main/assets中的WakeUp.bin 替换成自己刚刚导出的


image.png

百度唤醒的准备工作已经完成,在百度识别的步骤中已经报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进行人机对话

注册登录欧拉蜜

image.png

找到我的应用
image.png

image.png

创建新应用
image.png

image.png

image.png

测试应用
image.png

测试成功即可进行集成.
首先导包
文档中有三种方法,但因不咋熟悉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());
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容