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());
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容