/// <summary> /// 异步返回智能家居数据 /// 12345678_Ying;513;5omT5byA56qX5biY;Zip;H4sIAAAAAAAAAAEfAOD/6K6+5aSH5peg5rOV6K+G5YirQOaJk+W8gOeql+W4mCDHP38fAAAA$/r$ /// </summary> /// <param name="msg"></param> public static void AsyncReceiveMsg(string msg) { log.Info($"AsyncSmartHomeReceiveMsg异步返回:{msg}"); try { if (msg.IndexOf(";") > 0) { //根据返回字符串得到sessionId string sessionId = msg.Split(';')[0].Split('_')[0]; string deviceId = msg.Split(';')[0].Split('_')[1]; log.Info("AsyncSmartHomeReceiveMsg异步返回sessionId:" + sessionId); //添加当前智能家居异步返回语义 string msg64j = EncryptionHelp.Decrypt(msg.Split(';')[4].Replace("$/r$", ""), true);//解密"设备无法识别@打开窗帘" string Answers; if (msg64j.IndexOf("@") > 0) { Answers = "";//2020播放响应效果音可持续交流 } else { Answers = msg64j; //2011播放url内容,播放完自动唤醒 } NlpAnswers _NlpAnswers = new NlpAnswers() { Code = "SmartHomeNlp", Name = "家居", Answers = Answers, }; //————————————————向中枢控制器指定的sessionId发送返回的语义结果—————————————————————————— NlpControler.AsyncReturnMsg(sessionId, _NlpAnswers); log.Info($"AsyncSmartHomeReceiveMsg异步完毕,向中枢控制器指定的{sessionId}发送返回的语义结果:{_NlpAnswers.Answers}"); } } catch (Exception ex) { log.Info($"异步发生异常:" + ex.Message); } }
public static void AIFunction(SoundBodyRequest body) { //百度分词 BaiduNlp nlpEntity = BaiduSDK.Nlp(body.questions); //添加句子表,分词表 string talkDevice = "Talk_" + body.deviceId; //每个音响创建一个会话 long newTimestamp = DataHelper.GetTimeSpan(DateTime.Now); //句子时间戳 string newTitleid = nlpEntity.log_id.ToString(); //句子id string _Talkid = ""; string userid = RedisHelper.GetHostId(body.deviceId); //音响对应用户 body.timestamp = newTimestamp; // 时间标签(Long型) body.baidu_Items = nlpEntity.items; // 分词列表(字符串数组) string field = AIControler.Getdomain(body); //获取领域 body.field = field; //领域 int sort = 1; //会话中句子的顺序 string preTitleid = ""; //上一个句子id string questions = ""; //问题列表:(字符串数组) 音箱的会话记录 string answers = ""; //回答列表:(字符串数组) AIcontrol会话记录 //创建会话缓存 using (RedisHashService service = new RedisHashService()) { string _timestampStr = service.GetValueFromHash(talkDevice, "timestamp");//获取缓存时间戳 if (!string.IsNullOrEmpty(_timestampStr)) { long oldTimestamp = Convert.ToInt64(_timestampStr); long cha = newTimestamp - oldTimestamp; if (cha > 60) //一分钟60秒 { _Talkid = body.deviceId + "_" + DateTime.Now.ToString("yyyyMMdd-HHmmss-fff"); //超过一分钟,创建新的会话缓存 service.SetEntryInHash(talkDevice, "talkid", _Talkid); //缓存会话id } //一分钟内继续使用,不更新 else { _Talkid = service.GetValueFromHash(talkDevice, "talkid"); string sortStr = service.GetValueFromHash(talkDevice, "sort");//先获取当前顺序 if (!string.IsNullOrEmpty(sortStr)) { sort = Convert.ToInt32(sortStr); } sort++;//一分钟内顺序+1 } } else { _Talkid = body.deviceId + "_" + DateTime.Now.ToString("yyyyMMdd-HHmmss-fff"); //没有新建 service.SetEntryInHash(talkDevice, "talkid", _Talkid); //缓存会话id } preTitleid = service.GetValueFromHash(talkDevice, "titleid"); //前个句子id //每次都更新句子时间戳 service.SetEntryInHash(talkDevice, "titleid", newTitleid); //缓存新的句子id service.SetEntryInHash(talkDevice, "timestamp", newTimestamp.ToString()); //缓存新的时间戳 service.SetEntryInHash(talkDevice, "field", field); //新的领域 service.SetEntryInHash(talkDevice, "sort", sort.ToString()); //顺序 string talkstate = service.GetValueFromHash(talkDevice, "state"); //获取缓存会话模式,提前赋值 body.talkstate = talkstate; //会话模式 talkstate = "inquiry"; if (talkstate == "inquiry" || talkstate == "await") //询问,等待 { Task.Run(() => { //不用请求任何Nlu服务器,直接丢给AIControl函数Setanswer处理,返回抛给音箱 AIControler.Setanswer(body); }); } //else if(_state== "train")//训练模式 else { Task.Run(() => { //发送收到的语音到NLP管理器 NlpControler.ProcessingRequest(body); }); } //启动线程存数据库 Task.Run(() => { using (HsfDBContext hsfDBContext = new HsfDBContext()) { //句子表 sound_title sound_Title = new sound_title() { titleid = newTitleid, titletext = body.questions, timestamp = newTimestamp, preid = preTitleid, sort = sort, talkid = _Talkid, sender = body.deviceId, userid = userid, sendtype = body.sourceId, field = field, talkstate = talkstate }; hsfDBContext.sound_title.Add(sound_Title); int items_sort = 0; //分词表 foreach (var item in nlpEntity.items) { items_sort++; baidu_items baidu_Items = new baidu_items() { wordid = Guid.NewGuid().ToString(), titleid = newTitleid, byte_length = item.byte_length, byte_offset = item.byte_offset, uri = item.uri, pos = item.pos, ne = item.ne, item = item.item, basic_words = string.Join(",", item.basic_words), formal = item.formal, sort = items_sort, timestamp = newTimestamp }; hsfDBContext.baidu_items.Add(baidu_Items); } hsfDBContext.SaveChanges(); } log.Info($"保存到句子表和分词表"); }); } }
/// <summary> ///调用第三方语义排序API,对于语义进行排序 /// </summary> /// <param name="_SemanticsDictionary">传递语义槽</param> /// <returns>排序结果</returns> public static void GetAIAnswers(SemanticsSlot _SemanticsSlot, string type) { try { string sessionId = _SemanticsSlot.SessionId; string deviceId = _SemanticsSlot.DeviceId; string questions = _SemanticsSlot.Questions; string sourceid = _SemanticsSlot.SourceId; log.Info($"{questions} 执行方式:{type} 返回次数:{_SemanticsSlot.Answertimes} 语义槽数量:{_SemanticsSlot.NlpAnswers.Count} "); //过滤掉所有空 var Answers = _SemanticsSlot.NlpAnswers.OrderBy(t => t.Level);//.Where(t => !string.IsNullOrEmpty(t.Answers)) if (Answers.Count() > 0) { foreach (var item in Answers) { string code = item.Code; string answers = item.Answers; //优先返回基础nlp if (code == "BaseNlp") { NlpControler.BackAnswers(sessionId, deviceId, questions, "2011", answers, BaiduSDK.Tts(answers));// 2011播放url内容,播放完自动唤醒 break; } //返回智能家居nlp,不带的设备无法识别@ else if (code == "SmartHomeNlp" && !answers.Contains("2014@")) { if (answers.Split('@').Length == 2) { string action = answers.Split('@')[0]; string req = answers.Split('@')[1]; NlpControler.BackAnswers(sessionId, deviceId, questions, action, answers, "");//根据@中的action返回 break; } else { NlpControler.BackAnswers(sessionId, deviceId, questions, "2020", answers, "");//2020播放响应效果音可持续交流 break; } } else { //设备无法识别的时候,优先返回音响自带的结果(不为空的情况下) var item2 = _SemanticsSlot.NlpAnswers.Where(t => t.Code == "SoundNlp").FirstOrDefault(); if (sourceid != "mengdou") { ///执行百度自己请求 NlpControler.BackAnswers(sessionId, deviceId, questions, "2010", "无法识别您说的意思", ""); break; } else if (item2 != null) { if (answers.Contains("service\":\"musicX") || answers.Contains("service\":\"news") || answers.Contains("service\":\"story") || answers.Contains("service\":\"joke")) { NlpControler.BackAnswers(sessionId, deviceId, questions, "2025", item2.Answers, "");//2025主机不返回,超时,播放错误音,其实主机已经在播放音乐 break; } else { NlpControler.BackAnswers(sessionId, deviceId, questions, "2011", item2.Answers, BaiduSDK.Tts(item2.Answers));// 2011播放url内容,播放完自动唤醒 break; } } else { NlpControler.BackAnswers(sessionId, deviceId, questions, "2014", "无法识别您说的意思", ""); //NlpControler.BackAnswers(sessionId, deviceId, questions, "2014", "无法识别您说的意思", BaiduSDK.mp3Fail); break; } } } } else { if (sourceid != "mengdou") { ///执行百度自己请求 NlpControler.BackAnswers(sessionId, deviceId, questions, "2010", "无法识别您说的意思", ""); } else { NlpControler.BackAnswers(sessionId, deviceId, questions, "2014", "无法识别您说的意思", ""); } //NlpControler.BackAnswers(sessionId, deviceId, questions, "2014", "无法识别您说的意思", BaiduSDK.mp3Fail); } } catch (Exception ex) { log.Info($"{_SemanticsSlot.Questions} AI处理异常: {ex.Message}"); } }
/// <summary> /// 不用请求任何Nlu服务器,直接丢给AIControl函数Setanswer处理,返回抛给音箱 /// </summary> /// <param name="body"></param> /// <returns></returns> public static void Setanswer(SoundBodyRequest body) { string answers = "不用请求任何Nlu服务器,直接丢给AIControl函数Setanswer处理,返回抛给音箱"; NlpControler.BackAnswers(body.sessionId, body.deviceId, body.questions, "2011", answers, BaiduSDK.Tts(answers)); }