iOS SDK 文档
语音识别
语法识别是基于语法文件的一种命令词识别技术。离线语法基于bnf语法文件。语法文件可以参照Demo的工程所示。 注:语法识别仅提供离线版本。
使用示例如下所示:
#离线命令词识别
引擎大小:
状态 | 大小 |
---|---|
编译前静态库 | 24.5 MB |
编译后(ipa) | 8 MB |
资源大小: 5.0MB
空间大小:(不同的编译器编译后大小会有不同,请以实际为准) ipa文件大小 = 引擎编译后(8MB) +资源(5MB)= 13MB。
//设置本地识别参数,其他参数与在线方式一致
//设置引擎类型
[_iflySpeechRecognizer setParameter:@ "local" forKey:[IFlySpeechConstant ENGINE_TYPE]];
//语法类型,本地是bnf,在线识别是abnf
[_iflySpeechRecognizer setParameter:@ "bnf" forKey:[IFlyResourceUtil GRAMMARTYPE]];
//设置引擎资源文件路径,如demo中的resource/aitalk中的common.jet
NSString *aitalkResourcePath = [[NSString alloc] initWithFormat:@"fo|%@/common.jet",appPath];
[_iflySpeechRecognizer setParameter:aitalkResourcePath forKey:[IFlyResourceUtil ASR_RES_PATH]];
//启动asr识别引擎
[[IFlySpeechUtility getUtility] setParameter:@"asr" forKey:[IFlyResourceUtil ENGINE_START]];
//编译语法文件(注意grammarType参数的区别)
//读取本地bnf语法文件内容
NSString* grammarContent = [self readFile:_bnfFilePath];
//调用语法编译接口
[_iflySpeechRecognizer buildGrammarCompletionHandler:^(NSString *
grammerID, IFlySpeechError *error){
//设置grammerID
[_iFlySpeechRecognizer setParameter:grammerID forKey:[IFlySpeechConstant LOCAL_GRAMMAR]];
}grammarType:@”bnf” grammarContent:grammarContent];
//启动识别
[_iFlySpeechRecognizer startListening];
//识别IFlySpeechRecognizerDelegate协议
//本地和在线的识别返回代理是一致
//在切换在线和离线服务时还需要注意参数的重置,具体可以参照demo所示
//结果返回代理
- (void) onResults:(NSArray *) results isLast:(BOOL) isLast{}
//会话结束回调
- (void) onError:(IFlySpeechError*) error{}
//录音音量回调
- (void) onVolumeChanged: (int)volume{}
//录音开始回调
- (void) onBeginOfSpeech{}
//录音结束回调
- (void) onEndOfSpeech{}
//会话取消回调
- (void) onCancel{}
[TOC]
#第一步:获取appid
appid是第三方应用集成讯飞开放平台SDK的身份标识,SDK静态库和appid是绑定的,每款应用必须保持唯一,否则会出现10407错误码。appid在开放平台申请应用时可以获得,下载SDK后可从SDK中sample文件夹的Demo工程里找到(例如: /sample/MSCDemo/MSCDemo/Definition.h 的APPID_VALUE)
#第二步:工程配置
#添加库
将开发工具包中lib目录下的iflyMSC.framework添加到工程中。同时请将Demo中依赖的其他库也添加到工程中。 按下图示例添加 SDK 所需要的 iOS系统库:
库名称 | 添加范围 | 功能 |
---|---|---|
iflyMSC.framework | 必要 | 讯飞开放平台静态库。 |
libz.tbd | 必要 | 用于压缩、加密算法。 |
AVFoundation.framework | 必要 | 用于系统录音和播放 。 |
SystemConfiguration.framework | 系统库 | 用于系统设置。 |
Foundation.framework | 必要 | 基本库。 |
CoreTelephony.framework | 必要 | 用于电话相关操作。 |
AudioToolbox.framework | 必要 | 用于系统录音和播放。 |
UIKit.framework | 必要 | 用于界面显示。 |
CoreLocation.framework | 必要 | 用于定位。 |
Contacts.framework | 必要 | 用于联系人。 |
AddressBook.framework | 必要 | 用于联系人。 |
QuartzCore.framework | 必要 | 用于界面显示。 |
CoreGraphics.framework | 必要 | 用于界面显示。 |
libc++.tbd | 必要 | 用于支持C++。 |
注意:
- 添加iflyMSC.framework时,请检查工程BuildSetting中的framwork path的设置,如果出现找不到framework的情况,可以将path清空,在Xcode中删除framework,然后重新添加。
- iflyMSC.framework最低支持iOS 8.0。
#设置Bitcode
在Xcode 7,8默认开启了Bitcode,而Bitcode 需要工程依赖的所有类库同时支持。MSC SDK暂时还不支持Bitcode,可以先临时关闭。后续MSC SDK支持Bitcode时,会在讯飞开放平台上进行SDK版本更新,请关注。关闭此设置,只需在Targets - Build Settings 中搜索Bitcode 即可,找到相应选项,设置为NO。
#用户隐私权限配置
iOS 10发布以来,苹果为了用户信息安全,加入隐私权限设置机制,让用户来选择是否允许。 隐私权限配置可在info.plist 新增相关privacy字段,MSC SDK中需要用到的权限主要包括麦克风权限、联系人权限和地理位置权限:
<key>NSMicrophoneUsageDescription</key>
<string></string>
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationAlwaysUsageDescription</key>
<string></string>
<key>NSContactsUsageDescription</key>
<string></string>
即在Info.plist 中增加下图设置:
#第三步:初始化
初始化示例:
//Appid是应用的身份信息,具有唯一性,初始化时必须要传入Appid。
NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@", @"YourAppid"];
[IFlySpeechUtility createUtility:initString];
参数 | 说明 | 必填 |
---|---|---|
appid | 8位16进制数字字符串,应用的唯一标识,与下载的SDK一一对应。 | 是 |
usr | 保留字段,无需关注。 | 否 |
pwd | 保留字段,无需关注。 | 否 |
注意: 初始化是一个异步过程,可放在App启动时执行初始化,具体代码可以参照Demo的MSCAppDelegate.m。
#第四步:启动服务
所有的服务皆遵循如下的流程,如下图:
所有服务的API详细说明可参见:https://www.xfyun.cn/doc/mscapi/iOS/iosrecognizer.html
#语法识别结果示例:
{
"sn": 1,
"ls": true,
"bg": 0,
"ed": 0,
"ws": [
{
"bg": 0,
"cw": [
{
"sc": "70",
"gm": "0",
"w": "北京到上海"
},
{
"sc": "69",
"gm": "0",
"w": "天京到上海"
},
{
"sc": "58",
"gm": "0",
"w": "东京到上海"
}
]
}
]
}
#视频教程
视频教程,快速入门。
#常见问题
#错误码及相应解决方案查询网址
#离线命令词sdk如何下载试用?
答:文档中心---快速指引 有介绍步骤---根据步骤下载相应平台的离线命令词sdk,离线命令词SDK包有10个装机量,试用期为90天。
#离线命令词识别支持多少命令词?
答:离线识别的命令词是开发者自己定义,命令词最大长度为16个汉字,需要先构建语法,然后指定使用的语法。
语法文件开发文档请参考识别语法分享--在线语法和离线语法编写指南(http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=7595)
#是否可以连续识别?
答:离线命令词适用于说出指令执行动作的场景,不支持连续识别。