机器人技能的Android SDK接入文档
文档修订记录
| 文档版本号 | 修订日期 | 修订原因 |
|---|---|---|
| V1.0 | 2023.04.20 | 创建文档 |
| V1.1 | 2023.10.23 | 优化文档 |
概述
NLP模块为语义理解,包含图灵API的所有技能。需要使用不同的技能可以指定参数请求使用或进入该技能。
权限声明
网络权限 - 使用过程中,会有https与wss请求、网络状态检测
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
存储权限 - 使用过程中,会写入日志文件(debug),请在清单中指定以下内容。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- android10 以上需要额外添加-->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
在android10及以上需要在application标签下添加如下配置
android:requestLegacyExternalStorage="true"
配置文件
将turing_config.json配置文件放在main/assets文件夹下
{
"authorization": {
"apikey": "您的apikey",
"secret": "您的secret"
},
"ability": {
"nlp": {
"codes": [],
"robotSkills": {
}
}
}
}
接口说明
public interface TuringNlpInterface {
/**
* 语义理解
*
* @param text 目标文本,限定合法的最大长度为100字符
* @param isAssignNlp 是否指定Nlp参数
* @param listener TuringOSClientListener
*/
public void actionNlp(String text, boolean isAssignNlp, TuringOSClientListener listener);
/**
* @param text 目标文本,限定合法的最大长度为100字符
* @param nlpRequestConfig nlp请求参数,如设置为空,则使用Turing_config.json中的nlp配置,如没有nlp配置,则使用默认值
* @param listener 接口回调
*/
public void actionNlp(String text, NlpRequestConfig nlpRequestConfig, TuringOSClientListener listener);
/**
* 请求打招呼接口,一般用于开机或机器人的第一次交互,返回的结果可以在图灵平台进行配置
*
* @param listener 接口回调
*/
void actionFirstConversion(TuringOSClientListener listener);
/**
* 请求主动交互,用于让机器人主动发起交互的场景,返回的结果可以在图灵平台进行配置
*
* @param listener 接口回调
*/
void actionAutoConversion(TuringOSClientListener listener);
/**
* 释放资源
*/
void release();
}
使用说明
功能使用
实例化
val turingNlp:TuringNlpInterface = TuringNlp.getInstance(this)
NLP调用
方法一:使用全局配置文件Turing_config.json中的参数,需配置nlp参数
//输入:我要玩成语接龙(该文字会触发成语接龙技能)
turingNlp.actionNlp("我要玩成语接龙",true,object :TuringOSClientListener{
override fun onResult(
code: Int,
result: String?,
baseResp: BaseResp?,
extension: String?
) {
TODO("Not yet implemented")
}
override fun onError(code: Int, msg: String?) {
TODO("Not yet implemented")
}
})
返回示例:
{
"code":200,
"globalId":"115417187981503001",
"message":"success",
"nlpResponse":{
"intent":{
"code":10005,
"operateState":1100
},
"results":[
{
"groupType":0,
"resultType":"text",
"values":{
"ttsUrl":[
"http://turing-iot.oss-cn-beijing.aliyuncs.com/tts/tts-c8162cf54ada46bf883c0c19c8eba0de-20fcbe842c4746949d8db99192c10d7e.mp3"
],
"text":"欢迎进入“成语接龙”游戏,接不上了可以跟我说“提示”、 “换题”或“跳过”; 不想玩了可以对我说 “退出” 。来,让我验验你是学霸还是学酥。请接:江湖医生"
}
}
]
}
}
方法二:使用NlpRequestConfig参数
//指定特定技能
val nlpConfig = NlpRequestConfig.Builder().codes(mutableListOf(1000018)).build()
turingNlp.actionNlp("明天吃什么",nlpConfig,object :TuringOSClientListener{
override fun onResult(
code: Int,
result: String?,
baseResp: BaseResp?,
extension: String?
) {
TODO("Not yet implemented")
}
override fun onError(code: Int, msg: String?) {
TODO("Not yet implemented")
}
})
返回示例:
{
"code":200,
"globalId":"115340674635503001",
"message":"success",
"nlpResponse":{
"intent":{
"code":1000018,
"operateState":1010
},
"results":[
{
"groupType":0,
"resultType":"text",
"values":{
"text":"What to eat tomorrow"
}
}
]
}
}
开机提示语请求
需要现在图灵机器人开放平台增加开机提示语。
//调用示例
turingNlp.actionFirstConversion(listener);
返回示例:
{
"code":200,
"globalId":"130470788369483001",
"message":"success",
"nlpResponse":{
"intent":{
"code":1000010,
"operateState":2001
},
"results":[
{
"groupType":1,
"resultType":"text",
"values":{
"text":"你好,我是图灵机器人!"
}
}
]
}
}
主动交互请求
主动交互可以返回机器人主动发起对话的结果,返回的对话内容需要在图灵机器人开放平台配置。
turingNlp.actionAutoConversion(listener)
返回示例:
{
"code":200,
"globalId":"130519772800774001",
"message":"success",
"nlpResponse":{
"intent":{
"code":1000011,
"operateState":2001
},
"results":[
{
"groupType":1,
"resultType":"text",
"values":{
"text":"你都不理人家!"
}
}
]
}
}
参数说明
输入参数
NlpRequestConfig
对应turing_config.json中的nlp参数
| 参数 | 类型 | 是否必须 | 取值范围 | 说明 |
|---|---|---|---|---|
| appState | AppState | N | 前的应用状态 | |
| userInfo | Map |
N | 用户参数,协议扩展字段,可忽略 | |
| robotSkills | Map |
N | 用户应用自定义参数,协议扩展字段 | |
| clientInfo | Map |
N | 客户端状态,协议扩展字段,可忽略 | |
| binaryDetail | Map |
N | 默认无需配置 | |
| codes | List |
N | - | 用户此次交互仅使用该参数中的应用,具体参考(http://docs.turingos.cn/api/apiV2/#turingos) |
| location | Map |
N | - | 可设置城市和经纬度查询天气如: "location": { "city": "深圳", "latitude": "22.547", "longitude": "114.085947" } |
AppStateBean
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| code | int | 0 | 应用code(具体参考图灵API) |
| operateState | int | 0 | 应用状态值 |
当不要特殊处理当前的上下文时,appStateBean该值可以省略。
通用operateState
| code | 说明 |
|---|---|
| 1000 | 主动退出 |
| 1010 | 无上下文结束 |
| 1100 | 启动 |
| 1200 | 暂停 |
| 1300 | 继续 |
| 1400 | 等待重启 |
userInfo
| key | value | 说明 |
|---|---|---|
| requestIp | IP地址如:180.149.130.13 | 可设置IP地址查询该地址的天气 |
回调接口
- TuringOSClientListener:文字输入方式时,对话结果使用该接口回调,接口信息与其他模块一致,使用方式参考文字输入方式的方法说明;
public interface TuringOSClientListener {
/**
* 请求成功结果
* @param code 请求Code
* @param result 请求结果 JSON
* @param baseResp 请求结果 BaseResp,只包含基础字段
* @param extension 扩展信息
*/
void onResult(int code, String result, BaseResp baseResp, String extension);
/**
* 请求失败
* @param code 请求失败Code,参考错误码
* @param msg 请求失败信息
*/
void onError(int code, String msg);
}
- 每一次独立的NLP请求会返回onResult或onError;
- 请求成功的结果json字符串对应result;
- BaseResp:参考NLP输出说明;
- extension:扩展输出字段,该模块暂时没有输出。
输出参数
TuringOSClientListener接口的onResult方法同时返回json数据和BaseResp对象。
json示例如下:
{
"code":200,
"globalId":"98412738103000000",
"message":"success",
"nlpResponse":{
"intent":{
"code":100000,
"operateState":1010
},
"results":[
{
"groupType":0,
"resultType":"text",
"values":{
"emotionId":0,
"sentenceId":201,
"text":"你好呀,乖宝宝。"
}
}
]
}
}
BaseResp说明
BaseResp只解析基础字段,技能的实体内容字段需要自行实现实体类来解析,TuringSDKSample已经给出大部分技能的解析实体类;
其他特殊技能可根据具体返回的Json自行实现具体的实体类。
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 请求响应Code,具体可参考Code说明 |
| done | boolean | 此次对话是否结束状态,如果是最终结果则是true,否则是false |
| globalId | String | 此次对话的唯一标识 |
| message | String | 请求响应的消息描述 |
| nlpResponse | NlpResponse | 语义请求结果 |
- NlpResponse
| 参数 | 类型 | 说明 |
|---|---|---|
| intent | Intent(Object) | 语义理解结果的实体内容 |
| results | List(Object) | 语义理解结果的提示语和播放内容集合 |
- NlpResponse-Intent
| 参数 | 类型 | 说明 |
|---|---|---|
| code | Intent(Object) | 此次请求命中的技能Code 具体参考技能说明 |
| operateState | int | 此次技能的状态值,可参考OperateState说明 |
注意:该对象内不包含其他字段值,开发者需要根据不同的技能返回的JSON来编写解析不同的实体类,TuringSDKSample已经给出大部分技能的解析实体类,仅供参考,以实际返回的JSON数据为主。
通用operateState
| code | 说明 |
|---|---|
| 1000 | 主动退出 |
| 1010 | 无上下文结束 |
| 1100 | 启动 |
| 1200 | 暂停 |
| 1300 | 继续 |
| 1400 | 等待重启 |
- NlpResponse-List-Results
| 参数 | 类型 | 说明 |
|---|---|---|
| groupType | int | 组类型(普通接入可忽略该参数): 0为独立输出; 大于0时可能包含同组相关内容 |
| resultType | String | 输出类型: 当 resultType=text 时:表示文本 当 resultType=voice 时:表示音频 url 当 resultType=image 时:表示图片 url 当 resultType=video 时:表示视频 url |
| values | Values(Object) | 输出内容(必会包含 resultType 对应的 key, 其他会根据具体应用场景进行字段扩充) |
例如:
当resultType="voice"时,values必会包含voice对应的key;
{
//其他字段省略
"groupType":0,
"resultType":"voice",
"values":{
"voice":{
"http://turing-iot.oss-cn-beijing.aliyuncs.com/tts/tts-c8162cf54ada46bf883c0c19c8eba0de-20fcbe842c4746949d8db99192c10d7e.mp3"
}
}
}
解析示例:
TuringSDKSample已经给出解析示例
Path:com.turing.sample.ai.chat.ChatActivity
Method:handlerResult
注意
语音对话中,语义理解输出的文字结果以及附加的播放内容集合主要在NlpResponse-List-Results中;
语义理解的技能实体内容主要NlpResponse-Intent中,具体参考返回的Json;
{
"code":200,
"globalId":"130635831624483001",
"message":"success",
"nlpResponse":{
"intent":{
"code":200101,
"intentName":"play_music",
"operateState":1100,
"parameters":{
"singer":"周杰伦",
"name":"夜曲"
}
},
"results":[
{
"groupType":0,
"resultType":"text",
"values":{
"ttsUrl":[
"http://turing-iot.oss-cn-beijing.aliyuncs.com/tts/tts-c8162cf54ada46bf883c0c19c8eba0de-3b4770ca7db84f38a04a9637f77d717f.mp3"
],
"text":"好的,请听我唱周杰伦的夜曲。"
}
},
{
"groupType":0,
"resultType":"voice",
"values":{
"voice":"http://iot-cdn.turingapi.com/202012242027/292a437efe852f713c464197a401b553/media/audio/20180524/8930b3635cb04f0cbb769c9c277f9acc.mp3"
}
}
]
}
}
Results:返回了语义理解结果的文本等内容;
NlpResponse-Intent-parameters:返回诗词技能的详细信息。
常见问题
1.语义理解结果没有播放文本的链接
NLP模块中会返回语义理解结果的文本,但是不一定返回文本对应的音频,可能在一些技能场景中会有返回附加音频,所以当语义理解场景中需要播放语义理解的内容,可以使用语音聊天模块,具体参考语音对话模块介绍;