1.1. 语音唤醒
语音唤醒集成流程如下:
使用示例如下所示:(注意,启动唤醒需要关注系统录音权限,目前iOS唤醒只支持应用级唤醒。)
#import "iflyMSC/IFlyMSC.h"
//获取唤醒单例对象
_iflyVoiceWakeuper = [IFlyVoiceWakeuper sharedInstance];
//设置唤醒协议委托
_iflyVoiceWakeuper.delegate = self;
//设置唤醒参数
//生成唤醒资源路径并设置唤醒资源,唤醒资源需要定制,与唤醒词一一对应。
NSString *resPath = [[NSBundle mainBundle] resourcePath];
NSString *wordPath = [[NSString alloc] initWithFormat:@"%@/ivw/%@.jet",resPath,APPID_VALUE];
NSString *ivwResourcePath = [IFlyResourceUtil generateResourcePath:wordPath];
[_iflyVoiceWakeuper setParameter:ivwResourcePath forKey:@"ivw_res_path"];
//设置唤醒门限值,新唤醒引擎的默认门限制值为1450
//门限设置要和资源中的唤醒词个数匹配,以;分割。
//例如:0:1450,0代表第一个唤醒词 1450,代表第一个唤醒词门限
//根据下载的SDK中的说明来设置。
//0:表示第一个唤醒词,1450表示唤醒词对应的门限值;
//1:表示第二个唤醒词,1450表示唤醒词对应的门限值
[_iflyVoiceWakeuper setParameter:@"0:1450;1:1450;" forKey:@"ivw_threshold"];
//设置唤醒的服务类型,目前仅支持wakeup
[_iflyVoiceWakeuper setParameter:@"wakeup" forKey:@"ivw_sst"];
//设置唤醒的工作模式
//keep_alive表示一次唤醒成功后是否继续录音等待唤醒。1:表示继续;0:表示唤醒终止
[_iflyVoiceWakeuper setParameter:@"1" forKey:@"keep_alive"];
//启动唤醒
int bRet = [self.iflyVoiceWakeuper startListening];
//唤醒实现delegate
//录音开始
-(void) onBeginOfSpeech{}
//录音结束
-(void) onEndOfSpeech{}
//会话错误
-(void) onCompleted:(IFlySpeechError *)error{}
//音量变化回调
- (void) onVolumeChanged: (int)volume{}
//唤醒结果回调
-(void) onResult:(NSMutableDictionary *)resultArray{}
*注:新唤醒引擎门限的推荐默认值为1450,取值范围为非负数,一般可在0-3000之间调节。
1.2. 语音唤醒OneShot
oneshot是唤醒的一种扩展方式,支持唤醒+识别,唤醒+听写,唤醒+语义的组合解决方案。此处介绍唤醒+识别模式,可以适用于唤醒词数量有限,而命令词又无法常驻运行的场景。在游戏场景下,可采用声控的方式来操控游戏。例如:定义唤醒词为阿里巴巴,定义命令词序列:“打开城门”,“发起攻击”,这样就形成若干命令序列。用户可以说:
- 阿里巴巴打开城门
- 阿里巴巴发起攻击
除了游戏外,用户可以很容易的将唤醒+识别的应用扩展到其他领域,比如家电,车载等比较适合语音的场所。
1.2.1. 详细demo
唤醒+识别的代码比较复杂,限于篇幅不在本文档描述,详细过程可以参考Demo中的OneshotViewController示例代码。
Demo的示例,用户可以说 叮咚叮咚 + 张三/李四/张海洋 的组合。
1.2.2. 使用唤醒+识别步骤
1.2.3. 唤醒+识别回调
//录音开始
- (void) onBeginOfSpeech{}
//录音结束
- (void) onEndOfSpeech{}
//音量回调
- (void) onVolumeChanged: (int)volume{}
//服务结束回调
- (void) onCompleted:(IFlySpeechError *) error{}
//唤醒结果回调
- (void) onResult:(NSMutableDictionary *)resultArray {}
//会话事件回调
- (void) onEvent:(int)eventType isLast:(BOOL)isLast arg1:(int)arg1 data:(NSMutableDictionary *)eventData(){}
1.3. 音频流唤醒
音频流唤醒功能可以让开发者将已录制好的音频数据写入唤醒控件,最后得到唤醒结果。
//设置音频源为音频流(-1)
[self.iflyVoiceWakeuper setParameter:@"-1" forKey:@"audio_source"];
//启动识别服务
[self.iflyVoiceWakeuper startListening];
//写入音频数据
NSData *data = [NSData dataWithContentsOfFile:_pcmFilePath]; //从文件中读取音频
[self.iflyVoiceWakeuper writeAudio:data];//写入音频,让SDK判断是否唤醒。建议将音频数据分段写入。
//音频写入结束或出错时,必须调用结束唤醒接口
[self.iflyVoiceWakeuper stopListening];//音频数据写入完成,进入等待状态
1.4. 闭环优化
闭环优化是针对开发者的唤醒资源由云端优化系统不断优化的功能。通过开发者 APP 使用场景,本地唤醒 SDK 自动挑选音频数据上传至云端,进行训练生成优化唤醒资源。开发者 APP 使用场景中,优化唤醒资源在相比原有资源在提升唤醒率及抑制误唤醒方面有良好的表现。持续优化包含两种网络模式:
- 模式 0:关闭优化功能,禁止向服务端发送本地挑选数据;
- 模式 1:开启优化功能,允许向服务端发送本地挑选数据;
// 设置开启优化功能
[self.iflyVoiceWakeuper setParameter:@"1" forKey:@"ivwnet_mode"];
1.4.1. 闭环上传控制
唤醒上传控制分为本地和云端两种,且两者作用相斥,即打开了本地上传控制则云端上传控制失效。开启唤醒闭环优化功能后,SDK默认打开云端上传控制;
- 本地上传控制:开发者通过设置外部参数控制SDK每天最多上传唤醒音频条数;
- 云端上传控制:开发者通过“开放平台的闭环唤醒管理平台”设置客户端唤醒词上传权限;
// 打开本地上传控制,并设置每天最大上传唤醒音频条数;
// 不设置此参数即打开云端上传控制;
[self.iflyVoiceWakeuper setParameter:@"1000" forKey:@"ivwnet_upload_num_control"];