Unity 百度智能对话API
前言前面实现了Unity调用百度的语音识别与语音合成之后呢,我想制作一个智能语音对话助手,本文就来实现智能人机对话(Unit)。
准备工作第一步还是在百度智能云平台上选择相应的模块(智能对话Unit)创建应用,具体的过程就不多赘述了,以下就直接切入正题。
步骤(1)制作一个对话框UI(2)获取AccessToken,代码如下:
//////获取accessToken请求令牌//////IEnumerator_GetAccessToken(){varuri=string.Format("https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id={0}&client_secret={1}",api_key,secret_key);UnityWebRequestunityWebRequest=UnityWebRequest.Get(uri);yieldreturnunityWebRequest.SendWebRequest();if(unityWebRequest.isDone){Matchmatch=Regex.Match(unityWebRequest.downloadHandler.text,@"access_token.:.(.*?).,");if(match.Success){Debug.Log("Token已经匹配");accessToken=match.Groups[1].ToString();}else{Debug.Log("验证错误,获取AccessToken失败!!!");}}}(3)其它逻辑编写以及智能对话UnitAPI的调用
//////NLP的人工智能对话功能////////////voidUnit_NLP(stringmysay,stringsession_id="",stringaction_id=""){stringtoken=accessToken;stringhost="https://aip.baidubce.com/rpc/2.0/unit/service/chat?access_token="+token;HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(host);request.Method="post";request.ContentType="application/json";request.KeepAlive=true;JsonDatasend=newJsonData();send["version"]="2.0";send["service_id"]="S27034";send["log_id"]="home";send["session_id"]="home";send["action_id"]="1017002";send["request"]=newJsonData();send["request"]["user_id"]="88888";send["request"]["query"]=mysay;send["request"]["query_info"]=newJsonData();send["request"]["query_info"]["type"]="TEXT";JsonDatabot_session=newJsonData();bot_session["session_id"]="";send["bot_session"]=JsonMapper.ToJson(bot_session);stringsendStr=JsonMapper.ToJson(send);byte[]buffer=Encoding.UTF8.GetBytes(sendStr);request.ContentLength=buffer.Length;request.GetRequestStream().Write(buffer,0,buffer.Length);HttpWebResponseresponse=(HttpWebResponse)request.GetResponse();StreamReaderreader=newStreamReader(response.GetResponseStream(),Encoding.UTF8);stringresult=reader.ReadToEnd();JsonDecode(result);}(4)对返回的数据进行解析,获得对话内容
//////对NLP的回复进行Json解析/////////publicListJsonDecode(stringjs){ListSays=newList();varjson=SimpleJson.SimpleJson.DeserializeObject(js);if(json.ContainsKey("result")){varresult=(SimpleJson.JsonObject)json["result"];if(result.ContainsKey("response_list")){varresArray=(SimpleJson.JsonArray)result["response_list"];varres=(SimpleJson.JsonObject)resArray[0];if(res.ContainsKey("action_list")){varactArray=(SimpleJson.JsonArray)res["action_list"];varact=(SimpleJson.JsonObject)actArray[0];if(act.ContainsKey("say")){varsay=(string)act["say"];chat.AddChatMessage(say,ChatUI.enumChatMessageType.MessageLeft);Says.Add(say);}}}}returnSays;}完整的代码如下:
usingLitJson;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Net;usingSystem.Text;usingSystem.Text.RegularExpressions;usingUnityEngine;usingUnityEngine.UI;usingUnityEngine.Networking;publicclassNLPScript:MonoBehaviour{//自行填写自己的API密钥publicstringapi_key;publicstringsecret_key;stringaccessToken=string.Empty;InputFieldmessagePanel;ChatUIchat;//一个类似微信聊天的UI界面//StartiscalledbeforethefirstframeupdatevoidStart(){chat=GameObject.Find("Canvas/ChatUI").GetComponent();messagePanel=GameObject.Find("Canvas/ChatUI/InputArea/InputField").GetComponent();StartCoroutine(_GetAccessToken());if(messagePanel!=null){messagePanel.onEndEdit.AddListener(delegate{if(messagePanel.text=="")return;chat.AddChatMessage(messagePanel.text,ChatUI.enumChatMessageType.MessageRight);Unit_NLP(messagePanel.text);});}}//////NLP的人工智能对话功能////////////voidUnit_NLP(stringmysay,stringsession_id="",stringaction_id=""){stringtoken=accessToken;stringhost="https://aip.baidubce.com/rpc/2.0/unit/service/chat?access_token="+token;HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(host);request.Method="post";request.ContentType="application/json";request.KeepAlive=true;JsonDatasend=newJsonData();send["version"]="2.0";send["service_id"]="S27034";send["log_id"]="home";send["session_id"]="home";send["action_id"]="1017002";send["request"]=newJsonData();send["request"]["user_id"]="88888";send["request"]["query"]=mysay;send["request"]["query_info"]=newJsonData();send["request"]["query_info"]["type"]="TEXT";JsonDatabot_session=newJsonData();bot_session["session_id"]="";send["bot_session"]=JsonMapper.ToJson(bot_session);stringsendStr=JsonMapper.ToJson(send);byte[]buffer=Encoding.UTF8.GetBytes(sendStr);request.ContentLength=buffer.Length;request.GetRequestStream().Write(buffer,0,buffer.Length);HttpWebResponseresponse=(HttpWebResponse)request.GetResponse();StreamReaderreader=newStreamReader(response.GetResponseStream(),Encoding.UTF8);stringresult=reader.ReadToEnd();JsonDecode(result);}//////对NLP的回复进行Json解析/////////publicListJsonDecode(stringjs){ListSays=newList();varjson=SimpleJson.SimpleJson.DeserializeObject(js);if(json.ContainsKey("result")){varresult=(SimpleJson.JsonObject)json["result"];if(result.ContainsKey("response_list")){varresArray=(SimpleJson.JsonArray)result["response_list"];varres=(SimpleJson.JsonObject)resArray[0];if(res.ContainsKey("action_list")){varactArray=(SimpleJson.JsonArray)res["action_list"];varact=(SimpleJson.JsonObject)actArray[0];if(act.ContainsKey("say")){varsay=(string)act["say"];chat.AddChatMessage(say,ChatUI.enumChatMessageType.MessageLeft);Says.Add(say);}}}}returnSays;}//////获取accessToken请求令牌//////IEnumerator_GetAccessToken(){varuri=string.Format("https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id={0}&client_secret={1}",api_key,secret_key);UnityWebRequestunityWebRequest=UnityWebRequest.Get(uri);yieldreturnunityWebRequest.SendWebRequest();if(unityWebRequest.isDone){Matchmatch=Regex.Match(unityWebRequest.downloadHandler.text,@"access_token.:.(.*?).,");if(match.Success){Debug.Log("Token已经匹配");accessToken=match.Groups[1].ToString();}else{Debug.Log("验证错误,获取AccessToken失败!!!");}}}}演示效果如下: