[TOC]
## 语音唤醒
语音唤醒集成流程如下:
![](https://box.kancloud.cn/a0114603388aa2646c97990e37e97604_434x446.png)
使用示例如下所示:(*注意,启动唤醒需要关注系统录音权限,目前iOS唤醒只支持应用级唤醒。*)
~~~
#import "iflyMSC/IFlyMSC.h"
//获取唤醒单例对象
_iflyVoiceWakeuper = [IFlyVoiceWakeuper sharedInstance];
//设置唤醒协议委托
_iflyVoiceWakeuper.delegate = self;
//设置唤醒参数
//生成唤醒资源路径,唤醒资源需要定制,与唤醒词一一对应。
NSString *wordPath = [[NSBundle mainBundle] pathForResource:@"ivwres/wakeresource" ofType:@"irf"];
NSString *ivwResourcePath = [[NSString alloc] initWithFormat:@"fo|%@",wordPath];
//设置唤醒资源,并启动唤醒引擎
[[IFlySpeechUtility getUtility] setParameter:[NSString stringWithFormat: @"engine_start=ivw,ivw_res_path=%@",ivwResourcePath] forKey:[IFlyResourceUtil ENGINE_START]];
//设置唤醒门限值
//门限设置要和资源中的唤醒词个数匹配,以;分割。
//例如:0:-20,0代表第一个唤醒词 -20,代表第一个唤醒词门限
//根据下载的SDK中的说明来设置。
//0:表示第一个唤醒词,-20表示唤醒词对应的门限值;
//1:表示第二个唤醒词,-20表示唤醒词对应的门限值
[_iflyVoiceWakeuper setParameter:@"0:-20;1:-20;" 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) onError:(IFlySpeechError *)error{}
//音量变化回调
- (void) onVolumeChanged: (int)volume{}
//唤醒结果回调
-(void) onResult:(NSMutableDictionary *)resultArray{}
~~~
## 语音唤醒OneShot
oneshot是唤醒的一种扩展方式,支持唤醒+识别,唤醒+听写,唤醒+语义的组合解决方案。
此处介绍唤醒+识别模式,可以适用于唤醒词数量有限,而命令词又无法常驻运行的场景。在游戏场景下,可采用声控的方式来操控游戏。例如:定义唤醒词为阿里巴巴,定义命令词序列:“打开城门”,“发起攻击”,这样就形成若干命令序列。用户可以说:
- 阿里巴巴打开城门
- 阿里巴巴发起攻击
除了游戏外,用户可以很容易的将唤醒+识别的应用扩展到其他领域,比如家电,车载等比较适合语音的场所。
### 详细demo
唤醒+识别的代码比较复杂,限于篇幅不在本文档描述,详细过程可以参考Demo中的OneshotViewController示例代码。
Demo的示例,用户可以说 讯飞语音/讯飞语点 + 张三/李四/张海洋 的组合。
### 使用唤醒+识别步骤
![](https://box.kancloud.cn/85f3e02218da898bfc414199554b4b85_213x350.png)
### 唤醒+识别回调
~~~
//录音开始
- (void) onBeginOfSpeech{}
//录音结束
- (void) onEndOfSpeech{}
//音量回调
- (void) onVolumeChanged: (int)volume{}
//服务结束回调
- (void) onError:(IFlySpeechError *) error{}
//唤醒结果回调
- (void) onResult:(NSMutableDictionary *)resultArray {}
//会话事件回调
- (void) onEvent:(int)eventType isLast:(BOOL)isLast arg1:(int)arg1 data:(NSMutableDictionary *)eventData(){}
~~~