iOS SDK集成
一. 集成准备
1.1 获取产品ID
集成SDK之前,您首先需要到DUI控制台创建产品,获取如下的产品ID。
1.2 下载和导入SDK
从官网下载 全链路SDK并导入到您的工程中。
第一步:将下载的libddsios.a和include头文件导入到您的工程中
1)设置Header search paths 指向include头文件 TARGETS–>Build Settings–>Header Search Paths
2)设置library search paths 指向.a库 TARGETS–>Build Settings–>Library Search Paths
第二步:添加依赖库和编译器选项
1)使用cocoapod 导入使用的第三方库(或直接下载导入源码到工程中)。
# https://github.com/ZipArchive/ZipArchive pod 'SSZipArchive' # https://github.com/tonymillion/Reachability pod 'Reachability' # https://github.com/ibireme/YYCategories pod 'YYCategories'
注:如果预编译文件PrefixHeader.pch编译有问题,请将预加载的OC类加判断标识,如下:
#ifdef __OBJC__ #import <xxx/xxx.h> #endif
2)TARGETS–>Build Phases–>Link Binary With Libraries–> + -->libc++.tbd libz.tbd
3)other linker flag中添加 -ObjC $(inherited)。
4)设置Bitcode为No TARGETS–>Build Settings–>Enable Bitcode。
第三步:添加资源文件
添加dds.bundle与package资源包(将package.zip解压后放入工程并对应K_DUICORE_ZIP与K_CUSTOM_ZIP)。
第四步:设置访问录音机的权限
在info.plist文件中,设置麦克风权限、网络服务权限。
二、初始化SDK
使用以下方法来初始化SDK:
//设置音频策略 - (void)setAudioConfig{ [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionAllowBluetooth | AVAudioSessionCategoryOptionMixWithOthers error:nil]; [[AVAudioSession sharedInstance] setActive:YES error:nil]; } //初始化DDSManager //参数设置详情请见2.1的参数配置 - (void)initDDSManager{ NSMutableDictionary *paramDic = [[NSMutableDictionary alloc] init]; [paramDic setObject:@"xxx" forKey:K_PRODUCT_ID]; [paramDic setObject:@"prod" forKey:K_ALIAS_KEY]; [paramDic setObject:@"usergroup" forKey:K_USER_ID]; [paramDic setObject:@"2f0d470ac76d319fcc4a1d777bf65e08.zip" forKey:K_DUICORE_ZIP]; [paramDic setObject:@"product.zip" forKey:K_CUSTOM_ZIP]; //API Key授权 [paramDic setObject:@"profile" forKey:K_AUTH_TYPE]; [paramDic setObject:@"xxx" forKey:K_API_KEY]; [paramDic setObject:@"xxx" forKey:K_PRODUCT_KEY]; [paramDic setObject:@"xxx" forKey:K_PRODUCT_SECRET]; DDSManager *manager = [DDSManager shareInstance]; [manager startWithdelegate:self DDSConfig:paramDic]; } //授权回调 -(void)onAuthSuccess{ NSLog(@"onAuthSuccess is successed"); //使用H5 dispatch_async(dispatch_get_main_queue(), ^{ NSString *path = [[DDSManager shareInstance] getValidH5Path]; url = [[NSURL alloc] initWithString:path]; self.request = [[NSURLRequest alloc] initWithURL:url]; self.web.delegate = self; self.web.allowsInlineMediaPlayback = YES; self.web.mediaPlaybackRequiresUserAction = NO; self.web loadRequest:self.request]; }); //开唤醒 [[DDSManager shareInstance] enableWakeup]; } -(void)onAuthFailed:(int)what Error:(NSString*)error{ NSLog(@" onAuthFailed is failed"); }
注意:
在收到onAuthSuccess回调之后,才可以确定DDS初始化成功,可以正常使用DDS来完成对应的操作。
2.1 参数与配置
需要由开发者填写的配置项为:
参数名 | 取值 | 说明 | 是否必须 | 默认值 |
---|---|---|---|---|
K_PRODUCT_ID | 产品ID字符串 | 产品ID | 必须 | N/A |
K_ALIAS_KEY | prod/test/(自定义分支) | 产品分支 | 必须 | N/A |
K_USER_ID | 用户ID字符串 | 用户ID(用户唯一标识,数字、字母任意组合) | 必须 | N/A |
K_DUICORE_ZIP | 文件名字符串 | 预置在工程目录下的DUI产品配置资源包名 | 必须 | N/A |
K_CUSTOM_ZIP | 文件名字符串 | 预置在工程目录下的DUI产品配置资源包名 | 必须 | N/A |
K_DEVICE_ID | 设备ID | 用于授权认证的原始设备ID。若不填,则SDK自己收集设备ID | 非必须 | N/A |
K_AUTH_TYPE | 字符串profile | 授权类型,profile是采用API Key授权,须要输入产品对应的API Key | 必须 | N/A |
K_API_KEY | 产品的API Key字符串 | 创建产品时,获取的API Key | 必须 | |
K_PRODUCT_KEY | 产品Product Key | 用于设备注册请求签名,来源:DUI控制台-产品接入-授权管理 | 必须 | N/A |
K_PRODUCT_SECRET | 产品Product Secret | 用于设备注册请求签名,来源:DUI控制台-产品接入-授权管理 | 必须 | N/A |
注意:
• [paramDic setObject:@“xx/xxx/2f0d470ac76d319fcc4a1d777bf65e08.zip” forKey:K_DUICORE_ZIP];这行配置的使用规则:
在设置文件时可以同时设置路径,但2f0d470ac76d319fcc4a1d777bf65e08.zip和2f0d470ac76d319fcc4a1d777bf65e08.zip.md5sum必须在同一文件夹下;举例:名为duicore.zip的资源文件放置在document目录下,那么在document中必须存在duicore.zip.md5sum文件;
• [paramDic setObject:@“xx/xxx/product.zip” forKey:K_CUSTOM_ZIP];这行配置的使用规则:
在设置文件时可以同时设置路径,但product.zip和product.zip.md5sum必须在同一文件夹下;举例:名为product.zip的资源文件放置在document目录下,那么在document中必须存在product.zip.md5sum文件;
2.2 处理授权
在SDK初始化时,可以设置DDSManagerDelegate 来监听授权的情况。
SDK初始化完毕后,您可以使用 onAuthSuccess 来判断当前是否授权成功。SDK初始化完毕后,SDK会默认调用startAuth方法做一次授权。
授权操作需要连接到互联网,若因网络原因导致的授权失败,待网络恢复后,可重新调用授权接口进行授权。
授权过程中可能会有0-N次onAuthFailed的回调,直至onAuthSuccess为止。
Profile文件的错误码范围从 "070601“ – “070622”,处理流程请参考对应的描述。(iOS 详细接口指南 3.错误码描述)
startAuth
//开启授权(SDK初始化完毕后,SDK会默认调用startAuth方法做一次授权) [[DDSManager shareInstance] startAuth];
2.2.1 API Key授权
采用API Key授权,在SDK初始化时,直接将授权类型(profile)、API Key、以及产品ID传入SDK。在创建产品可获取产品ID,授权管理时获取API Key。
2.3 权限说明
SDK需要的权限有:
权限 | 用途 |
---|---|
Privacy - Microphone Usage Description | 授权访问麦克风,用于采集音频 |
App Transport Security Settings 下添加 Allow Arbitrary Loads类型Boolean,值设为 YES | 授权开启网络服务,用于访问DUI服务 |
2.4 Log开关与debug
1、SDK 日志
startWithdelegate 前添加
// 设置是否在控制台输出sdk的log信息, 默认NO(不输出log) [DDSManager setLogEnabled:YES]; // 设置是否将sdk的log信息写入文件, 默认NO(不写入) [DDSManager setLogWriteToFile:YES];
日志目录:Documents/ SDKLog.log
2、内核日志
startWithdelegate 前参数配置
[params setObject:[NSNumber numberWithInt:1] forKey:K_LOG_LEVEL]; [params setObject:@"true" forKey:@"DEBUG_MODE"];
日志目录:Documents/ duicore/ AIEVTLOG.txt
注:如果需要技术支持,请提供问题发生的时间点以及上述两个日志文件。
2.5 释放重启SDK
使用以下方法来释放重启SDK:
/*! 断开连接,释放SDK */ [[DDSManager shareInstance] stop]; //监听SDK释放完成通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stopComplete) name:@"stopComplete" object:nil]; 注意:收到这个通知后才可以重启语音库
三、功能列表
3.1 响应command
command是DUI对话过程中通信方式之一,是将控制台与客户端联系在一起的纽带。在对话过程中,你可以通过command信息的定制与响应,实现具体的业务逻辑。
详细的command编写说明,请参见客户端动作(command)编写说明
3.1.1 定制command消息
command消息形式是字符串形式,具体定制可以通过以下三种方式:
第一种方式:在您已获取的技能(包括自己在控制台创建技能或者内置技能)中可以定制command消息,首先选择技能定制,进入技能列表,再选择开发,如下图:
其次,进入开发技能界面,选择编辑,见下图:
最后,进入任务编辑页面,添加具体说法与定制相关消息(比如command消息,nativeApi消息),command消息定制见下图:
第二种方式:在创建产品-语音内核配置中,进行命令唤醒词配置可定制command消息(见快速开发指南)。
第三种方式:在SDK的命令唤醒词接口中,可以定制command消息。
3.1.2 客户端实现command消息
当您定制了command消息之后,可以使用如下的方式在您的工程中做实现。
您可以在需要的地方注册和注销CommandObserver, 同一个CommandObserver可以处理多个commands。
command
self.commandObserver = [[CommandObserver alloc] init]; self.commandObserver.delegate = self; // 注册以上三种方式定制的command消息 NSArray *commandArray = [[NSArray alloc] initWithObjects: @"start.player", @"open.window", @"open.fridge", @"open.door", nil]; [[DDSManager shareInstance] subscribe:commandArray observer:self.commandObserver]; // 注销以后就不会再响应该对象所注册的所有消息 [[DDSManager shareInstance] unSubscribe:self.commandObserver]; //响应注册的command消息 -(void)onCall:(NSString *)command data:(NSString *)data { //第一种方式:响应技能中定制的command消息start.player if([command isEqualToString:@"start.player"]){ NSLog(@"响应commmand消息 start.player is successed"); } //第二种方式:响应快捷命令唤醒词中定制的command消息open.window,open.fridge if([command isEqualToString:@"open.window"]) { NSLog(@"响应commmand消息 open.window is successed"); } if([command isEqualToString:@"open.fridge"]) { NSLog(@"响应commmand消息 open.fridge is successed"); } //第三种方式:响应SDK接口中定制的command消息open.door if([command isEqualToString:@"open.door"]) { NSLog(@"响应commmand消息 open.door is successed"); } }
3.2 响应native api
nativeApi消息形式是字符串形式,可以与UI控件配合起来使用,可以设计个性化界面。nativeApi消息可提供给您使用常见的一些控件。
3.2.1 nativeApi控件相关接口
文本控件(TextWidget)接口
TextWidget * textWidget = [[TextWidget alloc] init]; //设置文本 [textWidget setText:@"增加textWidget内容"]; //增加自定义参数的k,v对,可通过配置command参数转发给SDK(注:command和native必须在同一个任务中) [textWidget addExtra:@"自定义的key" Value:@"自定义的Value"];
图文卡片控件(ContentWidget)接口
ContentWidget * contentWidget = [[ContentWidget alloc] init]; //设置标题 [contentWidget setTitle:@"设置标题"]; //设置副标题 [contentWidget setSubTitle:@"设置副标题"]; //设置标签 [contentWidget setLabel:@"设置标签"]; //设置图片地址 [contentWidget setImageUrl:@"设置图片资源地址"]; //设置链接跳转地址 [contentWidget setLinkUrl:@"设置链接跳转地址"]; //增加自定义参数的k,v对,可通过配置command参数转发给SDK(注:command和native必须在同一个任务中) [contentWidget addExtra:@"phone" Value:@"添加自定义数据"];
列表控件(ListWidget)接口
ListWidget * listWidget = [[ListWidget alloc] init]; ContentWidget * contentWidget = [[ContentWidget alloc] init]; [contentWidget setTitle:@"设置列表第一行标题"]; [contentWidget addExtra:@"phone" Value:@"添加自定义数据"]; //添加到控件,作为列表控件第一行内容 [listWidget addContentWidget:contentWidget]; //增加自定义参数的k,v对,可通过配置command参数转发给SDK(注:command和native必须在同一个任务中) [listWidget addExtra:@"自定义的key" Value:@"自定义的Value"];
媒体控件(MediaWidget)接口
MediaWidget * mediaWidget = [[MediaWidget alloc] init]; ContentWidget * contentWidget = [[ContentWidget alloc] init]; [contentWidget setTitle:@"设置标题"]; [contentWidget addExtra:@"phone" Value:@"添加自定义数据"]; //添加到MediaWidget中 [mediaWidget addContentWidget:contentWidget]; //增加自定义参数的k,v对,可通过配置command参数转发给SDK(注:command和native必须在同一个任务中) [mediaWidget addExtra:@"自定义的key" Value:@"自定义的Value"];
内嵌网页控件(WebWidget)接口
WebWidget * webWidget = [[WebWidget alloc] init]; //设置url地址 [webWidget setUrl:@"设置url地址"]; //增加自定义参数的k,v对,可通过配置command参数转发给SDK(注:command和native必须在同一个任务中) [webWidget addExtra:@"自定义的key" Value:@"自定义的Value"];
3.2.2 定制nativeApi消息
定制nativeApi消息与第一种方式定制command消息类似,直到进入任务编辑页面,不同之处在于,nativeApi消息定制必须手动加上前缀native://,此外还应选择必要的控件形式、类型等。若您还须要额外的参数,可以通过API配置进行参数配置。具体见下图:
3.2.3 客户端实现nativeApi消息
当您在DUI平台上定制了native api之后,可以使用如下的方式在您的工程中做实现:
您可以在需要的地方注册和注销NativeApiObserver,同一个NativeApiObserver可以处理多个native api。
self.nativeApiObserver = [[NativeApiObserver alloc] init]; self.nativeApiObserver.delegate = self; // 注册您定制的nativeApi消息 NSArray *nativeApiArray = [[NSArray alloc] initWithObjects:@"sys.query.contacts", nil]; [[DDSManager shareInstance] subscribe:nativeApiArray observer:self.nativeApiObserver]; // 注销以后就不会再响应该对象索注册的所有消息 [[DDSManager shareInstance] unSubscribe:self.nativeApiObserver]; //响应注册的nativeApi消息,并调用feedbackNativeApiResult响应服务端,否则会导致native api超时 -(void)onQuery:(NSString *)nativeApi data:(NSString *)data { if([nativeApi isEqualToString:@"sys.query.contacts"]) { NSLog(@"响应nativeApi消息 sys.query.contacts is successed"); //定义列表控件,具体使用参考控件相关接口 ListWidget * listWidget = [[ListWidget alloc] init]; ContentWidget * contentWidget = [[ContentWidget alloc] init]; [contentWidget setTitle:@"设置列表第一行标题"]; [contentWidget setSubTitle:@"设置列表第一行子标题"]; [contentWidget addExtra:@"phone" Value:@"添加自定义数据"]; //添加到控件,作为列表控件第一行内容 [listWidget addContentWidget:contentWidget]; ///向DUI平台返回结果,此时控件类型取决于定制nativeApi消息时所选择的控件类型,自定义控件可以选择DuiWidget类型 [[DDSManager shareInstance] feedbackNativeApiResult:nativeApi duiWidget:listWidget]; } }
- 每个onQuery方法执行时,需要调用feedbackNativeApiResult来向DUI平台返回执行结果,表示一个native api执行结束;
- native api的执行超时时间为10s。
3.3 响应内置message消息
message消息无须您主动定制,此类消息是DUI主动发送给您的。您可以在客户端注册您所关注的消息,并且可以实现特定的业务逻辑。
3.3.1 message消息列表:
message | data | 说明 |
---|---|---|
sys.dialog.start | { reason:“wakeup.major”,//唤醒词触发对话 } | 对话开始,及开始原因:1.wakeup.major,唤醒词唤醒2.wakeup.command,快捷命令唤醒3.api.startDialog,调用startDialog接口4.api.sendText,调用sendText接口(对话Idle时)5.api.triggerIntent,调用triggerIntent接口(对话Idle时)6.api.avatarClick,调用avatarClick接口(对话Idle时)7.api.avatarPress,调用avatarPress接口(对话Idle时) |
sys.dialog.end | { reason:“normal”,//对话正常结束 skillId:“100001246” } { reason:“error”,//对话发生错误; errId:071304, errMsg:“asr null”, skillId:“trySkillId” } { reason:“interrupt”,//对话被打断。强制结束对话时出现。 skillId:“100001246” } {“reason”:"normal”}//快捷唤醒词返回结果 | 对话结束,及结束原因: 1.normal,对话正常结束 2.error,对话发生错误退出 3.interrupt,对话被打断退出 4.快捷唤醒词返回结果 |
sys.dialog.error | { errId:071304, errMsg:“asr null”, “recordId”:“f71de62c59efca802e23dac3a8b0e526” } | 对话中发生的错误 |
sys.dialog.continue | 无 | 对话恢复 |
speak.end(已废弃) | ttsId | speak播报结束 |
sys.wakeup.result | { “type”: “major”, “word”: “你好小驰”, “greeting”:“主人你好” } | 语音唤醒 |
sys.vad.begin | 无 | VAD触发 |
sys.vad.end | 无 | VAD结束 |
sys.upload.result | //失败 { “result”:false, “reqId”:“xxxx”, “errId”:71801, “errMsg”:“Network Invalid” } //成功 { “result”:true, “result”:true, } | 上传词库、设备信息的结果 |
3.3.2 客户端实现message消息
您可以在需要的地方注册和注销MessageObserver,同一个MessageObserver可以处理多个message。
您可以通过注册消息接收器来接收需要UI展示的数据,具体UI消息数据见:UI 事件及数据定义
message
self.messageObserver = [[MessageObserver alloc] init]; self.messageObserver.delegate = self; // 注册您关注的message消息 NSArray *messageArray = [[NSArray alloc] initWithObjects:@"avatar.silence", @"avatar.listening", @"avatar.understanding", @"avatar.speaking", @"sys.dialog.start", @"sys.dialog.end", @"context.input.text",nil]; [[DDSManager shareInstance] subscribe:messageArray observer:self.messageObserver]; // 注销以后就不会再响应该对象所注册的所有消息 [[DDSManager shareInstance] unSubscribe:self.messageObserver]; //响应您注册的message消息 -(void)onMessage:(NSString *)message data:(NSString*)data { if ([message isEqualToString:@"sys.dialog.start"]) { NSLog(@"对话开始了"); } if ([message isEqualToString:@"context.input.text"]) { NSLog(@"用户输入数据"); } }
3.4 开启/终止对话
您可以在任何时刻主动开启/终止对话,通过以下接口实现。(消息监听参照 1.3.1 message消息列表,开启对话有提示音)
dialog
//开启对话 [[DDSManager shareInstance] startDialog]; //停止对话 [[DDSManager shareInstance] stopDialog];
3.5 按键事件
如果您有相关的软硬件按键,您需要关注以下接口,将用户的行为反馈给SDK。但是avatarPress/avatarRelease两个接口要求产品不能开启VAD(VAD在创建产品时可配置)。
avatar
// 点击唤醒/停止识别/打断播报 操作接口 [[DDSManager shareInstance] avatarClick]; // 点击唤醒/停止识别/打断播报 操作接口 , 并附带一则欢迎语,当此次是唤醒时,播报这则欢迎语 [[DDSManager shareInstance] avatarClick:@"欢迎来到DUI世界"]; // 按下按键接口,可以说话 [[DDSManager shareInstance] avatarPress]; // 释放按键接口,停止说话 [[DDSManager shareInstance] avatarRelease];
3.6 语音播报
如果你仅仅想播报一段文本,可以通过使用以下方法来播报,但是该方法在对话时,禁止使用。
text - 播报文本
提供4个优先级播报:
priority - 优先级
- 优先级0-保留,与aios语音交互同级,仅限内部使用;
- 优先级1-正常,默认选项,同级按序播放;
- 优先级2-重要,可以打断<优先级1>,同级按序播放;
- 优先级3-紧急,可以打断<优先级1|优先级2>,同级按序播放。
ttsId - 用于追踪该次播报的id,建议使用UUID。
tts
// 请求语音播报 //此接口在新版SDK已弃用,请使用下面的新接口 //[[DDSManager shareInstance] speak:text priority:priority ttsId:ttsId]; //获取识别实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; [engine speak:text priority:priority ttsId:ttsId];
停止播报与speak接口可以配合使用,具体说明如下:
1)与speak接口一样,在对话时,禁止使用;
2)ttsId与speak接口的ttsId一致,则停止或者移除该播报;
3)ttsId为@“all”, 停止所有播报。
tts
// 停止播报 //此接口在新版SDK已弃用,请使用下面的新接口 //[[DDSManager shareInstance] shutup:ttsId]; //获取TTS实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; [engine shutup:ttsId];
3.7 内置H5
您如果使用和上传了h5资源,可以通过以下方法来获取h5资源包的index.html文件的路径用来在webview中加载。
H5
// 获取资源包中h5的index.html文件的绝对路径 [[DDSManager shareInstance] getValidH5Path];
3.8 外部录音机拾音
您如果有自己的录音机,可以通过以下方法将录音数据传给DDS。(注:注明下每次传送的数据不能超过3200字节)
external recorder
//注册 [paramDic setObject:@"external" forKey:K_RECORDER_MODE]; //发送录音数据给DDS [[DDSManager shareInstance] feedPcm:data];
3.9 外部TTS引擎
您如果使用第三方的TTS引擎,可以通过以下方法来将第三方TTS引擎注册到DDS中。
//SDK初始化时注册 实现代理方法 [paramDic setObject:@"external" forKey:K_TTS_MODE]; //须要合成的回调接口 -(void)onStart:(NSString *)type data:(NSString *)content{ NSLog(@"AITtsExNode : tts start"); } //打断播报的回调接口 -(void)onStop{ NSLog(@"AITtsExNode : tts stop"); } // 播报结束通知,第三方引擎播报完后需要调用,通知SDK已播报结束 [[DDSManager shareInstance] notifyTTSEnd];
3.10 设置场景模式
如果您期望在某些场景下让SDK保持静音,同时又可以进行对话等操作,可以在需要的时候调用下面的接口。
DDSMode
//设置为正常模式 [[DDSManager shareInstance] setDDSMode:1]; //设置为静音模式 [[DDSManager shareInstance] setDDSMode:0];
3.11 触发场景意图
如果您期望主动触发某个意图的对话,可以在需要的时候调用下面的接口。
参数说明:
1)skill 技能名称,必填。
2)task 任务名称,必填。
3)intent 意图名称,必填。
4)slots 语义槽的key-value,可选。
triggerIntent
//跳过识别和语义,直接进入指定的意图对话。即:DDS主动向用户发起一轮对话。 NSMutableDictionary *arrDic = [[NSMutableDictionary alloc] init]; [arrDic setObject:@"xxx" forKey:@"电影人"]; [arrDic setObject:@"语义槽取值" forKey:@"语义槽名称"]; [[DDSManager shareInstance] triggerIntent:@"skillx" task:@"TestNative" intent:@"xx" slots:arrDic];
3.12 更新用户词库
如果您期望更新用户的词库,使其能在技能中使用,可以在需要的时候调用下面的接口,更新结果可以通过sys.upload.result消息来获取。
返回请求ID,用于追踪sys.upload.result。
sys.upload.result 消息需要通过message订阅。
参数说明:
1)vocabName词库名称,必填。若上传的词库是sys.联系人,则会自动做分词处理。
2)contents 词条,必填。若需要上传带同义词的词条,格式如下:"[(词条取值1:同义词1,同义词2),(词条取值2:同义词1,同义词2)]"。
3)addOrDelete 新增(YES)还是删除(NO),必填。
updateVocab
//实时更新用户词库 NSMutableArray *arr = [[NSMutableArray alloc]init]; [arr addObject:@"星期日:礼拜天"]; [arr addObject:@"节假日:假期"]; [arr addObject:@"电灯:电灯泡,灯泡"]; NSString * reqId = [[DDSManager shareInstance]updateVocab:@"我的节日" contents:arr addOrDelete:YES]; //实时更新联系人词库 NSMutableArray *arr = [[NSMutableArray alloc]init]; [arr addObject:@"张三"]; [arr addObject:@"李四"]; NSString * reqId = [[DDSManager shareInstance]updateVocab:@"sys.联系人" contents:arr addOrDelete:YES];
如果您需要批量更新操作多个词库,可用如下接口。
updateVocabs
AIVocabIntent *vocab1 = [[AIVocabIntent alloc]init]; vocab1.name = @"伙伴名"; //词库名称 vocab1.contents = [@[@"张三", @"李四", @"王二", @"小芳"] mutableCopy]; //词库内容 vocab1.action = ACTION_CLEAR_AND_INSERT; //对词库的操作 AIVocabIntent *vocab2 = [[AIVocabIntent alloc]init]; vocab2.name = @"歌手名"; vocab2.contents = [@[@"小芳", @"乐乐"] mutableCopy]; vocab2.action = ACTION_CLEAR_AND_INSERT; NSString *requestId = [[DDSManager shareInstance]updateVocabs:@[vocab1, vocab2]]; NSLog(@"requestid is %@", requestId);
3.13 开启/终止识别
如果您期望仅开启识别并获取识别结果(对话中禁止使用),可以在需要的时候调用下面的接口,可在回调中获取结果。
(注:开启识别后,不能开启唤醒。 开启识别后对话结束即识别结束,若需要继续使用需重新开启)
3.13.1 开启识别
startListener
//获取识别实例 ASREngineManager *engine = [[DDSManager shareInstance] getASRInstance]; //开启识别 [engine startListening:self]; //实现识别回调 -(void) ASRBeginningOfSpeech{ NSLog(@"ASREngine 检测到用户开始说话"); } -(void) ASREndOfSpeech{ NSLog(@"ASREngine 检测到用户结束说话"); } -(void) ASRBufferReceived:(NSData *) buffer{ NSLog(@"ASREngine 用户说话的音频数据: %@", buffer); } -(void) ASRPartialResults:(NSString *) results{ NSLog(@"ASREngine 实时识别结果反馈: %@", results); } -(void) ASRFinalResults:(NSString *) results{ NSLog(@"ASREngine 最终识别结果反馈: %@", results); } -(void)ASRError:(NSString*) error{ NSLog(@"ASREngine 识别过程中发生的错误: %@", error); } -(void) ASRRmsChanged:(float)rmsdB{ NSLog(@"ASREngine 用户说话的音量分贝: %f", rmsdB); }
3.13.2 主动结束识别
stopListener
//获取识别实例 ASREngineManager *engine = [[DDSManager shareInstance] getASRInstance]; //主动结束此次识别 [engine stopListening];
3.13.3 取消本次识别
cancel
//获取识别实例 ASREngineManager *engine = [[DDSManager shareInstance] getASRInstance]; //取消此次识别 [engine cancel];
3.13.4 设置实时回传音量大小
/**
设置实时回传音量大小, 默认为NO
@param enable YES/NO YES:支持实时回传音量 NO:关闭实时回传音量
*/
enableVolume
//获取识别实例 ASREngineManager *engine = [[DDSManager shareInstance] getASRInstance]; //设置实时回传音量大小 [engine enableVolume:YES];
3.14 VAD相关设置
3.14.1 设置VAD后端停顿时间
如果您期望修改VAD后端检测的时间,可以在需要的时候调用下面的接口。
参数说明:
1)millis 后端检测时间,单位毫秒,默认500毫秒。即若VAD在用户说话时停顿超过一定的时间,则认为用户已经说完,发出sys.vad.end消息,结束录音。
setVadPauseTime
//设置VAD后端停顿时间 [[DDSManager shareInstance] setVadPauseTime:1000]; //获取VAD后端停顿时间 long pause = [[DDSManager shareInstance] getVadPauseTime]; NSLog(@"pauseTime is %ld", pause);
3.14.2 设置/获取VAD前端静音检测超时时间
/**
设置VAD前端超时时间的接口
@param mills 前端超时时间,单位为毫秒。默认值为8000毫秒。
*/
setVadTimeOut
//设置VAD前端超时时间的接口 [[[DDSManager shareInstance] getASRInstance] setVadTimeout:9000]; //获取VAD前端超时时间的接口 long timeOut = [[[DDSManager shareInstance] getASRInstance] getVadTimeout];
3.15 输入文本
如果您期望跳过识别直接输入文本进行对话,可以在需要的时候调用下面的接口。
若当前没有在对话中,则以文本作为首轮说法,新发起一轮对话请求。
若当前正在对话中,则跳过识别,直接发送文本。
参数说明:
1)text 输入的文本内容
sendText
//输入文本 [[DDSManager shareInstance] sendText:@"一加一等于几"];
3.16 TTS相关设置
发音人列表如下(仅供参考,以实际为准):
注:TTS发音人(voiceId)分为臻品、精品、标准、传统四个档次,每个档次的价格也不同。每个档次的发音人可随时在请求时切换(前提是每个档次都已购买用量且有余量)。
建议您使用臻品、精品发音人,标准和传统当前不建议使用;我们正在陆续将标准和传统的音色进行优化后重新上线。
发音人名称 | voiceId | 分类 | 性别 | SSML |
---|---|---|---|---|
臻品女声芊芊 | hqqiaf | 臻品 | 女声 | 支持 |
臻品女声楚楚 | chuxif | 臻品 | 女声 | 支持 |
臻品男声小军 | xijunmv4 | 臻品 | 男声 | 支持 |
精品男声秋木 | qiumum_0gushi | 精品 | 男声 | 支持 |
精品电台男声考拉 | kaolam_diantai | 精品 | 男声 | 支持 |
精品男声小军 | xijunma | 精品 | 男声 | 支持 |
精品男声小江 | wjianm_xsheng | 精品 | 男声 | 支持 |
精品男声季老师 | jlshimp | 精品 | 男声 | 支持 |
精品男声小睿 | tzruimp | 精品 | 男声 | 支持 |
精品男声俞老师 | yukaimp | 精品 | 男声 | 支持 |
精品风趣幽默星哥 | zxcmp | 精品 | 男声 | 支持 |
精品淡定风趣葛爷 | geyoump | 精品 | 男声 | 支持 |
精品沉稳幽默纲叔 | gdgmfp | 精品 | 男声 | 支持 |
精品英文男声brett | brettmp | 精品 | 男声 | 支持 |
精品甜美女声小静 | xjingfp | 精品 | 女声 | 支持 |
精品温柔女声小兰 | gqlanfp | 精品 | 女声 | 支持 |
精品甜美女声小咪 | xmamif | 精品 | 女声 | 支持 |
精品娱播女声麻豆 | madoufp_yubo | 精品 | 女声 | 支持 |
精品甜美女声婷婷 | xmguof | 精品 | 女声 | 支持 |
精品客服女声芳芳 | gdfanfp | 精品 | 女声 | 支持 |
精品温柔女声麻豆 | madoufp_wenrou | 精品 | 女声 | 支持 |
精品女声蓝雨 | lanyuf | 精品 | 女声 | 支持 |
精品女声小浩 | lucyfa | 精品 | 女声 | 支持 |
精品甜美女神小玲 | zhilingfp | 精品 | 女声 | 支持 |
精品女声安宁 | aningfp | 精品 | 女声 | 支持 |
精品女学生初阳 | cyangfp | 精品 | 女声 | 支持 |
精品客服女声小美 | juan1f | 精品 | 女声 | 支持 |
精品欢快女神小玲 | zhilingfp_huankuai | 精品 | 女声 | 支持 |
精品知性女声晶晶 | jjingfp | 精品 | 女声 | 支持 |
精品娱报女声璃璃 | lili1f_yubo | 精品 | 女声 | 支持 |
精品女老师风吟 | feyinfp | 精品 | 女声 | 支持 |
精品女老师行者 | xizhefp | 精品 | 女声 | 支持 |
精品客服女声小九 | xijiufp | 精品 | 女声 | 支持 |
精品清新女声零八 | linbafp_qingxin | 精品 | 女声 | 支持 |
精品上海话女声叶子 | yezi1f_csh | 精品 | 女声 | 支持 |
精品四川话女声胖胖 | ppangf_csn | 精品 | 女声 | 支持 |
精品四川话女声文卿 | wqingf_csn | 精品 | 女声 | 支持 |
精品山东话女声大瑶 | dayaof_csd | 精品 | 女声 | 支持 |
精品粤语女声晓健 | lunaif_ctn | 精品 | 女声 | 支持 |
精品粤语女声何春 | hchunf_ctn | 精品 | 女声 | 支持 |
精品河南话女声木兰 | xizhuf_cyu | 精品 | 女声 | 支持 |
精品闽南语女声清风颜 | qfyanf_cmn | 精品 | 女声 | 支持 |
精品东北话女声翠花 | xjingf_cdb | 精品 | 女声 | 支持 |
精品可爱男童连连 | lzliafp | 精品 | 男童 | 支持 |
精品男童堂堂 | tangtang_boyfp | 精品 | 男童 | 支持 |
精品男童方方 | gdfanf_natong | 精品 | 男童 | 支持 |
精品女童贝壳 | xbekef | 精品 | 女童 | 支持 |
传统可爱男童连连 | lzliaf | 传统 | 男童 | 支持 |
传统甜美女神小玲 | zhilingf | 传统 | 女声 | 支持 |
传统风趣幽默星哥 | zxcm | 传统 | 男声 | 支持 |
传统邻家女声小妮 | hyanif | 传统 | 女声 | 支持 |
传统平和女声小佚 | anonyf | 传统 | 女声 | 支持 |
传统沉稳幽默纲叔 | gdgm | 传统 | 男声 | 支持 |
传统男声小军 | xijunm | 传统 | 男声 | 支持 |
传统可爱女童然然 | qianranf | 传统 | 女童 | 支持 |
传统女童佚佚 | anonyg | 传统 | 女童 | 不支持 |
传统淡定风趣葛爷 | geyou | 传统 | 男声 | 支持 |
标准甜美女神小玲 | zhilingfa | 标准 | 女声 | 支持 |
标准电台女声璃璃 | lili1f_diantai | 标准 | 女声 | 支持 |
标准商务女声璃璃 | lili1f_shangwu | 标准 | 女声 | 支持 |
标准女老师小妖 | xiyaof_laoshi | 标准 | 女声 | 支持 |
标准女声安宁 | aningf | 标准 | 女声 | 支持 |
标准女声杨阿姨 | yaayif | 标准 | 女声 | 支持 |
标准高冷女声零八 | linbaf_gaoleng | 标准 | 女声 | 支持 |
标准女老师行者 | xizhef | 标准 | 女声 | 支持 |
标准男声考拉 | kaolam | 标准 | 男声 | 支持 |
标准故事女声小静 | xjingf_gushi | 标准 | 女声 | 支持 |
标准清新女声零八 | linbaf_qingxin | 标准 | 女声 | 支持 |
标准男童堂堂 | boy | 标准 | 男童 | 支持 |
标准女老师风吟 | feyinf | 标准 | 女声 | 支持 |
标准女声小妖 | xiyaof | 标准 | 女声 | 支持 |
标准可爱男童连连 | lzliafa | 标准 | 男童 | 支持 |
标准女声瑶瑶 | luyaof | 标准 | 女声 | 支持 |
标准鬼故事绝音 | juyinf_guigushi | 标准 | 女声 | 支持 |
标准女学生初阳 | cyangf | 标准 | 女声 | 支持 |
标准可爱女童然然 | qianranfa | 标准 | 女童 | 支持 |
标准男声秋木 | qiumum | 标准 | 男声 | 支持 |
标准男声小睿 | tzruim | 标准 | 男声 | 支持 |
标准男声小江 | wjianm | 标准 | 男声 | 支持 |
标准知性女声晶晶 | jjingf | 标准 | 女声 | 支持 |
标准清新女声小妖 | xiyaof_qingxin | 标准 | 女声 | 支持 |
标准磁性男声俞老师 | yukaim_all | 标准 | 男声 | 支持 |
标准女声朱株儿 | zzherf | 标准 | 女声 | 支持 |
标准故事女声砖砖 | zzhuaf | 标准 | 女声 | 支持 |
标准温柔女声小兰 | gqlanf | 标准 | 女声 | 支持 |
标准男声季老师 | jlshim | 标准 | 男声 | 支持 |
标准清亮女声小洁 | smjief | 标准 | 女声 | 支持 |
标准邻家女声小妮 | hyanifa | 标准 | 女声 | 支持 |
标准男童方方 | gdfanf_boy | 标准 | 男童 | 支持 |
标准清纯女声考拉 | kaolaf | 标准 | 女声 | 支持 |
标准飘逸女声小静 | xjingf | 标准 | 女声 | 支持 |
3.16.1 设置发音人
setSpeaker
//获取TTS实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; //设置播报合成音,参考上面发音人列表 [engine setSpeaker:@"zhilingf"]; /** * 设置TTS播报类型的接口 * 调用此接口则云端配置的合成音类型失效,此后的合成音类型都将由此接口来托管 * @param speaker 取值如:zhilingf, gdgm等 * @param resPath 合成资源的全路径: xxx/xxx/gdgm.bin */ [engine setSpeaker:@"xxx" withResPath:[self getResourcesFile:@"xxx/xxx.bin"]];
3.16.2 设置语速
setSpeed
//获取TTS实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; /*! 设置TTS播报语速的接口,调用此接口则云端配置的合成音语速失效,此后的合成音语速都将由此接口来托管 @param speed 语速,取值0.5-2.0,0.5语速最快,2.0语速最慢。注意:对应控制台上合成音倍率值 */ [engine setSpeed:1.0];
3.16.3 设置音量
setVolume
//获取TTS实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; /*! 设置TTS播报音量的接口,调用此接口则云端配置的合成音音量失效,此后的合成音音量都将由此接口来托管 @param volume 音量大小,取值1-100 */ [engine setVolume:50];
3.16.4 设置TTS模式
setTTSMode
//获取TTS实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; /*! 设置TTS模式 @param mode 取值0 local TTS;取值1 cloud TTS */ [engine setmode:1];
3.16.5 获取发音人
getSpeaker
//获取TTS实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; //获取播报合成音 NSString * speaker = [engine getSpeaker];
3.16.6 获取语速
getSpeed
//获取TTS实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; //获取播报语速 float speed = [engine getSpeed];
3.16.7 获取音量
getVolume
//获取TTS实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; //获取播报音量 int volume = [engine getVolume];
3.16.8 暂停播报
pausePlayer
//获取TTS实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; //暂停播报 [engine pausePlayer];
3.16.9 恢复播报
resetPlayer
//获取TTS实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; //恢复播报 [engine resetPlayer];
3.16.10 语音播报
如果你仅仅想播报一段文本,可以通过使用以下方法来播报,但是该方法在对话时,禁止使用。
text - 播报文本
提供4个优先级播报:
priority - 优先级
- 优先级0-保留,与aios语音交互同级,仅限内部使用;
- 优先级1-正常,默认选项,同级按序播放;
- 优先级2-重要,可以打断<优先级1>,同级按序播放;
- 优先级3-紧急,可以打断<优先级1|优先级2>,同级按序播放。
ttsId - 用于追踪该次播报的id,建议使用UUID。
tts
// 请求语音播报 //此接口在新版SDK已弃用,请使用下面的新接口 //[[DDSManager shareInstance] speak:text priority:priority ttsId:ttsId]; //获取识别实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; [engine speak:text priority:priority ttsId:ttsId];
3.16.11 停止语音播报
停止播报与speak接口可以配合使用,具体说明如下:
1)与speak接口一样,在对话时,禁止使用;
2)ttsId与speak接口的ttsId一致,则停止或者移除该播报;
3)ttsId为@“all”, 停止所有播报。
tts
// 停止播报 //此接口在新版SDK已弃用,请使用下面的新接口 //[[DDSManager shareInstance] shutup:ttsId]; //获取TTS实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; [engine shutup:ttsId];
3.16.12 TTS回调接口
TTSEngineManager
//获取TTS实例 TTSEngineManager * engine = [[DDSManager shareInstance] getTTSInstance]; //设置委托 [engine setTTSEngienManagerDelegate:self]; //实现TTS回调 -(void) TTSBeginning:(NSString*)ttsId{ NSLog(@"TTSEngine 开始播报: %@", ttsId); } -(void) TTSReceived:(NSData*)data{ NSLog(@"TTSEngine 收到音频,此方法会回调多次,直至data为0,音频结束: %@",data); } -(void) TTSEnd:(NSString*)ttsId status:(int)status{ NSLog(@"TTSEngine TTS播报结束, ttsid: %@ status: %d",ttsId, status); } -(void) TTSError:(NSString*) error{ NSLog(@"TTSEngine 出现错误: %@", error); }
3.16.13 设置/获取自定义TTS播报录音的接口
setCustomAudio/getCustomAudio
//设置自定义TTS播报录音的接口 NSMutableArray * array = [[NSMutableArray alloc] init]; NSMutableDictionary * mp3Dic = [[NSMutableDictionary alloc] init]; NSString * mp3Path = [self getResourcesFile:@"zaine.mp3"]; [mp3Dic setObject:@"我在,有什么可以帮你" forKey:@"name"]; [mp3Dic setObject:@"mp3" forKey:@"type"]; [mp3Dic setObject:mp3Path forKey:@"path"]; [array addObject:mp3Dic]; [[[DDSManager shareInstance] getTTSInstance] setCustomAudio:array]; //获取自定义TTS播报录音的接口 NSArray *array = [[[DDSManager shareInstance] getTTSInstance] getCustomAudio];
3.16.14 设置TTS结束后延迟时间
setPlayAfterTime
// 设置TTS结束后延迟时间,单位ms // @param afterTime 延迟时间(ms) [[[DDSManager shareInstance] getTTSInstance] setPlayAfterTime:500];
3.17 唤醒相关设置
3.17.1 开关唤醒
默认SDK加载后不会启动语音唤醒,您可以通过以下接口对需对语音唤醒进行控制:
wakeup
// 开启语音唤醒 [[DDSManager shareInstance] enableWakeup]; // 关闭语音唤醒 [[DDSManager shareInstance] disableWakeup]; // 获取唤醒词列表 [[DDSManager shareInstance] getWakeupWords];
3.17.2 更新主唤醒词
若想增加或移除主唤醒词,那么您可以调用如下接口设置主唤醒词,具体参数如下:
/*!
添加主唤醒词的接口,支持添加多个主唤醒词,调用此接口会覆盖控制台配置的主唤醒词,直到通过removeMainWakeupWord接口移除,如果移除了所有通过addMainWakeupWord接口添加的主唤醒词,则主唤醒词重置为控制台所配置的。
@param words 主唤醒词,不为nil;
@param pinyin 主唤醒词的拼音,不为nil;
@param threshold 主唤醒词的阈值,不为nil;
@param greetings 主唤醒词的欢迎语,不为nil;如果某个唤醒词不想要欢迎语,在对应的维度设为NULL。
*/
setMainWakeup
NSMutableArray * arrayWords = [[NSMutableArray alloc] init]; [arrayWords addObject:@"你好小鹏"]; [arrayWords addObject:@"你好小龙"]; NSMutableArray * arrayPinyins = [[NSMutableArray alloc] init]; [arrayPinyins addObject:@"ni hao xiao peng"]; [arrayPinyins addObject:@"ni hao xiao long"]; NSMutableArray * arrayThresholds = [[NSMutableArray alloc] init]; [arrayThresholds addObject:@"0.124"]; [arrayThresholds addObject:@"0.125"]; NSMutableArray * arrayGreetings = [[NSMutableArray alloc] init]; [arrayGreetings addObject:@[@"小鹏来了"]]; [arrayGreetings addObject:@[@"小龙来了", @"小龙在此"]]; //增加主唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] addMainWakeupWord:arrayWords pinyin:arrayPinyins threshold:arrayThresholds greetings:arrayGreetings]; //移除主唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] removeMainWakeupWord:arrayWords]; //新版支持 WakeupWord *wakeWord1 = [[WakeupWord alloc]init]; wakeWord1.word = @"你好小鹏"; wakeWord1.pinyin = @"ni hao xiao peng"; wakeWord1.threshold = @"0.124"; wakeWord1.greeting = @[@"小鹏来了"]; WakeupWord *wakeWord2 = [[WakeupWord alloc]init]; wakeWord2.word = @"你好小龙"; wakeWord2.pinyin = @"ni hao xiao long"; wakeWord2.threshold = @"0.124"; wakeWord2.greeting = @[@"小龙来了"]; //添加一个主唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] addOneMainWakeupWord:wakeWord1]; //添加多个主唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] addMainWakeupWords:@[wakeWord1,wakeWord2]]; //更新多个主唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] updateMainWakeupWords:@[wakeWord1,wakeWord2]]; //移除一个主唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] removeOneMainWakeupWord:wakeWord1]; //移除多个主唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] removeMainWakeupWords:@[wakeWord1,wakeWord2]]; //获取主唤醒词列表 NSArray *mainWakeupList = [[[DDSManager shareInstance] getDDSWakeupEngineManager] getMainWakeupWords]; //清空主唤醒词列表 [[[DDSManager shareInstance] getDDSWakeupEngineManager] clearMainWakeupWords];
3.17.3 更新副唤醒词
如果您期望为设备增加一个副唤醒词,可以在需要的时候调用下面的接口。
参数说明:
1)word 副唤醒词(必须)。若不填,则清空当前的副唤醒词。
2)pinyin 副唤醒词的拼音(可选)。若不填,则自动估算。
3)threshold 副唤醒词的阈值(可选)。若不填,则自动估算。
4)greetings 副唤醒词的欢迎语(可选)。若不填,则与主唤醒词保持一致。
//实时更新副唤醒词 NSMutableArray *arr = [[NSMutableArray alloc] init]; [arr addObject:@"小明在此"]; [arr addObject:@"来了来了"]; [[DDSManager shareInstance] updateMinorWakeupWord:@"你好小明" pinyin:@"ni hao xiao ming" threshold:@"0.127" greetings:arr]; //获取当前的副唤醒词 NSString * minWakeupWords = [[[DDSManager shareInstance] getDDSWakeupEngineManager] getMinorWakeupWord];
3.17.4 更新命令唤醒词
如果您期望在唤醒的时候执行一条指令,可以在需要的时候调用下面的接口。命令唤醒词和DUI控制台所设置的快捷唤醒词是相同的功能,且互不影响,可同时存在,根据需求来选择设置方式。
参数说明:
1)actions 命令唤醒词指令,为NSMutableArray<NSString*>数组,至少有一个元素(此类元素就是定制的command消息(例如:open.window,open.door),该消息可以分别在客户端进行注册,以及响应。
2)words 命令唤醒词, 为NSMutableArray<NSString*>数组,至少有一个元素。
3)pinyins 命令唤醒词的拼音,形如:ni hao xiao chi, 为NSMutableArray<NSString*>数组,至少有一个元素。
4)thresholds 命令唤醒词的阈值, 形如:0.120(取值范围:0-1)。为NSMutableArray<NSString*>数组,至少有一个元素。
5)greetings 命令唤醒词的欢迎语, 为NSMutableArray<NSMutableArray<NSString*>*>数组,至少有一个元素, 每维对应一个唤醒词的欢迎语。
updateCommandWakeupWord
NSMutableArray * arrayAction = [[NSMutableArray alloc] init]; [arrayAction addObject:@"open.window"]; [arrayAction addObject:@"open.door"]; NSMutableArray * arrayWords = [[NSMutableArray alloc] init]; [arrayWords addObject:@"打开窗户"]; [arrayWords addObject:@"打开门"]; NSMutableArray * arrayPinyins = [[NSMutableArray alloc] init]; [arrayPinyins addObject:@"da kai chuang hu"]; [arrayPinyins addObject:@"da kai men"]; NSMutableArray * arrayThresholds = [[NSMutableArray alloc] init]; [arrayThresholds addObject:@"0.124"]; [arrayThresholds addObject:@"0.125"]; NSMutableArray * arrayGreetings = [[NSMutableArray alloc] init]; [arrayGreetings addObject:@[@"窗户打开了", @"开了开了"]]; [arrayGreetings addObject:@[@"门打开了", @"好了好了"]]; //实时更新命令唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] updateCommandWakeupWord:arrayAction words:arrayWords pinyin:arrayPinyins threshold:arrayThresholds greetings:arrayGreetings]; //清空当前设置的命令唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] clearCommandWakeupWord]; //添加指定的命令唤醒词组 [[[DDSManager shareInstance] getDDSWakeupEngineManager] addCommandWakeupWord:arrayAction words:arrayWords pinyin:arrayPinyins threshold:arrayThresholds greetings:arrayGreetings]; //移除指定的命令唤醒词组 [[[DDSManager shareInstance] getDDSWakeupEngineManager] removeCommandWakeupWord:arrayWords];
3.17.5 更新打断唤醒词
如果您期望在唤醒的时候能同时打断语音播报,可以在需要的时候调用下面的接口。打断唤醒词暂不支持在DUI控制台设置。(说明:打断需要设备开启回声消除)
参数说明:
/*!
更新打断唤醒词的接口,这类唤醒词能打断正在播报的语音并且将唤醒词送入识别。
支持设置多个打断唤醒词,所以参数为数组,重复调用会以最新的打断唤醒词数组为准。
@param words 打断唤醒词,为NSString数组,必须。
@param pinyin 打断唤醒词的拼音, 形如:ni hao xiao chi,为NSString数组,必须。
@param threshold 打断唤醒词的阈值,形如:0.120(取值范围:0-1) 为NString数组,必须。
*/
ShortcutWakeupWord
NSMutableArray * arrayWords = [[NSMutableArray alloc] init]; [arrayWords addObject:@"小驰小驰"]; [arrayWords addObject:@"你好小驰"]; NSMutableArray * arrayPinyins = [[NSMutableArray alloc] init]; [arrayPinyins addObject:@"xiao chi xiao chi"]; [arrayPinyins addObject:@"ni hao xiao chi"]; NSMutableArray * arrayThresholds = [[NSMutableArray alloc] init]; [arrayThresholds addObject:@"0.124"]; [arrayThresholds addObject:@"0.125"]; //更新打断唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] updateShortcutWakeupWord:arrayWords pinyin:arrayPinyins threshold:arrayThresholds]; //清空打断唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] clearShortCutWakeupWord]; //添加指定的打断唤醒词组 [[[DDSManager shareInstance] getDDSWakeupEngineManager] addShortcutWakeupWord:arrayWords pinyin:arrayPinyins threshold:arrayThresholds]; //移除指定的打断唤醒词组 [[[DDSManager shareInstance] getDDSWakeupEngineManager] removeShortcutWakeupWord:arrayWords];
3.17.6 更新快速唤醒词
增加/更新/删除 一条/多条QuickStart词
QuickStart词为类似“导航去”、“我想听”等,此类唤醒词只在oneshot模式下生效,
作用为在未唤醒状态下语音输入“导航去天安门”,可直接进入对话流程。
QuickStartWords
WakeupWord *wakeWord1 = [[WakeupWord alloc]init]; //QuickStart词的汉字 wakeWord1.word = @"导航去"; //QuickStart词的拼音 wakeWord1.pinyin = @"dao hang qu"; //QuickStart词的阈值 wakeWord1.threshold = @"0.124"; WakeupWord *wakeWord2 = [[WakeupWord alloc]init]; wakeWord2.word = @"我想听"; wakeWord2.pinyin = @"wo xiang ting"; wakeWord2.threshold = @"0.124"; //添加多个快速唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] addQuickStartWords:@[wakeWord1,wakeWord2]]; //删除指定快速唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] removeOneQuickStartWord:wakeWord1]; //删除多个快速唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] removeQuickStartWords:@[wakeWord1,wakeWord2]]; //更新多个快速唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] updateQuickStartWords:@[wakeWord1,wakeWord2]]; //清除快速唤醒词 [[[DDSManager shareInstance] getDDSWakeupEngineManager] clearQuickStartWords];
3.17.7 获取当前唤醒内核的版本号
/**
获取当前唤醒库版本号
@return 唤醒库版本号
*/
getWakeupVersion
//获取当前唤醒内核的版本号 NSString *version = [[[DDSManager shareInstance] getDDSWakeupEngineManager] getWakeupVersion];
3.17.8 开启/关闭OneShot功能
/**
开启/关闭OneShot功能
*/
enableOneShot/disableOneShot
//开启OneShot功能 [[[DDSManager shareInstance]getDDSWakeupEngineManager]enableOneShot]; //关闭OneShot功能 [[[DDSManager shareInstance]getDDSWakeupEngineManager]disableOneShot];
3.18 数据上传接口
开发者调用此接口来上传一些设备的信息,这些信息可以在本地使用,也可以在对话中获取,作为对话决策的一部分。
3.18.1 更新设备、产品级配置信息
/*!
更新设备状态,产品级的配置,比如:定位信息,设备硬件状态等,在SDK中需要设置AIUpdateContextIntent对象属性。
更新结果可以通过sys.upload.result消息来获取。
@param intent 请求的AIUpdateContextIntent对象,包括contextIntentKey和contextIntentValue;
如:contextIntentKey = @“location”, contextIntentValue = @{@“city”😡“苏州市”}。
技能里通过context.system.settings.location.city即可获取到"苏州市"。
@return 请求的ID,用于追踪sys.upload.result。
*/
updateProductContext
AIUpdateContextIntent * intent = [[AIUpdateContextIntent alloc] init]; intent.contextIntentKey = @"bluetooth"; intent.contextIntentValue = @{@"state":@"disconnected"}; //更新设备信息 [[DDSManager shareInstance] updateProductContext:intent]; //获取设备信息 NSObject *obj = [[DDSManager shareInstance] getProductContext:@"bluetooth"];
3.18.2 更新技能配置信息
/*!
更新技能配置,需要设置AIUpdateContextIntent对象属性。
更新结果可以通过sys.upload.result消息来获取。
@param intent 请求的AIUpdateContextIntent对象,包括contextIntentKey、contextIntentValue、contextIntentSkillId;
如:contextIntentKey = @“music”,contextIntentValue = @{@“state”😡“closed”,contextIntentSkillId = @“100000285”;
该技能里通过context.skill.settings.music.state即可获取到"closed",其他技能则无法使用。
@return 请求的ID,用于追踪sys.upload.result。
*/
updateSkillContext
AIUpdateContextIntent * intent = [[AIUpdateContextIntent alloc] init]; intent.contextIntentKey = @"music"; intent.contextIntentValue = @{@"state":@"closed"}; intent.contextIntentSkillId = @"100000285"; //更新技能配置信息 [[DDSManager shareInstance] updateSkillContext:intent]; //获取技能配置信息 NSObject *obj = [[DDSManager shareInstance] getSkillContext:@"100000285" key:@"music" ];
3.18.3 更新热词识别接口(请求级别)
/**
更新热词识别接口(请求级别)
每次请求都会带上热词词库, 例如: [{“type”: “vocab”, “name”: “行政区”, “data”:[“黄浦区”]}]
本接口为覆盖式接口,以最新设置为准,如需要清除请求,data置为空即可。
@param phraseHints phraseHints 需要更新的热词识别列表
*/
updatePhraseHints
AIPhraseHintsIntent *intent = [[AIPhraseHintsIntent alloc] init]; //类型 intent.type = @"vocab"; //词库名称 intent.name = @"sys.联系人"; //更新的数据 intent.data = [[NSMutableArray alloc]initWithObjects:@"张三",@"李四", nil]; NSArray *phraseHints = [[NSArray alloc]initWithObjects:intent, nil]; [[DDSManager shareInstance] updatePhraseHints:phraseHints];
3.19 设置对话模式
若产品中只添加本地技能,你可以通过以下接口强制使用本地对话管理,也可通过该接口切换为云端对话管理,接口参数如下:
/*!
设置对话模式
@param mode 取值:1,本地对话管理;取值2,云端对话管理
*/
setDilaogMode
//设置本地对话管理 [[DDSManager shareInstance] setDialogMode:1]; //设置云端对话管理 [[DDSManager shareInstance] setDialogMode:2];
3.20 动态更新云端识别模型
/**
* 更新云端识别的模型名字
* 在调用完该接口后,下一次对话开始时生效,并一直用该模型,除非客户端再调用该接口设置为其他的模型
@param asrModel 云端识别的模型名字,有aihome, airobot等,
* 默认为dui控制台配置的模型资源,
* 如果填nil,则表示清除之前本地配置的模型名,之后会使用dui控制台配置的模型资源
*/
updateAsrModel/getAsrModel
//更新云端识别的模型名字 [[[DDSManager shareInstance] getASRInstance] updateAsrModel:@"aihome"]; //获取云端识别的模型名字 NSString *asrModel = [[[DDSManager shareInstance] getASRInstance] getAsrModel];
3.21 对话结果支持内容修改
此接口支持修改对话中的语音播报,修改文本展示等功能:
1.在SDK初始化授权完成后即可以接口开关,调用后打开
//开启修改结果内容的回调 [[DDSManager shareInstance] enableCustomDmTaskResult];
2.打开开关后通过回调修改回调结果来进行修改展示和修改语音播报功能。(nlg对应语音播报,display对应文本展示),下面展示今天天气怎么样的返回结果举例:
-(NSString*)onDMTaskResult:(NSString *)dmResult{ BOOL isUseDefault = YES; if (isUseDefault) { NSData *jsonData = [dmResult dataUsingEncoding:NSUTF8StringEncoding]; NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil]; dic[@"nlg"] = @"苏州天气不错"; dic[@"display"] = @"天气凉啦"; NSData *jsonData1 = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil]; NSString * str = [[NSString alloc] initWithData:jsonData1 encoding:NSUTF8StringEncoding]; return str; }else{ return dmResult; } }
四、高级配置项
4.1 录音配置项
参数名 | 取值 | 说明 | 是否必须 | 默认值 |
---|---|---|---|---|
K_RECORDER_MODE | 字符串 external/internal | 录音机模式:external(使用外置录音机,需主动调用拾音接口) internal(使用内置录音机,DDS自动录音) | 非必须 | internal |
K_AEC_MODE | 字符串 external | AEC模式: external(DDS会认为宿主设备已经完成了AEC回声消除,选择默认模组也可以支持唤醒打断 | 非必须 | N/A |
4.2 TTS配置项
参数名 | 取值 | 说明 | 是否必须 | 默认值 |
---|---|---|---|---|
K_CUSTOM_TIPS | json字符串 | 自定义错误播放的内容,如{ “71304”:“这是识别结果为空的自定义播报”, “71305”:“这是语义结果为空的自定义播报”, “71308”:“这是进入闲聊技能的自定义播报”, “713**”:"*****" } | 非必须 | 内置 |
K_TTS_MODE | 字符串 external/internal | TTS模式: external(使用外置TTS引擎,需主动注册TTS请求监听器) internal(使用内置DUI TTS引擎) | 非必须 | internal |
K_TTS_CACHE | 字符串 false/true | TTS缓存路是否开启 | 非必须 | false |
K_CACHE_COUNT | 整型 | TTS缓存音频数目 | 非必须 | 100 |
K_CUSTOM_AUDIO | json串 | 自定义音频文件,替代TTS合成,如: [{ “name”: “我在,有什么可以帮你”, “type”: “pcm”, “path”: “/var/containers/Bundle/Application/816D8F91-A7F5-4159-8BEC-D3E40123F755/ddsiosDemo.app/nhxc.pcm” }, { “name”: “开始为您播放”, “type”: “mp3”, “path”: “/var/containers/Bundle/Application/816D8F91-A7F5-4159-8BEC-D3E40123F755/ddsiosDemo.app/nhxhua.mp3” }, { “name”: “为您播放”, “type”: “wav”, “path”: “/var/containers/Bundle/Application/816D8F91-A7F5-4159-8BEC-D3E40123F755/ddsiosDemo.app/xiaole.wav” }] 其中type->音频格式(pcm/wav/mp3);name->替代合成的文本;path->音频的路径 | 非必须 | N/A |
K_ENABLE_STREAM_URL | 字符串,true|false | 针对长文本的合成优化配置项 | 非必须 | true |
4.3 识别配置项
参数名 | 取值 | 说明 | 是否必须 | 默认值 |
---|---|---|---|---|
K_VAD_TIMEOUT | 数值型字符串,毫秒 | VAD静音检测超时时间,默认8000毫秒 | 非必须 | 8000 |
K_ASR_ENABLE_PUNCTUATION | 字符串,true/false | 识别结果是否带标点符号 | 非必须 | false |
K_ASR_ROUTER | 字符串,partner/dialog | 识别路由: partner(将识别结果传递给partner,不会主动进入对话) dialog(将识别结果传递给dui,会主动进入对话) | 非必须 | dialog |
K_ASR_ENABLE_TONE | 字符串,true/false | 识别结果的拼音是否带音调 | 非必须 | false |
K_AUDIO_COMPRESS | 字符串,speex/opus/false | 是否开启音频压缩,配置为opus则使用第三方引擎接口feedOpus | 非必须 | speex |
K_ASR_TIPS | 字符串,true/false | 识别完成是否播报提示音 | 非必须 | false |
4.4 唤醒配置项
参数名 | 取值 | 说明 | 是否必须 | 默认值 |
---|---|---|---|---|
K_WAKEUP_ROUTER | 字符串,partner/dialog | 唤醒路由: partner(将唤醒结果传递给partner,不会主动进入对话) dialog(将唤醒结果传递给dui,会主动进入对话) | 非必须 | dialog |
K_ONESHOT_MIDTIME K_ONESHOT_ENDTIME | 数值型字符串,毫秒 | OneShot配置: 1.若MIDTIME=0&ENDTIME=0,唤醒后进入识别;若VAD检测超时,则直接退出对话 2.若MIDTIME=0&ENDTIME!=0,唤醒后进入识别;若ENDTIME超时,则直接退出对话 3.若MIDTIME!=0&ENDTIME=0,唤醒后进入识别;若MIDTIME超时,则播放欢迎语,继续识别 4.若MIDTIME!=0&ENDTIME!=0,唤醒后进入识别;若MIDTIME超时,则播放欢迎语,继续识别;若ENDTIME超时,则直接退出对话 | 非必须 | 500 2000 |
4.5 调试配置项
参数名 | 取值 | 说明 | 是否必须 | 默认值 |
---|---|---|---|---|
K_CACHE_PATH | 字符串 | 调试信息保存路径 | 非必须 | 沙盒目录 |
K_WAKEUP_DEBUG | 字符串true/false | 将会自动保存唤醒音频 | 非必须 | 无 |
K_VAD_DEBUG | 字符串true/false | 将会自动保存VAD音频 | 非必须 | 无 |
K_ASR_DEBUG | 字符串true/false | 将会自动保存ASR音频 | 非必须 | 无 |
K_TTS_DEBUG | 字符串true/false | 将会自动保存TTS音频 | 非必须 | 无 |
五、错误码描述
error id | 错误描述 | 原因及解决办法 |
---|---|---|
1 | 解压dds.bin失败 | 系统IO错误 |
2 | 内核执行出错 | 请检查配置是否正确,或者联系DUI客服 |
3 | 系统启动超时 | 请检查配置是否正确,或者联系DUI客服 |
4 | 存储空间不足 | 系统存储空间不足 |
5 | 内部节点异常退出 | 重启DDS SDK |
070302 | 解码失败 | 联系DUI客服 |
070303 | 未发现新的版本 | 略 |
070304 | 请先升级您的客户端(SDK) | 因为产品选择的dui内核和sdk不匹配,需要升级sdk |
070305 | 网络异常, 无法连接至服务器 | 请检查网络是否正常或者配置是否正确 |
070306 | 解码失败 | 联系DUI客服 |
070307 | 补丁安装失败 | 存储空间不够 |
070308 | 备份压缩文件不存在 | 用户手动删掉了app私有空间的文件 |
070309 | 提取压缩文件失败 | 存储空间不够 |
070310 | 未设置产品ID | 需要设置产品id |
070311 | 无效客户端版本 | 请检查配置是否正确 |
070312 | 无效用户ID | 需要设置用户id |
070313 | 无效设备ID | 设备id不正确 |
070314 | 资源地址无效 | 请检查配置是否正确 |
070315 | 无效的产品分支 | 需要设置产品分支 |
070316 | 无法找到资源 | 服务端资源生成有问题,请尝试重新发布一下,或者请提供产品id反馈给DUI客服,去后台查询根本原因 |
070317 | 资源校验失败 | 下载资源过程中资源被纂改 |
070319 | 当前产品中内核资源版本过低,请前往DUI控制台对应的产品中,选择最新的内核资源版本并重新发布产品 | 当前产品中内核资源版本过低,请前往DUI控制台对应的产品中,选择最新的内核资源版本并重新发布产品。 |
070601 | network abnormal, can not connect to auth server | 设备注册过程中无法连接到授权服务器,请检查网络是否畅通,或者productId与api key是否匹配 |
070602 | can not get valid profile | 设备注册过程无法颁发有效的profile文件,请与客服联联系 |
070603 | invalid api key | 无效的api key,请到产品授权配置页面查看api key信息是否正确,iOS平台请确认BundleId是否匹配 |
070604 | Invalid product id | 无效的产品ID,请到产品信息中查看 |
070605 | read profile file failed | 读取profile文件失败,请检查文件系统是否异常或重新进行设备注册 |
070606 | profile file is disabled | profile文件被禁用,请重新进行注册 |
070607 | profile file is expired | profile文件过期,请重新进行注册 |
070608 | profile file is illegal for this device | profile文件非法,请联系客服 |
070609 | can not save profile | 设备注册无法保存有效的profile文件,检查文件系统是否异常或者重新进行设备注册 |
070610 | profile file is illegal for this productId | productId与api key不匹配 |
070612 | dns resolve failed: no answers | DNS失败,请检查网络是否畅通 |
070613 | dns resolve failed: exceed retry count | DNS失败,请检查网络是否畅通 |
070614 | dns resolve failed: network is unreachable | DNS失败,请检查网络是否畅通 |
070615 | dns resolve timeout | DNS超时,请检查网络是否畅通 |
070616 | connect ip failed: reasons for uncertainty | 建立连接失败,请检查网络是否畅通 |
070617 | connect ip failed: network is unreachable | 建立连接失败,请检查网络是否畅通 |
070618 | connect ip timeout | 建立连接超时,请检查网络是否畅通 |
070619 | websocket handshake failed: reasons for uncertainty | websocket握手失败,请检查网络是否畅通 |
070620 | recv timeout | 接收超时,请检查网络是否畅通 |
070621 | send timeout | 发送超时,请检查网络是否畅通 |
070622 | orderly shutdown | 请检查网络是否畅通 |
071301 | TTS合成超时 | 请检查网络是否正常 |
071302 | 对话超时 | 请检查网络是否正常 |
071303 | 对话连接断开 | 请检查网络是否正常 |
071304 | 识别结果为空 | 未检测到用户说法 |
071305 | 语义结果为空 | 用户的说法没有命中产品中的非闲聊技能 |
071306 | WebAPI错误 | 调用WebAPI时发生错误 |
071307 | NativeAPI错误 | 调用NativeAPI时发生错误 |
071308 | 进入闲聊技能 | 用户的首轮说法没有命中产品中的非闲聊技能 |
071309 | 异常重试达到最大次数 | 达到了产品错误处理的最大重试次数 |
071310 | 命中退出词 | 用户说了产品的退出词 |
071311 | NativeAPI未注册 | 请检测是否注册并实现NativeAPI |
071312 | 本地识别结果置信度低 | 网络离线时本地识别结果置信度较低 |
071313 | 自定义技能响应超时 | 联系技能开发者 |
071314 | 自定义技能内部错误 | 联系技能开发者 |
071315 | 自定义技能返回为空 | 联系技能开发者 |
071316 | 当前场景下不支持这么说 | 该技能须要关闭智能调度 |
071317 | 进入兜底技能 | 用户说法进入了产品中的兜底技能 |
071318 | 进入知识型技能 | 用户说法进入了产品中的知识型技能 |
071300 | 对话服务内部错误 | 联系DUI客服 |
072101 | ASREngine VAD超时 | 超过8s未检测到人声 |
072102 | ASREngine 识别为空 | 未检测到用户说法 |
072103 | ASREngine 识别服务超时 | 请检查网络是否正常 |
072104 | ASREngine 识别过程发生错误 | 联系DUI客服 |
072201 | 唤醒词个数超过限制 | 请清除之前的唤醒词后重试 |
六、常见问题
常见问题详见FAQ文档