以下是类内的静态变量。用于管理状态及TOKEN信息,SESSION信息。
// 调用getAccessToken()获取的 access_token建议根据expires_in 时间 设置缓存
// 返回token示例
public static readonly String TOKEN = getAccessToken();
public static bool IsFinishedThisUnit;
private static string sessionId="";
private static bool first=true;
下面是一段 c#调用百度API接口,获取临时token值。
public static string getAccessToken()
{
String clientId = 【这里填入APPID】;
String clientSecret = 【这里填入APPSECRET】;
String authHost = "https://aip.baidubce.com/oauth/2.0/token";
HttpClient client = new HttpClient();
List> paraList = new List>();
paraList.Add(new KeyValuePair("grant_type", "client_credentials"));
paraList.Add(new KeyValuePair("client_id", clientId));
paraList.Add(new KeyValuePair("client_secret", clientSecret));
HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
String result = response.Content.ReadAsStringAsync().Result;
//Console.WriteLine(result);
JObject res = JObject.Parse(result);
return res["access_token"].ToString();
}
再根据TOKEN调用UNIT通用API接口获取返回json字符串并分析字符串指向的方法
public static JObject Unit_Send(string Content)
{
IsFinishedThisUnit = false;
string host = "https://aip.baidubce.com/rpc/2.0/solution/v1/unit_utterance?access_token=" + TOKEN;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
request.Method = "post";
request.ContentType = "application/json";
request.KeepAlive = true;
string str = "{\"scene_id\":【这里填入UNIT场景ID】,\"query\":\"" + Content + "\", \"session_id\":\"" + sessionId + "\"}"; // json格式
byte[] buffer = Encoding.UTF8.GetBytes(str);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
JObject res = JObject.Parse(reader.ReadToEnd());
if (res["error_code"] == null)
{
sessionId = res["result"]["session_id"].ToString();
if (res["result"]["action_list"][0]["action_type"]["act_type"].ToString() == "satisfy")
{
//意图完成
IsFinishedThisUnit = true;
return res;
}
else if (res["result"]["action_list"][0]["action_type"]["act_type"].ToString() == "clarify")
{
//意图未完成
Console.Write(res["result"]["action_list"][0]["say"].ToString());
return null;
}
else
{
//未知意图 可加本地日志记录逻辑 以后期扩充样本集
Console.Write("你到底想干嘛?");
return null;
}
}
else
{
return null;
}
}
}
TOP
切换版块
单次会话指的是 服务器与客户端的一次稳定连接时长。UNIT的会话长短由客户端应用层控制 并不是某次意图完成为一次会话
session可以一直保存下去,不会变的。不用担心每次赋值会改变。
他第一轮会返回sessionID,之后你只要坚持用sessionID进行请求,他这个是不会变的。
除非你再次以空session请求,他会开一个新会话,返回给你新的sessionID。
使用sessionID的好处是可以获取上一轮会话填充的词槽情况(词槽继承、复用词槽)。如果开了新会话就都没了。
大神,这个sessionid指的一次会话是不是就是一次问答,而不是直到一个意图完成,获取答复?就是我提问后,sessionid从空变成了返回的一个值1,我们接着对话,sessionid又会改变,变成值2,再对话,还会改变?
互相学习,客气客气
感谢大佬!!!
这个就挺好的! 之前没看到!
= =~~~
好棒哒初心呀~
不不不 就是满基础的东西 节约大家开发时间
专业级别的,厉害~
谢谢谢谢
支持兄弟hhhhhhhh~
膜拜大佬~~~感觉大佬的无偿奉献
这里给大家分享几个 我在示例中用到的会调用到的单参方法,和无参实体方法,供大家参考
setBright:
setRGB:
setCtAbx:
AddCron:
无参方法:
因为该场景示例是用UDP协议与硬件交互的。交互过程封装在了SendMessage方法中,这个方法就不公开了,各位可以忽略这个方法。
在分析了UNIT返回的json字符串之后,我们要将词槽的值 分类别存放到内存中。如下是我自己封装的所谓的词槽解析方法
是针对我自己的应用场景的,分享给大家,可自行修改代码以提高场景适配度
如下是意图执行方法。内部封装了从UNIT取到的执行函数名。同过名称利用C#的reflection类查找对象下的具体的方法地址。
然后将词槽作为方法签名进行执行。为了区分签名的不同。singleSign为单签名方法。有些方法是不需要签名的。可以根据签名的不同分多个类别进行执行。