嵌入式 SDK集成
创建产品
DDS-Device-SDK是DUI平台针对嵌入式设备开发的对话定制服务SDK。开发者需要到DUI平台注册开发者账号,并熟悉DUI平台技能定制与产品发布。
关联阅读
注:分支号就是接口配置中的”aliasKey”。
产品ID
请记住产品ID,详见下图:
aliasKey
发布下载页面的分支号即是“aliasKey”,如下图:
deviceProfile
授权信息,每一个设备对应一个授权profile文件,产品发布之后到 “授权管理” 标签页下载,如下图:
在开发时,调用dds_start函数,需要将profile文件中的内容作为配置参数deviceProfile的值传给dds,或者通过savedProfile配置参数,将profile文件路径传给dds,dds会完成后续授权相关操作。
集成前提
音频参数:采样频率为16KHz,每个采样点2Bytes,单通道;
播放器能播放url mp3格式;
有物理按键(可选)。
dds对话状态切换
IDLE:dds初始化以后处于IDLE状态,等待事件触发;
LISTENING:侦听状态,按钮事件长按按下、语音唤醒或者VAD检测有语音时触发从IDLE切换到LISTENDING;dds会主动读取音频数据,把经过VAD处理以后的音频数据送到云端识别;按键释放或者VAD结束,切换到UNDERSTANDING;
UNDERSTANDING:语义理解对话管理状态,等待云端对话返回结果,包含:命令控制、本地接口调用、语音播报;
- reset或者session结束,则切换到IDLE;
- 按键长按按下、唤醒、播放结束或者session继续切换到LISTENING;
- session继续并且有语音播放,保持UNDERSTANDING状态。
消息格式
dds接口之间通过Message Pack格式交互数据,协议说明详见:http://msgpack.org/;
格式为:message type + payload;其中payload是key,value格式;key是字符串,value可以为:int, double, boolean, string, bin类型,其中bin类型是二进制数据。
消息接口
struct dds_msg; /* 消息创建与释放 */ struct dds_msg *dds_msg_new(); int dds_msg_delete(struct dds_msg *msg); /* 消息封装接口 */
/* 注意,以下接口中char *key, char *value这两个参数不能为NULL */ int dds_msg_set_type(struct dds_msgt *msg, int type); int dds_msg_set_integer(struct dds_msg *msg, char *key, int value); int dds_msg_set_double(struct dds_msg *msg, char *key, double value); int dds_msg_set_boolean(struct dds_msg *msg, char *key, int value); int dds_msg_set_string(struct dds_msg *msg, char *key, char *value); int dds_msg_set_bin(struct dds_msg *msg, char *key, char *value, int value_len);
int dds_msg_set_bin_p(struct dds_msg *msg, char *key, char *value, int value_len);/*该接口保存二进制数据的指针,不复制具体的数据内容,适用于内存较小的场景*/ /* 消息解析接口 */ int dds_msg_get_type(struct dds_msgt *msg, int *type); int dds_msg_get_integer(struct dds_msg *msg, char *key, int *value); int dds_msg_get_double(struct dds_msg *msg, char *key, double *value); int dds_msg_get_boolean(struct dds_msg *msg, char *key, int *value); int dds_msg_get_string(struct dds_msg *msg, char *key, char **value); int dds_msg_get_bin(struct dds_msg *msg, char *key, char **value, int *value_len);
int dds_msg_get_bin_p(struct dds_msg *msg, char *key, char **value, int *value_len); /* 消息调试接口 */ void dds_msg_print(struct dds_msg *msg);
消息类型
DDS_EV_OUT_RECORD_AUDIO
说明
录音事件,该接口dds每100ms调用一次,主动向开发者索要音频数据,若开发者采用该方式送数据,则在回调中用DDS_EV_IN_AUDIO_STREAM消息,将录音传递给dds。
message type
DDS_EV_OUT_RECORD_AUDIO
payload
无
DDS_EV_OUT_NATIVE_CALL
说明
本地调用,dds服务端查询本地数据, 结果数据在回调中通过DDS_EV_IN_NATIVE_RESPONSE消息返回给dui服务。开发者在定制平台,定制任务的资源来源接口,即payload中的”api”详见下图示例:
参数以json字符串返回给开户端,即paload中的”param”,点击API配置,在如下页面配置参数:
message type
DDS_EV_OUT_NATIVE_CALL
payload
key | value | 说明 |
---|---|---|
api | string | 如上述示例中为:"resp/native/call" |
param | json string |
如上述示例中为: { “intentName”: "自定义意图1", “widgetType”: "text", “test”: “test-val” } |
DDS_EV_OUT_COMMAND
说明
控制命令,开发者在DUI平台定制的控制命令,详见下图:
参数以json字符串返回。
message type
payload
key | value type | 说明 |
---|---|---|
api | string | 上述示例为:"volume/up" |
param | json string |
如果用户说,音量调到十,上述示例返回的参数为: { “value”: 10 } |
DDS_EV_OUT_MEDIA
说明
多媒体播放列表。
message type
payload
key | value type | 说明 |
---|---|---|
list | json array string |
播放列表是json数组字符串,如: [ { "linkUrl":"http://cdndown.dorylist.com/uploads/ogg/2013/05/09/4448.ogg", "title":"新上海滩 ", "extra": { "resType":"ogg" }, "subTitle":"叶丽仪", "imageUrl":"", "label":"其 它" }, { "linkUrl":"http://cdndown.dorylist.com/uploads/ogg/2017/04/18/033828787.ogg", "title":"The Moment", "extra": { "resType":"ogg" }, "subTitle":"Kenny G", "imageUrl":"", "label":"其 它" } ] |
DDS_EV_OUT_STATUS
说明
dds状态:“idle”,“listening”,“understanding”,详见上述状态切换。
message type
DDS_EV_OUT_STATUS
payload
key | value type | 说明 |
---|---|---|
status | string | dds状态,取值有:“idle”,“listening”,“understanding” |
trigger | string |
idle状态有该字段,表明触发的原因 "reset":开发者调用reset强制将状态切换到idle "disconnect":长连接维持的2分钟内无操作,断开连接 |
DDS_EV_OUT_TTS
说明
语音合成音频url地址,一般为mp3格式。
message type
DDS_EV_OUT_TTS
payload
key | value type | 说明 |
---|---|---|
speakUrl |
string | 合成音url地址,如: "http://tts.dui.ai/runtime/v1/cache0f91269784b3bcb9401e6854011e04f4e4f1b3ce" |
source | string | 产生合成的原因,"dui":dui对话返回,"external":开发者自定义合成文本,生成的合成音 |
nlg | string | 合成音的文本,可选 |
DDS_EV_OUT_ASR_RESULT
说明
实时识别结果。
message type
DDS_EV_OUT_ASR_RESULT
payload
key | value type | 说明 |
---|---|---|
var |
string | 识别中间结果,如:“你好” |
text | string | 识别的最终结果 |
pinyin | string | 合成音的文本,拼音 |
DDS_EV_OUT_ERROR
说明
dds异常。
message type
payload
key | value type | 说明 |
---|---|---|
error | string | 异常提示信息 |
errorId | int |
错误码,错误码的定义如下: DDS_ERROR_FATAL 1001 |
source | string | 错误是在哪个连接上产生的,tts表示请求自定义合成报错 |
DDS_EV_OUT_DUI_RESPONSE
说明
DUI服务返回的完整结果。
message type
DDS_EV_OUT_DUI_RESPONSE
payload
key | value type | 说明 | |
---|---|---|---|
response | json string |
DUI服务返回结果,结果中主要字段含义如下:
|
DDS_EV_OUT_DUI_LOGIN
说明
该事件表示授权完成,可以进行交互了。
DDS_EV_OUT_CINFO_RESULT
说明
cinfo的操作,执行结果。
message type
DDS_EV_OUT_CINFO_RESULT
payload
key | value type | 说明 |
---|---|---|
operation | string | 返回结果对应的操作类型,get/set |
result | string | cinfo的执行情况,success/failed |
cinfo | json string |
get操作的返回结果,比如: cinfo tts返回结果:{"result":{"sampleRate":8000,"speed":1,"volume":80,"voiceId":"zhilingf","audioType":"mp3"}} cinfo 词库返回结果:{"result":{"type":"vocab","data":["苏州","南京"]}} |
DDS_EV_OUT_PRODUCT_CONFIG_RESULT
说明
获取到的dui平台上的产品配置,目前只抛出了tts配置信息。
message type
DDS_EV_OUT_PRODUCT_CONFIG_RESULT
payload
key | value type | 说明 |
---|---|---|
result | string | 产品配置获取结果,success/failed |
tts | json string |
tts配置: tts: { |
DDS_EV_OUT_WEB_CONNECT
说明
和DUI平台tcp连接状态。
message type
DDS_EV_OUT_WEB_CONNECT
payload
key | value | 说明 |
---|---|---|
result | string | connected/disconnected |
DDS_EV_IN_SPEECH
说明
语音事件输入,包含:语音开始,语音结束,值分别为:“start”,"end"。
message type
key | value type | 说明 |
---|---|---|
action | string |
语音事件,其值分别为: "start":语音开始; "end":语音结束; |
asrParams | json string |
识别的配置参数,在start的时候传入 { |
DDS_EV_IN_WAKEUP
说明
唤醒事件,该事件会触发dds读取音频,内部使用VAD(默认给出的库,不包含该功能;如果需要唤醒、vad等功能,推荐配合duilite sdk使用)。
message type
payload
无
DDS_EV_IN_NATIVE_RESPONSE
说明
本地调用返回结果, 在DDS_EV_OUT_NATIVE_CALL回调中使用该消息。
message type
DDS_EV_IN_NATIVE_RESPONSE
payload
支持两种数据输入:
1. key-value的形式逐个输入,value只支持string格式,示例代码如下
struct dds_msg *msg = dds_msg_new();
dds_msg_set_type(retmsg, DDS_EV_IN_NATIVE_RESPONSE);
dds_msg_set_string(msg, "key1", "value1");
dds_msg_set_string(msg, "key2", "value2");
dds_send(msg); /* 把消息发送给服务端 */
dds_msg_delete();
2. json格式一次输入
struct dds_msg *msg = dds_msg_new();
dds_msg_set_type(msg, DDS_EV_IN_NATIVE_RESPONSE);
dds_msg_set_string(msg, "json", "{\"text\": \"查到你要的内容\"}");
dds_send(msg);
dds_msg_delete(msg);
DDS_EV_IN_RESET
说明
重置对话,该接口阻塞实现。
message type
key | value type | 说明 |
---|---|---|
keepConnection | boolean |
是否在reset的时候保持连接 1 true 0 false |
DDS_EV_IN_EXIT
说明
退出dds。
message type
无
DDS_EV_IN_CUSTOM_TTS_TEXT
说明
合成接口,开发者可以自定义需要合成的文本,该接口在0.2.9之后的版本实现。
message type
DDS_EV_IN_CUSTOM_TTS_TEXT
payload
key | value type | 说明 |
---|---|---|
text | string | 需要合成的中文文本 |
voiceId | string | 必选,合成音的音色 |
speed | double | 可选,合成音的速度 |
volume | int | 可选,合成音的音量大小 |
DDS_EV_IN_AUDIO_STREAM
说明
音频流,支持两种送音频方式:
1. 在DDS_EV_OUT_RECORD_AUDIO回调中发送音频,此方式为dds主动索要音频;
2. 用户主动发送音频,忽略DDS_EV_OUT_RECORD_AUDIO回调,不在dds回调线程,直接使用dds_send接口发送音频。
message type
DDS_EV_IN_AUDIO_STREAM
payload
key | value type | 说明 |
---|---|---|
audio | binary |
音频流的值为二进制数据,消息封装如下:
struct dds_msg *msg = dds_msg_new();dds_msg_set_type(msg, DDS_EV_IN_AUDIO_STREAM); dds_msg_set_bin(msg, "audio", data, length); dds_send(msg); dds_msg_delete();
|
DDS_EV_IN_PLAYER_STATUS
说明
播放状态。
message type
DDS_EV_IN_PLAYER_STATUS
payload
key | value type | 说明 |
---|---|---|
status | string | 如果播放结束,值为:"end",dds接收到'end'之后会转到“listening”状态 |
DDS_EV_IN_NLU_TEXT
说明
语义请求,请求结果和语音请求一致。
message type
DDS_EV_IN_NLU_TEXT
payload
key | value type | 说明 |
---|---|---|
text | string | 需要进行语义请求的文本 |
DDS_EV_IN_WAKEUP_WORD
说明
配置单个唤醒词,oneshot的时候使用;
该配置仅对当前dds实例生效,会被下次DDS_EV_IN_WAKEUP_WORD设置更新。
message type
DDS_EV_IN_WAKEUP_WORD
payload
key | value type | 说明 |
---|---|---|
wakeupWord | string | 唤醒词内容,比如:“你好小乐” |
DDS_EV_IN_CINFO_OPERATE
说明
操作cinfo,设置/获取/删除单个终端自定义配置。
注意:cinfo针对词库的操作,该词库必须被产品用到,否则在调用set get delete操作时服务端会报错。
message type
DDS_EV_IN_CINFO_OPERATE
payload
set:
key | value type | 说明 |
---|---|---|
operation | string | 需要执行的操作,set |
location | json string | 设置地址信息,比如:{"city": "苏州市"} |
tts | json string | 设置云端合成配置,比如:{"voiceId":"zhilingf","speed":1.0,"volume":80,"sampleRate":8000,"audioType":"mp3"} |
vocab_name | string |
需要设置的词库名称,比如:"城市名称" (该词库必须在产品的技能词库中包含,否则返回result: failed) |
vocab_data | json string |
需要设置的对应于vocab_name词库下的词条 设置词库,vocab_name和vocab_data必选,否则不操作。 格式:["词一", "词二”, "词三", "词一同义词: 词一", "词一同义词2: 词一"] (设置同义词,必须包含“词一”本身) 比如:["苏州”, "北京", "上海”] , ["苏州”, "北京", "上海”, "帝都:北京", "首都:北京"] |
get:
key | value type | 说明 |
---|---|---|
operation | string | 需要执行的操作,get |
cinfo | string | 需要获取的配置类型,比如:"tts", "location", "vocab" |
vocab_name | string | 需要查询的词库名称,如果词库不存在或词库下没有词条,返回result: failed |
delete:
key | value type | 说明 |
---|---|---|
operation | string | 需要执行的操作,delete((目前支持vocab进行删除) |
cinfo | string | 需要删除的配置类型,支持 "location", "vocab" |
vocab_name | string |
需要删除的词库名称 |
vocab_data | json string |
需要删除的vocab_name词库下的词条 如果operation=delete, cinfo=vocab, vocab_name="某个词库“,vocab_data="["该词库下的某个词条"]",则删除该词条 如果operation=delete, cinfo=vocab, vocab_name="某个词库“,不设置vocab_data,则删除该词库下的所有词条 |
DDS_EV_IN_DM_INTENT
说明
跳过识别和语义,直接进入指定的意图对话。
message_type
DDS_EV_IN_DM_INTENT
payload
key | value type | 说明 |
---|---|---|
skill | string |
技能名称,必选 |
task | string | 任务名称,必选 |
intent | string | 意图名称,必选 |
slots | json string |
语义槽的key-value,可选 格式为:{"语义槽1":"语义槽1的值",语义槽2":"语义槽2的值"} |
DDS_EV_IN_PHRASE_HINTS
说明
热词设置,目前仅支持基础技术识别时使用;
该配置仅对当前dds实例生效,会被下次DDS_EV_IN_PHRASE_HINTS设置更新;
设置热词后,会将语音优先识别为热词中的词。
message_type
DDS_EV_IN_PHRASE_HINTS
payload
key | value type | 说明 |
---|---|---|
phraseHints | json string |
热词配置 格式为: [{"type": "vocab", "name": "词库名", "data":["短语1", "短语2"]}] 其中:type为词库类型,目前只支持vocab 示例:"[{"type":"vocab","name":"联系人","data":["张三","李四"]}]" |
DDS_EV_IN_PRODUCT_CONFIG
说明
获取dui控制台上的该产品配置。
message_type
DDS_EV_IN_PRODUCT_CONFIG
payload
无
软件接口
dds_ev_callback
typedef int (*dds_ev_callback)(void *userdata, struct dds_msg *msg);
事件回调函数,所有的DDS_EV_OUT事件都会通过该接口告诉开发者。
struct dds_opt
struct dds_opt {
dds_ev_callback _handler;
void *userdata;
};
结构体成员
- _handler:事件回调函数;
- userdata:用户数据。
dds_start
int dds_start(struct dds_msg *conf, struct dds_opt *opt);
函数功能
启动dds,该接口会一直阻塞,需要在一个单独的线程里面调用执行,通过事件回调函数和系统交互;通过发送事件DDS_EV_IN_EXIT,让其退出。
参数
conf:dds配置,开发需要配置productId、aliasKey、deviceProfile,这三个值,需要在dui控制台上获取。
配置示例如:
struct dds_msg *msg = dds_msg_new(); dds_msg_set_string(msg, "productId", "100000xxxx"); dds_msg_set_string(msg, "aliasKey", "prod");
dds_msg_set_string(msg, "savedProfile", "xxxx"); //xxx为设备对应的profile文件的路径
opt:可选配置参数,有事件回调函数和用户数据
返回值
0:成功
-1: 失败
dds_send
int dds_send(struct dds_msg *msg);
函数功能
发送数据给dds,一般是DDS_EV_IN_事件,该接口线程安全。
参数
msg:消息数据,先创建消息,调完dds_send以后,该消息即可释放。
返回值
0: 成功
1:失败
EXAMPLE
详见sdk开发包