SDK集成常见问题

Q1.本地集成SDK前需要做什么准备工作?

A:无论您集成的是全链路语音技术的SDK,还是单项语音技术的SDK,在本地集成前,你都需要准备如下内容:

  1. DUI平台账号,可用于创建产品和技能,并且进行授权操作;
  2. SDK集成必需的产品ID,在控制台创建产品后生成;(我在哪里找到产品ID?)
  3. Android / iOS SDK中授权操作必需的API keys、Product key和Product Secret,API key在控制台申请授权后生成,后两个创建产品后在授权管理页面自动生成;嵌入式SDK集成中需要的授权profile文件,在控制台上申请授权后生成;
  4. 下载SDK压缩包,并将SDK导入到您本地工程。

Q2.在哪里下载SDK?

A:您可以:

  1. 前往DUI网站的下载专题页,下载您所需的SDK;
  2. 在产品版本发布后,发布版本列表选择需要测试的版本,也可以下载对应的SDK,如下图:

Q3.产品资源包有什么用,在哪里下载?

A:出于开箱即用、节省流量、产线测试等诸多考虑,您可以在自己的APP中预置具备完整功能的产品资源包,避免终端用户在第一次使用时需要花时间和流量去下载全量升级包的尴尬场面。

在控制台上发布版本后,就可以下载该版本对应的全量包:package.zip,下载入口如下图:

 

请注意:不可随意修改zip包中的内容,也不可解压后重新压缩,以防文件的md5改变导致不可恢复的错误!!!

Q4.在哪里能找到产品ID?

A:产品ID作为产品的唯一标识符,在产品开发和设备端集成过程中都具有很重要的作用。

当您在控制台上创建产品后,DUI系统会自动生成一个产品ID,您可以在产品列表页(如图一)或者产品详情页(如图二)找到产品ID。

图一:


图二:


Q5.创建产品后SDK集成提示没授权怎么办

A:SDK集成时如果提示未授权,您需要先在控制台上申请授权凭证,然后在本地集成SDK时提交该凭证。(了解授权流程

如果您接入的是全链路产品,您可以根据您产品的操作系统,参照授权说明文档(Android iOS、 嵌入式)进行授权操作;

如果您接入的是单项语音技术,您可以参照单项技术授权说明文档进行授权操作。

Q6.嵌入式设备集成SDK后,获取不到识别结果?

A:如果您的嵌入式设备按照《嵌入式SDK集成说明》完成SDK集成后,测试时发现获取不到识别结果,可能有如下原因:

  1. 传入的音频格式不对,目前嵌入式SDK 只支持:单通道,2Byte,采样率16K的音频;您可以先检查下音频格式是否正确;

  2. 音频采集方式有问题,比如单麦情况下3m距离进行录音,此时设备可能就无法识别。

如果以上两种原因都不是,您可以通过提交工单的方式联系我们,工单类型为【技术支持】。

Q7.嵌入式SDK集成测试时,返回的音频格式?

A:嵌入式SDK集成测试时,返回的音频格式如下:

通过DDS_EV_OUT_TTS返回的合成音url均为mp3格式,形如 "https://s.dui.ai/tts/v1?refText=为您播放&speed=0.800000&volume=50&speaker=zhilingf"

通过DDS_EV_OUT_MEDIA返回的是音乐,电台等资源的链接,大多数是mp3格式,用于多媒体播放列表。

Q8.嵌入式SDK如何查看设备ID,VAD资源通用吗?

A:嵌入式SDK集成时需要的设备ID即设备的MAC地址;

提供的VAD资源是通用的,即不同设备都可以用。

Q9.嵌入式设备录音过程中传入的音频大小可以改吗?

A:嵌入式设备录音过程中,通过给DDS 发送DDS_EV_IN_SPEECH start事件后,每100ms抛出一次DDS_EV_OUT_RECORD_AUDIO事件,建议在该事件中将当前所有音频传给dds,避免某些时刻DDS_EV_OUT_RECORD_AUDIO事件时,当前没有可以音频传给dds,导致整个交互时间延长。

Q10.从给嵌入式SDK送完音频到获取到合成音url地址的时间太长,为什么?

A:在集成嵌入式SDK时调用 DDS_EV_IN_SPEECH 服务进行语音事件,从语音结束时到获取到合成音url地址的时间太长,可能以下原因:

  1. 在dds的回调中,有耗时事件;
  2. 嵌入式设备的网络慢,可能是连的wifi慢或者是嵌入式设备本身的网络功能有问题;
  3. 在控制台上为产品配置了较多的说法,或为使用的技能配置了较多的说法。

您可以根据您设备的情况,确认是哪一种原因造成时间太长,从而解决问题;如果问题仍无法解决,您可以通过提交工单的方式联系我们,工单类型为【技术支持】。

Q11.获取API key 后且将IP地址加入白名单,server授权请求总数是出错?

A:如果IP地址已经加入白名单但Server授权请求一直出错,可能有如下几个原因:

  1. 请求方的IP地址和加入白名单中的IP地址不一致:为了保证安全性,在发起请求时,由云端自动识别请求端的IP地址并且将该地址同白名单中的地址进行比较;如果不相同,则授权不成功;语音合成
  2. 请求URL出错:请参照语音合成 语音识别说明文搭档,填写正确的请求URL。
如果以上原因都不是,您可以通过提交工单的方式联系我们(还没有账号的话可以先注册哦),工单类型为【技术支持】。

Q12.API key用不了,一直出070603错误?

A:关于070603授权错误的问题,您可以做如下检查:

  1. 控制台上生成的apikey和本地使用的apikey是否一致;
  2. 控制台上release debug的sha256值是否和本地的对应;
  3. gradle文件配置的signingConfigs,只针对generate生成的apk;
  4. 如果是点run运行的程序,debug的sha256要填的.android目录下的debug.keystore(此项最常见)。

如果以上原因都不是,您可以通过提交工单的方式联系我们(还没有账号的话可以先注册哦),工单类型为【技术支持】。

Q13.集成SDK后开启语音识别时,设备为什么无法调用第三方录音API?

A:无论您接入的是全链路语音技术还是语音识别单项技术(包括离线和在线在内),为了便于您快速集成,默认SDK会自动调用设备自带的录音API,占有录音资源。如果您想要调用第三方录音API,您需要在SDK集成时,关闭内置录音机,开启第三方录音机。具体操作方式见下表:

Q14.接入语音识别后,如何返回性别、年龄和情绪的识别结果?

A:接入语音识别技术后,如果您的产品是Android平台下的全链路产品,您可以参考《Android SDK集成:3.19 获取性别信息》,让SDK返回性别信息;暂不支持返回年龄和情绪的识别结果。

如果您的产品接入的是Android平台下的单项语音技术产品,或者是iOS平台下的产品(包括全链路和单项技术),您可以通过商务合作的方式获取帮助。商务合作有哪些渠道?

Q15.Android语音识别最长能识别多久?

A:目前DUI提供的语音识别单项技术识别长度取决于两个因素 :

  1. 音频不超过30分钟;
  2. 音频大小不超过7MB;

只要达到两点中的任何一个,识别就会结束。

识别SDK中识别时长默认值设置为60s,如果需要更改,可以通过MaxSpeechTimeS 来设置音频最大录音时长,详细操作见:

在线识别操作说明

离线识别操作说明

Q16.离线快捷唤醒词较多时偶尔出现部分唤醒词不识别,怎么办?

A:DUI 提供的SDK允许设置不超过128个离线快捷唤醒词,如果超过个数上限,可能会出现部分唤醒词不识别的情况,或者出现崩溃情况。

针对此种情况,如果删除部分离线快捷唤醒词后并未回复正常,您可以通过提交工单的方式联系我们,工单类型为【技术支持】。

Q17.我要把合成音从中文切换成英文,要怎么做?

A:如果您设置的合成音支持中英文模式,只要对话回复的文本是英文,那么合成音播报时自动会变成英文;

如果您设置的合成音只支持中文,那么就无法使用英文进行合成音播报。

DUI提供的合成音见:DUI合成音列表

Q18.SDK开发过程中常见的错误码?

A:您可以查阅下表,快速找到您使用的SDK对应的常见错误码:

操作系统 类型 链接
Android 全链路语音技术SDK 全链路Android错误码
  在线语音识别SDK 在线语音识别错误码
  在线语音合成SDK 在线语音合成错误码
  离线语音唤醒 离线语音唤醒错误码
iOS 全链路语音技术SDK 全链路iOS错误码
  在线语音识别SDK 在线语音识别错误码
  离线语音识别SDK 离线语音合成错误码
  在线语音合成SDK 在线语音合成错误码
  离线语音合成SDK 离线语音合成错误码
  离线语音唤醒 离线语音唤醒错误码

Q19.SDK集成时,如何对接控制台技能定制中的command?

A:在定制技能回复内容时,根据技能功能设计,可能会需要客户端/本地执行对应的操作才能完成用户指令,此时就需要配置【客户端动作】以向客户端发出对应指令。例如设备控制的技能,用户说「打开卧室窗户」,要输出指令给本地执行【打开窗户】这个操作,如下图:

在控制台上配置command后,需要SDK集成时对接定制好的command。以Android为例,具体操作如下:

1、定制【打电话】技能时,在对话回复中设置自定义:command: call?phone=15692188031&name=啦啦啦

2、如果配置都正确,测试时会返回如下格式的JSON:

{"dm":{"status":1,"widget":{"widgetName":"default","type":"text","name":"default","duiWidget":"text"},"task":"111","intentName":"自定义意图1","intentId":"5cd11d485f9f8f000d01c644","runSequence":"nlgFirst","command":{"api":"call","param":{"phone":"15692188031","name":"啦啦啦"}},"taskId":"5cd11c3add6f82000d884450","input":"打朋友电话","shouldEndSession":true},"nlu":{"res":"5cd11c3add6f82000d884450","loadtime":0,"timestamp":1557218816,"source":"dui","version":"2019.1.15.20:40:58","skillVersion":"latest","systime":4.49609375,"input":"打朋友电话","skill":"111","semantics":{"request":{"slotcount":1,"confidence":1,"task":"111","slots":[{"name":"intent","value":"自定义意图1"}]}},"skillId":"2019050700000070"},"recordId":"92c3752856764847960bc802424cb7dd","sessionId":"c56deada33294773bda370faa0aad397","contextId":"c56deada33294773bda370faa0aad397","skillId":"2019050700000070"}

其中会有 "command":{"api":"call","param":{"phone":"15692188031","name":"啦啦啦"}};此时配置是成功的。
3、然后在项目里注册该自定义技能的回调处理:

private CommandObserver commandObserver = new CommandObserver() {
@Override
public void onCall(final String command, final String data) {
if("call".equals(command)) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//todo
}
});
}
}
};
DDS.getInstance().getAgent().subscribe(new String[]{"call"}, commandObserver);

IOS环境下,响应command的操作说明详见文档IOS SDK接口详细指南

Q20.使用DDS时,如何使用内置duicore.zip并解压到sdcard中的指定目录

A:使用DDS时,先将duicore.zip放到在assets目录下, 并且配置 :

config.addConfig(DDSConfig.K_DUICORE_ZIP, "duicore.zip");// assets目录下的duicore.zip
config.addConfig(DDSConfig.K_USE_UPDATE_DUICORE, "false");// 关闭duicore的热更新
config.addConfig(DDSConfig.K_DUICORE_HOME, "/sdcard/duicore/");// 解压目录

将duicore.zip放到在sdcard目录下, 并且配置:

config.addConfig(DDSConfig.K_DUICORE_ZIP, "/sdcard/duicore.zip");// sdcard目录下的duicore.zip
config.addConfig(DDSConfig.K_USE_UPDATE_DUICORE, "false");// 关闭duicore的热更新
config.addConfig(DDSConfig.K_DUICORE_HOME, "/sdcard/duicore/");// 解压目录

Q21.使用DDS时,使用DDS时报无法打开luabin.so时要怎么解决

A:使用DDS时,如报错: dlopen failed: couldn't map "/data/data/xxx/files/dds/luaclib/android-armeabi/luabin.so" segment 2: Permission denied, 您可以采用如下解决方案:
第一步: adb shell setenforce 0
第二步: 卸载APP,然后重新安装APP

如果仍旧无法解决问题,您可以通过提交工单的方式联系我们,或者直接联系为您服务的项目经理。

Q22.单麦设备有AEC使用场景,没有适配HAL,应用层可获取到1mic+1ref的音频,需要由SDK来实现AEC功能,唤醒模块选哪个

A:单麦设备唤醒模块使用AIWakeupEngine来实现。同时根据获取音频的方式不同实现不同AEC处理模式。

(1) 由SDK来录制音频,需要全局配置SDK为ECHO录音模式,设置ECHO资源和配置参数,具体如下图。之后直接使用AIWakeupEngine来实现即可。

(2) 外部自定义feed音频进SDK,需要全局设置ECHO资源和配置参数,具体如下截图。使用时先要将1mic+1ref原始feed进EchoKernel模块,输出一路的1mic音频后在feed进AIWakeupEngine模块,具体可参考DEMO中的EchoAndLocalWakeupCustom.java文件。

Q23.多麦设备使用了前端信号处理+唤醒模块,长时间放置后出现唤不醒问题,怎么解决

A:一般出现这个问题主要原因有:

原因(1) :SDK获取的原始音频通道乱序了,导致送进内核的音频无法有效处理。

原因(2) :正常运行时内核算法模块需要较高的CPU占用,若当前应用进程优先级降低(应用不是前台Service),算法模块处理能力将下降,从而影响唤醒性能(即进程阻塞现象)。

另外进程阻塞有时也是导致原始音频乱序的直接原因(音频来不及读取,底层数据Buffer错乱)。

解决方法如下:

针对原因(1):需要排查底层和应用层的音频传输逻辑,确保不会因为应用层阻塞来不及读取而导致音频传输的错乱。

针对原因(2):您可以将SDK所运行的应用进程设置为系统级进程,同时运行于前台Service中。

Q24.应用层怎么从SDK的audio dataFlow接口单独保存唤醒音频

A:目前DUILite SDK会将不同类型的音频流从不同的接口抛出,因此取唤醒音频的方式也不尽相同,具体如下:

1、对于AILocalSignalAndWakeupEngine引擎onRawDataReceived(byte[] buffer, int size)返回多麦的原始音频流;onResultDataReceived(byte[] buffer, int size, int wakeup_type)返回Beamforming之后的单路音频流。

2、对于AIWakeupEngine引擎,当需要实现单麦回声消除(AEC)功能,使用了内部echo模块,且使用SDK来录音时,onRawDataReceived(byte[] buffer, int size)返回1mic+1ref的原始音频流;onResultDataReceived(byte[] buffer, int size)返回经过echo模块处理后的单路1mic音频流。

当需要单独的单麦唤醒功能(原始音频只包含1mic),原始音频流从onResultDataReceived(byte[] buffer, int size)接口实时抛出。

 

保存音频的策略如下:

定义一个固定音频长度的Queue,比如1200ms大小,原始或者信号处理后的音频一直往里面offer,满了就往前挤(remove队首的元素),当唤醒点(onWakeup)到来时,停止往里面塞音频,保存下来的就是唤醒音频。

根据pcm音频16k,16bit的特性,100ms单路音频3200字节大小。如果是单路音频1200ms的音频,需要申请的Queue长度为3200*12字节大小;如果是2mic+2ref的原始音频则为3200*12*4字节大小。

Q25.集成单项技术SDK并运行在framework层的应用,怎么配置mk文件

A:如果您的应用运行在framework层,且集成了单项技术(语音识别、合成、以及唤醒),您可以下载附件:Android.mk来配置MK文件。

需要注意的:

(1)如果mk文件配置好了之后,运行后报接口找不到的类似错误提示,说明生产的应用默认设置了代码混淆。由于SDK用到了.so动态库,实现了JNI接口的映射,需要keep住相应的类名和方法名。反混淆配置文件见附件:proguard-rules.pro

(2)SDK提供授权文件自定义设置路径接口,当出现某些路径不能访问时,可自定义设置路径。DUILiteSDK.setParameter(DUILiteSDK.KEY_DEVICE_PROFILE_PATH, "/sdcard/speech");//自定义设置授权文件的保存路径,需要确保该路径事先存在

目录

Q1.我本地集成SDK前需要做什么准备工作?

Q2.在哪里下载SDK?

Q3.产品资源包有什么用?在哪里下载

Q4.我在哪里找到产品ID?

Q5.创建产品后SDK集成提示没授权怎么办

Q6.嵌入式设备集成SDK后,获取不到识别结果?

Q7.嵌入式SDK集成测试时,返回的音频格式?

Q8.嵌入式SDK如何查看设备ID,VAD资源通用吗?

Q9.嵌入式设备录音过程中传入的音频大小可以改吗?

Q10.从给嵌入式SDK送完音频到获取到合成音url地址的时间太长,为什么?

Q11.获取API key 后且将IP地址加入白名单,server授权请求总数是出错?

Q12.API key用不了, 一直出070603错误?

Q13.集成SDK后,开启语音识别时设备无法调用第三方录音API,为什么?

Q14.接入语音识别后,如何返回性别、年龄和情绪的识别结果?

Q15.Android语音识别单项技术最长能识别多久?

Q16.离线快捷唤醒词较多时,偶尔出现部分唤醒词不识别,怎么处理?

Q17.我要把合成音从中文切换成英文,要怎么做?

Q18.SDK开发过程中常见的错误码?

Q19.SDK集成时,如何对接控制台技能定制中的command?

Q20.使用DDS时,如何使用内置duicore.zip并解压到sdcard中的指定目录?

Q21.使用DDS时,使用DDS时报无法打开luabin.so时要怎么解决?

Q22.单麦设备有AEC使用场景,没有适配HAL,应用层可获取到1mic+1ref的音频,需要由SDK来实现AEC功能,唤醒模块选哪个?

Q23.多麦设备使用了前端信号处理+唤醒模块,长时间放置后出现唤不醒问题,怎么解决?

Q24.应用层怎么从SDK的audio dataFlow接口单独保存唤醒音频?

Q25.集成单项技术SDK并运行在framework层的应用,怎么配置mk文件?