离线命令词识别,是基于语法规则,将与语法一致的自然语言音频转换为文本输出的技术。语法识别的结果值域只在语法文件所列出的规则里,故有很好的匹配率,另外,语法识别结果携带了结果的置信度,应用可以根据置信分数,决定这个结果是否有效。语法识别多用于要更准确结果且有限说法的语音控制,如空调的语音控制等。在使用离线语法识别时,需要设置本地语法名字(在语法文件中定义)。
离线命令词识别详细的接口介绍及说明请参考: MSC Android API 文档。
在集成过程中出现错误,请优先查询SDK&API 错误码查询。如有疑问,请提交工单进行咨询,可登录讯飞开放平台论坛与广大开发者共同学习和交流。
根据官网控制台提示,直接下载SDK,SDK中包含简易可运行的Demo。如下图所示:
下载完SDK后,解压至相应的路径。
注:使用demo测试时,需将res中除layout外资源拷贝到demo中assets相应的路径下
以Android Studio集成开发工具为例,测试时建议直接用真机进行测试。
打开Android Studio,在菜单栏File--->new--->import project当前解压sdk路径,使用离线服务能力选择导入mscV5PlusDemo,如下图所示:
导入成功之后sync编译下,编译无误可连接手机,开启手机USB开发调试模式,直接在Android Studio运行导入的mscV5PlusDemo,最后生成的apk可直接安装在对应的手机上,如下图所示:
如果编译时出现“ERROR: Plugin with id 'com.android.application' not found.”错误,请在build.gradle文件中添加以下代码。
buildscript {
repositories {
google()
jcenter()
}
dependencies {
//版本号请根据自己的gradle插件版本号自行更改
classpath 'com.android.tools.build:gradle:3.4.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
如在导入项目中还出现其他问题,可参考帖子:安卓demo常见错误排查
打开Android Studio,在菜单栏File--->new--->import module当前解压sdk路径,使用离线服务能力选择导入mscV5PlusDemo,导入成功之后sync编译下,编译无误可连接手机,开启手机USB开发调试模式,直接在Android Studio运行导入的mscV5PlusDemo,最后生成的apk可直接安装在对应的手机上。
《Android SDK目录结构一览》
将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下。如下图所示:
注:
在工程 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
初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:
// 将“12345678”替换成您申请的APPID,申请地址:https://www.ai-sip.com
// 请勿在“=”与appid之间添加任何空字符或者转义符
SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");
参数名称 | 名称 | 说明 |
---|---|---|
ENGINE_TYPE | 引擎类型 | 离线命令词识别为本地引擎。设置为:local |
RESULT_TYPE | 返回结果格式 | 主要分为三种:json,xml,plain 默认:json |
ASR_THRESHOLD | 识别门限值 | 门限值越高,则识别的成功率越低,但返回的结果与实际结果更接近 值范围:[0,100] 默认值:30 |
GRM_BUILD_PATH | 语法构建目录 | 使用离线语法时,需要构建语法并保存到本地,在构建和使用语法时,都需要设置语法的构建目录。 值范围:有效的文件夹径值(含文件名) 默认值:null |
ASR_RES_PATH | 识别资源路径 | 离线命令词识别需要使用本地资源,通过此参数设置本地资源所在的路径 值范围:有效的资源文件路径 默认值:null |
备注:以上均为SDK常用参数说明,均在setParam()方法里面设置,设置示例: mAsr.setParameter(SpeechConstant.IRESULT_TYPE, "local") ;;更多详细参数请参考:MSC Android API 文档.
本文只对构建和使用语法的 SDK 调用过程进行介绍,关于语法的规则说明,请参考语法开发指南。
在构建时,除了指定引擎为本地引擎,语法类型为BNF外,还必须指定离线资源的路径(MSC模式下,需下载使用对应的离线识别SDK),语法构建的路径——本地语法构建结果文件保存的路径:
// 设置引擎类型
mAsr.setParamter( SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL );
// 设置语法结果文件保存路径,以在本地识别时使用
mAsr.setParameter( ResourceUtil.GRM_BUILD_PATH, grmPath );
//设置识别资源路径
mAsr.setParameter( ResourceUtil.ASR_RES_PATH, asrResPath );
/* 其中 "bnf" 指定语法类型为 BNF, grammarContent 为语法内容,grammarListener 为构建结果监听器*/
ret = mAsr.buildGrammar( "bnf", grammarContent, grammarListener );
构建语法状态通过监听器 grammarListener 获取,当构建成功时,语法文件将保存到由 grmPath 指定的目录中,将在语法识别时用到(MSC 模式下)。
离线语法词典,旨在更新已构建的语法文件中某个规则里的内容,因此在更新时,需要指定识别资源路径,语法文件路径,语法列表(语法文件的语法名字)。词典的内容格式及更详细调用说明,参考MSC Android API 文档中 SpeechRecognizer 类的 updateLexicon 函数介绍。
mAsr.setParameter( SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL );
// 指定资源路径
mAsr.setParameter( ResourceUtil.ASR_RES_PATH, asrResPath );
// 指定语法路径
mAsr.setParameter( ResourceUtil.GRM_BUILD_PATH, grmPath );
// 指定语法名字
mAsr.setParameter( SpeechConstant.GRAMMAR_LIST, grammarName );
// lexiconName 为词典名字,lexiconContents 为词典内容,lexiconListener 为回调监听器
ret = mAsr.updateLexicon( lexiconName, lexiconContents, lexiconListener );
离线命令词结果返回可设置三种格式,结构如下:
json格式
=============================================================
{
"sn":1,
"ls":true,
"bg":0,
"ed":0,
"ws":[
{
"bg":0,
"cw":[
{
"id":10001,
"sc":81,
"w":"打电话给",
"gm":0
}
],
"slot":"<dialpre>"
},
{
"bg":0,
"cw":[
{
"id":65535,
"sc":100,
"w":"丁伟",
"gm":0
}
],
"slot":"<contact>"
}
],
"sc":94}
=============================================================
xml格式
=============================================================
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<nlp>
<version>1.1</version>
<rawtext>打电话给丁伟</rawtext>
<confidence>92</confidence>
<engine>local</engine>
<result>
<focus>dialpre|contact</focus>
<confidence>79|100</confidence>
<object>
<dialpre id="10001">打电话给</dialpre>
<contact id="65535">丁伟</contact>
</object>
</result>
</nlp>
=============================================================
plain格式
=============================================================
confidence=93 grammar=0 input=打电话给丁伟
=============================================================
答:Android版本SDK目前支持4.4以上版本,React-Native ,QT 等跨平台方案,目前暂不支持
答:文档中心---快速指引有介绍步骤---根据步骤下载相应平台的离线命令词sdk,离线命令词SDK包有10个装机量,试用期为90天。
答:离线识别的命令词是开发者自己定义,命令词最大长度为16个汉字,需要先构建语法,然后指定使用的语法。语法文件开发文档请参考识别语法分享--在线语法和离线语法编写指南(http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=7595)
答:离线命令词只支持中文普通话,暂不支持英文。
答:离线命令词构建语法后会生成语法文件,不能删除此文件,删除后会报错23108。
答:11212是离线资源过期,测试阶段提供10个装机量、90天的免费试用权限,过期是无法继续使用的。