# 语音唤醒 Android SDK 文档

# 1、简介

语音唤醒(VoiceWakeuper)通过辨别输入的音频中特定的词语(如“讯飞语点”),返回被命中(唤醒)结果,应用通过回调的结果,进行下一步的处理,如点亮屏幕,或与用户进行语音交互等。唤醒资源中含有一个或多个资源,只要命中其中一个,即可唤醒。需下载使用对应的语音唤醒SDK。

语音唤醒详细的接口介绍及说明请参考: MSC Android API 文档, 在集成过程中如有疑问,可登录语音云开发者论坛,查找答案或与其他开发者交流。

# 2、SDK集成指南

# 1、导入SDK

将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下。如下图所示:

注:

  1. arm版本已经逐步淘汰了,arm架构的推荐使用armeabi-v7a。
  2. 如果您需要将应用push到设备使用,请将设备cpu对应指令集的libmsc.so push到/system/lib中。

# 2、添加用户权限

在工程 AndroidManifest.xml 文件中添加如下权限

<!--连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!--读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--获取当前wifi状态 -->
<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.READ_CONTACTS"/>
<!--外存储写权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--配置权限,用来记录应用配置信息 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
<!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />

注意:如需在打包或者生成APK的时候进行混淆,请在proguard.cfg中添加如下代码:

-keep class com.iflytek.**{*;}
-keepattributes Signature

# 3、初始化

初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:

// 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn
// 请勿在“=”与appid之间添加任何空字符或者转义符
SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");

createUtility方法的第二个参数为传入的初始化参数列表,可配置的参数如下:

参数 说明 必填
appid 8位16进制数字字符串,应用的唯一标识,与下载的SDK一一对应。
usr 开发者在云平台上注册的账号。
pwd 账号对应的密码,与账号同时存在。
engine_mode 引擎模式,可选值为:msc:只使用MSC的能力;plus:只使用语记能力;auto:云端使用MSC,本地使用语记;默认取值为auto。注:使用MSC本地功能的请设置为msc。
force_login 在createUtility时会对进程名称进行检查,如果名称与应用包名不一致则不进行login操作,返回null,用以规避在子进程反复进行调用的问题。此参数设置是否强制login。默认值:false (进行检查,不强制login)。
lib_name 在createUtility时会加载动态库,此时可以传入动态库名称。例如:libmsc_xxx_1072.so(xxx为您的公司名,1072为科大讯飞sdk版本号), 默认值:msc。注:如您是预装软件,为了避免动态库冲突建议修改名称。

注意:参数需要以键值对的形式存储在字符串中传入createUtility方法,以逗号隔开,如“appid=12345678,usr=iflytekcloud,pwd=123456”。

# 3、参数说明

  • # 唤醒的参数主要有:

    • 唤醒资源路径(IVW_RES_PATH)
    • 唤醒类型(IVW_SST)
    • 唤醒门限(IVW_THRESHOLD)
    • 是否持续唤醒(KEEP_ALIVE)
    // 唤醒资源路径,需下载使用对应的语音唤醒SDK。
    mIvw.setParameter( SpeechConstant.IVW_RES_PATH, ivwResPath );
    
    // 唤醒类型
    mIvw.setParameter( SpeechConstant.IVW_SST, ivwSst );
    
    // 唤醒门限
    mIvw.setParameter( SpeechConstant.IVW_THRESHOLD, threshold );
    
    // 持续唤醒
    mIvw.setParameter( SpeechConstant.KEEP_ALIVE, keepAlive );
    
    ret = mIvw.startListening( listener );
    

    唤醒状态(结果和错误)通过 listener 的回调获取。

    ***注:**新唤醒引擎门限的推荐默认值为1450,取值范围为非负数,一般可在0-3000之间调节。

# 4、唤醒识别

唤醒类型中,有一种类型叫“唤醒识别”(oneshot),是在说唤醒词后,马上说识别命令,SDK 则在唤醒的同时,对命令进行识别,如“讯飞语点,打电话给张三”,其中,“讯飞语点”是唤醒词,“打电话给张三”是命令(语法识别中的某条规则,关于语法识别可以参考对应的章节)。从以上特点可以知道,在唤醒识别时,还需要传入在线语法ID,或本地语法路径。

// 设置业务类型为唤醒识别
mIvw.setParameter( SpeechConstant.IVW_SST,"oneshot" );

//设置识别引擎,只影响唤醒后的识别(唤醒本身只有离线类型)
mIvw.setParameter( SpeechConstant.ENGINE_TYPE, asrEngineType );

if( SpeechConstant.TYPE_CLOUD.equals(asrEngineType) ){
	//设置在线识别的语法ID
	mIvw.setParameter( SpeechConstant.CLOUD_GRAMMAR, grammarID );
}else{
    // 设置本地识别资源
	mIvw.setParameter( ResourceUtil.ASR_RES_PATH, asrResPath );
	
    // 设置语法构建路径
	mIvw.setParameter( ResourceUtil.GRM_BUILD_PATH, grmPath );
}

ret = mIvw.startListening( listener );

唤醒识别时,唤醒的状态获取不变,而识别的结果则通过回调中的事件获取。

# 5、闭环优化

闭环优化是针对开发者的唤醒资源由云端优化系统不断优化的功能。通过开发者 APP 使用场景,本地唤醒 SDK 自动挑选音频数据上传至云端,进行训练生成优化唤醒资源。开发者 APP 使用场景中,优化唤醒资源在相比原有资源在提升唤醒率及抑制误唤醒方面有良好的表现。持续优化包含两种网络模式:

  • 模式 0:关闭优化功能,禁止向服务端发送本地挑选数据;
  • 模式 1:开启优化功能,允许向服务端发送本地挑选数据;
// 设置开启优化功能
mIvw.setParameter( SpeechConstant.IVW_NET_MODE, "1" );

# 6、AIMIC唤醒

针对智能硬件,MSC SDK提供了可处理多声道音频,获取音频中有效了几路音频,同时进行唤醒的模式,我们称之为AIMIC唤醒。在这种模式下,需要使用额外的音频处理库 libaimic.so,结合智能硬件的加密模块,对多声道的原始音频处理,并在唤醒结果中,包含当前唤醒的角度等信息。

目前AIMIC唤醒为定制方案,可通过文章最后的联系方式与我们商务同事联系获取SDK。

在AIMIC唤醒中,包含以下与普通唤醒不同的参数:

  • 唤醒路数(IVW_CHANNEL_NUM)
  • 音频源(AUIOD_SOURCE)
  • ALSA录音卡号(IVW_ALSA_CARD)
  • ALSA录音采样率(IVW_ALSA_RATE)
// 如果设置 AUDIO_SOURCE 为 -3,则要求项目中包含 alsa 的SDK
// 同时需要设置与麦克风硬件一致的 录音卡号和采样率 ,默认 
// 卡号=2, 采样率=16000。更多说明,参考《MSC Reference Manual.html》相关参数。
//mIvw.setParameter( SpeechConstant.AUDIO_SOURCE, "-3" );
//mIvw.setParameter( SpeechConstant.IVW_ALSA_CARD, X ); //X为硬件实际可用的卡号
//mIvw.setParameter( SpeechConstant.IVW_ALSA_RATE, Y ); //Y为硬件实际可用的采样率

// 设置唤醒路数
mIvw.setParameter(SpeechConstant.IVW_CHANNEL_NUM, "3");

AIMIC唤醒成功后,除在 WakeuperListener 的onResult 函数返回结果后,还通过 onEvent 返回单声道 16K 可用于语音识别音频。

public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
	if( SpeechEvent.EVENT_RECORD_DATA==eventType ){
//获取用于识别的音频
	byte[] data = obj.getByteArray(SpeechEvent.KEY_EVENT_RECORD_DATA);
    }
}

# 7、唤醒结果

唤醒结果字段说明:

参数 参数解释
sst 本次业务标识:wakeup表示语音唤醒;oneshot表示唤醒+识别;
id 当前唤醒词的id
score 当前唤醒得分,只有当分数大于等于设置的门限值时才会回调唤醒结果
bos 当前唤醒音频的前端点,即当前唤醒音频在写入的总音频中的开始时间位置,单位:ms
eos 当前唤醒音频的尾端点,即当前唤醒音频在写入的总音频中的结束时间位置,单位:ms
keyword 当前唤醒词,若是中文唤醒词会自动以拼音形式显示

语音唤醒结果示例:

{
"sst":"wakeup",
"id":0,
"score":1450,
"bos":1610,
"eos":2260,
"keyword":"ding1dong1ding1dong1"
}

# 8、视频教程

视频教程

# 3、常见问题

# 目前安卓平台具体支持安卓版本

答:Android版本SDK目前支持4.4以上版本,React-Native ,QT 等跨平台方案,目前暂不支持

# 集成语音识别功能时,程序启动后没反应

答:请检查是否忘记使用SpeechUtility初始化。也可以在监听器的onError函数中打印错误信息,根据信息提示,查找错误源。

# 语音唤醒sdk如何下载试用?

答:文档中心---快速指引有介绍步骤---根据步骤下载相应平台的语音唤醒sdk,语音唤醒SDK包有10个装机量,试用期为90天。

# 语音唤醒支持什么平台?

答:语音唤醒目前支持:Android/IOS/Windows/Linux应用平台。

# 语音唤醒支持什么语言?

答:目前支持中文和英文。唤醒词设置最多支持8个,每个为4-6个汉字或不超过2个英文单词。中英文不可同时配置。

# 语音唤醒的主要功能有什么?

答:设备(手机、玩具、家电等)在休眠或锁屏状态下也能检测到用户的声音(设定的语音指令,即唤醒词),让处于休眠状态下的设备直接进入到等待指令状态,开启语音交互第一步。

# 如何购买语音唤醒?

答:登录讯飞开放平台,点击进入语音唤醒页面,点击到语音唤醒页面,可查看到详细的价格表。点击对应套餐包的“立即购买”,可进行支付购买。