唤醒功能,顾名思义,通过语音,唤醒服务,做我们想做的事情。

  • 效果图(开启应用后说讯飞语音或者讯飞语点唤醒)

  • 源码下载

地址:http://download.csdn.net/detail/q4878802/9023213

步骤

1. 创建应用,开通服务

地址:http://blog.csdn.net/q4878802/article/details/47762169

2. 下载SDK

我们要使用的是讯飞的付费功能,选择唤醒服务,点击下载以后,会提示没有购买。点击“购买服务” 

点击购买一会看到付费情况,有项目需要,就必须购买,我们写Demo,讯飞给提供了体验版的SDK,和正式版的没有功能上的区别,但是只能试用35天,装机量只有3个,唤醒词不能改,只有“讯飞语音”和“讯飞语点”两个唤醒词。 

3. 解压SDK

assets目录下是一些图片资源文件

doc目录下是一些开发文档

libs目录下是一些jar包和so库

res目录下是语音的资源文件,非常重要

sample目录下是Demo

4. 集成语音唤醒

可以按照开发文档的介绍,一步一步跟着做,实现唤醒功能

地址:http://www.xfyun.cn/doccenter/awd

我个人的习惯是看Demo,开发文档只是做一个参考,我个人感觉这样更直接,开发效率更高。

步骤

1. 将Demo导入IDE,跑起来。
2. 在手机上找到功能的入口,根据一些界面上显示的关键字,找到控件。
3. 根据控件ID,在代码找到对应功能的的代码。
4. 找到功能的核心代码以后,看看当前的方法或者类在哪里有用到,怎么用的,是如何初始化的然后集成到自己的工程里,就OK了。
5. 下载的SDK里给的一些资源不是白给的,是和你的appid对应的,你要将demo的appid换成你自己的appid,资源文件也要拷贝到的你的工程里,才能正常使用。

开发步骤

1. 添加权限

这里用到的唤醒功能不是所有的权限都用到的,具体用到了哪些权限,可以看上面的链接,用到哪写权限就加哪些权限,这个为了快速方便测试,把讯飞用到的权限都加上了。

<uses-permission android:name="android.permission.RECORD_AUDIO" />

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-permission android:name="android.permission.READ_CONTACTS" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. 初始化appid

我是将appid的初始化放在的Applicaiton下,具体可以下载源码

// 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null

// 如在Application中调用初始化,需要在Mainifest中注册该Applicaiton

// 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true"

// 参数间使用“,”分隔。

// 设置你申请的应用appid

StringBuffer param = new StringBuffer();

param.append("appid=55d33f09");

param.append(",");

param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC);

// param.append(",");

// param.append(SpeechConstant.FORCE_LOGIN + "=true");

SpeechUtility.createUtility(InitKqwSpeech.this, param.toString());
 

3. 工具类

初始化好了以后直接复制工具类就可以用了

package com.example.kqwspeechdemo.engine;

import org.json.JSONException;

import org.json.JSONObject;

import com.iflytek.cloud.SpeechConstant;

import com.iflytek.cloud.SpeechError;

import com.iflytek.cloud.SpeechUtility;

import com.iflytek.cloud.VoiceWakeuper;

import com.iflytek.cloud.WakeuperListener;

import com.iflytek.cloud.WakeuperResult;

import com.iflytek.cloud.util.ResourceUtil;

import com.iflytek.cloud.util.ResourceUtil.RESOURCE_TYPE;

import android.content.Context;

import android.os.Bundle;

import android.util.Log;

import android.widget.Toast;

/**

* 语音唤醒

*

* @author kongqw

*

*/

public abstract class KqwWake {

/**

* 唤醒的回调

*/

public abstract void kqwWake();

// Log标签

private static final String TAG = "KqwWake";

// 上下文

private Context mContext;

// 语音唤醒对象

private VoiceWakeuper mIvw;

/*

* TODO 设置门限值 : 门限值越低越容易被唤醒,需要自己反复测试,根据不同的使用场景,设置一个比较合适的唤醒门限

*/

// private final static int MAX = 60;

// private final static int MIN = -20;

private int curThresh = 40;

public KqwWake(Context context) {

mContext = context;

// 加载识唤醒地资源,resPath为本地识别资源路径

StringBuffer param = new StringBuffer();

String resPath = ResourceUtil.generateResourcePath(context, RESOURCE_TYPE.assets, "ivw/55d33f09.jet");

param.append(ResourceUtil.IVW_RES_PATH + "=" + resPath);

param.append("," + ResourceUtil.ENGINE_START + "=" + SpeechConstant.ENG_IVW);

boolean ret = SpeechUtility.getUtility().setParameter(ResourceUtil.ENGINE_START, param.toString());

if (!ret) {

Log.d(TAG, "启动本地引擎失败!");

}

// 初始化唤醒对象

mIvw = VoiceWakeuper.createWakeuper(context, null);

};

/**

* 唤醒

*/

public void wake() {

// 非空判断,防止因空指针使程序崩溃

mIvw = VoiceWakeuper.getWakeuper();

if (mIvw != null) {

// textView.setText(resultString);

// 清空参数

mIvw.setParameter(SpeechConstant.PARAMS, null);

// 唤醒门限值,根据资源携带的唤醒词个数按照“id:门限;id:门限”的格式传入

mIvw.setParameter(SpeechConstant.IVW_THRESHOLD, "0:" + curThresh);

// 设置唤醒模式

mIvw.setParameter(SpeechConstant.IVW_SST, "wakeup");

// 设置持续进行唤醒

mIvw.setParameter(SpeechConstant.KEEP_ALIVE, "1");

mIvw.startListening(mWakeuperListener);

} else {

Toast.makeText(mContext, "唤醒未初始化", Toast.LENGTH_SHORT).show();

}

}

public void stopWake() {

mIvw = VoiceWakeuper.getWakeuper();

if (mIvw != null) {

mIvw.stopListening();

} else {

Toast.makeText(mContext, "唤醒未初始化", Toast.LENGTH_SHORT).show();

}

}

String resultString = "";

private WakeuperListener mWakeuperListener = new WakeuperListener() {

@Override

public void onResult(WakeuperResult result) {

try {

String text = result.getResultString();

JSONObject object;

object = new JSONObject(text);

StringBuffer buffer = new StringBuffer();

buffer.append("【RAW】 " + text);

buffer.append("\n");

buffer.append("【操作类型】" + object.optString("sst"));

buffer.append("\n");

buffer.append("【唤醒词id】" + object.optString("id"));

buffer.append("\n");

buffer.append("【得分】" + object.optString("score"));

buffer.append("\n");

buffer.append("【前端点】" + object.optString("bos"));

buffer.append("\n");

buffer.append("【尾端点】" + object.optString("eos"));

resultString = buffer.toString();

stopWake();

kqwWake();

} catch (JSONException e) {

resultString = "结果解析出错";

e.printStackTrace();

}

}

@Override

public void onError(SpeechError error) {

Log.i(TAG, error.getPlainDescription(true));

}

@Override

public void onBeginOfSpeech() {

Log.i(TAG, "开始说话");

}

@Override

public void onEvent(int eventType, int isLast, int arg2, Bundle obj) {

}

};

}
测试类 package com.example.kqwspeechdemo; import com.example.kqwspeechdemo.engine.KqwWake; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private TextView mTvLog; private TextView mTvResult; private KqwWake kqwWake; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTvLog = (TextView) findViewById(R.id.tv_log); mTvResult = (TextView) findViewById(R.id.tv_result); kqwWake = new KqwWake(this) { @Override public void kqwWake() { Toast.makeText(MainActivity.this, "Debug:\n唤醒成功", Toast.LENGTH_SHORT).show(); // 开启唤醒 kqwWake.wake(); } }; // 开启唤醒 kqwWake.wake(); } }

页面布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.example.kqwspeechdemo.MainActivity" >

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="#FF000000"

android:gravity="center"

android:padding="10dp"

android:text="唤醒词:讯飞语音、讯飞语点"

android:textColor="#FFFFFFFF"

android:textSize="20dp" />

<View

android:layout_width="match_parent"

android:layout_height="1dp"

android:background="#FFFFFFFF" />

<TextView

android:id="@+id/tv_log"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="#FF000000"

android:gravity="center"

android:padding="10dp"

android:text="录音信息"

android:textColor="#FFFFFFFF"

android:textSize="10dp" />

<View

android:layout_width="match_parent"

android:layout_height="1dp"

android:background="#FFFFFFFF" />

<TextView

android:id="@+id/tv_result"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#FF000000"

android:padding="10dp"

android:text="返回结果"

android:textColor="#FFFFFFFF"

android:textSize="10dp" />

</LinearLayout>

注意

    1. 如果你直接用的Demo,demo用的是测试版的离线包,只有35天的试用期,而且装机量只有3个,如果大家都用,很可能是不能正常运行的
    2. 如果是参考demo自己写一个,千万不要忘记替换appid和资源文件。

讯飞语音唤醒SDK集成流程的更多相关文章

  1. Android 讯飞语音听写SDK快速接入(附空指针解决和修改对话框文字方法)

    1.账号准备工作 首先要有一个讯飞的账号啦,为后面申请APPID.APPKey等东西做准备.顺带一提:讯飞对不同认证类型用户开 放的SDK的使用次数是有不同的,详情如下图. 账号申请完成后,需要去你自 ...

  2. android 开发 讯飞语音唤醒功能

    场景:进入程序后处于语音唤醒状态,当说到某个关键词的时候打开某个子界面(如:语音识别界面) 技术要点: 1. // 设置唤醒一直保持,直到调用stopListening,传入0则完成一次唤醒后,会话立 ...

  3. iOS开发讯飞语音的集成

    1.进入官网注册账号,登陆,注册,应用. 2,下载sdk  导入系统库. 3,关闭bitcode 4,初始化讯飞语音. NSString * initString = [[NSString alloc ...

  4. 集成讯飞听写iOS sdk到unity遇到的问题:weak成员和strong成员

    在unity里集成讯飞语音听写iOS sdk的过程中,遇到一个问题,官方的demo中可以将多次onResults回调返回的结果累积拼接起来组成一个完整的结果,而我集成过来以后就不能累积了,只拿到最后一 ...

  5. 继《关于讯飞语音SDK开发学习》之打包过程中遇到小问题

    关于讯飞语音SDK开发学习 使用vs自带打包,具体怎么操作就不说了,网上关于这方面的资料挺多的.例如:winform 打包部署,VS2010程序打包操作(超详细的),关键是桌面上创建快捷方式中的&qu ...

  6. 关于讯飞语音SDK开发学习

    前奏,浑浑噩噩已经工作一年多,这一年多收获还是挺多的.逛园子应该有两年多了,工作后基本上是天天都会来园子逛逛,园子 里还是有很多牛人写了一些不错的博客,帮我解决很多问题.但是一直没写过博客,归根到底一 ...

  7. Android讯飞语音云语音听写学习

    讯飞语音云语音听写学习         这几天两个舍友都买了iPhone 6S,玩起了"Hey, Siri",我依旧对我的Nexus 5喊着"OK,Google" ...

  8. android讯飞语音开发常遇到的问题

    场景:android项目中共使用了3个语音组件:在线语音听写.离线语音合成.离线语音识别 11208:遇到这个错误,授权应用失败,先检查装机量(3台测试权限),以及appid的申请时间(35天期限), ...

  9. 关于讯飞 使用android SDK出现21001错误码的分析

    21001,没有安装语音组件1.有没有使用SpeechUtility.createUtility()设置appid2.有没有将libmsc.so放到工程中,jar包有Msc.jar.Sunflower ...

随机推荐

  1. HDU 3339 In Action【最短路+01背包】

    题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3339] In Action Time Limit: 2000/1000 MS (Java/Other ...

  2. 【BZOJ 4710】 4710: [Jsoi2011]分特产 (容斥原理)

    4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 99  Solved: 65 Description JYY 带 ...

  3. 【BZOJ 3308】 3308: 九月的咖啡店 (费用流|二分图最大权匹配)

    3308: 九月的咖啡店 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 244  Solved: 86 Description 深绘里在九份开了一家咖 ...

  4. php上传文件常见问题(基础)

    既然上一篇文章<php上传中文文件文件名乱码问题>遇到了文件上传的问题,干脆把php上传文件时经常碰到的几个问题总结一下吧,以后用到时不用再去找了. 1.先做个最简单的上传文件 <h ...

  5. April Fools Day Contest 2016 B. Scrambled

    B. Scrambled 题目连接: http://www.codeforces.com/contest/656/problem/B Description Btoh yuo adn yuor roo ...

  6. 使用牛顿迭代法和二分法求解一个数的平方根(python语言实现)

    #牛顿迭代法 def sqrt1(x): y = 1.0 while abs(y * y - x) > 1e-6: y = (y + x/y)/2 return y #使用二分法 def sqr ...

  7. VS2015启动拷贝过来的项目无法启动IIS Express

    最近将VS2015开发的项目考给同事,告知无法启动,大概分析了一下原因: 1.查看端口是否占用冲突 2.在解决方案上右键选择,清理解决方案->重建解决方案 3.以上两个方法还不生效的话,在Web ...

  8. Android 基于蓝牙的方向控制器

    最近开发了一个蓝牙控制器App,用手机远程控制小球的运动. 包含了一些基础知识:多线程使用,页面UI数据更新,按钮事件,选择项功能,蓝牙功能(蓝牙打开,蓝牙搜索,蓝牙连接,蓝牙命令发送,蓝牙命令接收) ...

  9. 原生+H5开发之:js交互【location方式】

    1. 交互方式总结 1Android与JS通过WebView互相调用方法,实际上是: Android去调用JS的代码 JS去调用Android的代码 二者沟通的桥梁是WebView 对于Android ...

  10. pytest文档10-命令行传参

    前言 命令行参数是根据命令行选项将不同的值传递给测试函数,比如平常在cmd执行"pytest --html=report.html",这里面的"--html=report ...