基于Android studio开发的图灵智能聊天机器人
前言在人工智能时代,开发一款自己的智能问答机器人,既可以提升自己的编程能力,又可以作为开发项目的实战练习。
百度有小度,小米有小爱,VIVO有小V,总之类似的智能聊天机器人是越来越多了。面对这些智能的机器人,我们似乎只能是体验者。想想底层的算法就让人头疼,它到底是怎么识别出一句话的意思的?又是怎么实现智能回复的?
接下来我将用Androidstudio并借用百度图灵机器人((turingapi.com))教大家实现一个属于自己的智能聊天机器人。
学 号 231
姓 名 福福
指导教师:赵,罗,钟
2022 年 5 月 8 日
1 系统设计
1.1设计要求
1.1.1设计任务
设计一个对话框能实现聊天功能,要求能联网实现自动对话的功能,可以实现编辑、发送、删除等功能。
1.1.2性能指标要求
1、基本要求
要求完成程序源码编写、调试及关键代码注释。
2、发挥部分
实现多客户端间的聊天功能。
1.2设计思路及设计框图
1.2.1设计思路
智能聊天机器人的设计流程如下:
①将要显示的数据封装成Data数据。
②将封装好的Data数据设置成HTTP请求数据。
③向图灵机器人服务器发送HTTP请求。
④图灵服务器接收到HTTP请求数据之后,返回JSON数据。
⑤将获取到的JSON数据进行解析。
⑥解析后的JSON数据封装并显示到界面中。
1.2.2总体设计框图
2 各个模块程序的设计
1、申请机器人身份标识
在图灵机器人官网注册并获取key值
2、建立聊天布局
整个界面最外层采用线性布局,接着在TextView下面放置了一个RelativeLayout,在它里面先放置了一个ListView,用于显示聊天消息列表。然后放置了一个小的RelativeLayout,里面放置了一个Button和一个EditText,Button在EditText右侧,文本为“发送”,作为发送按钮,EditText则是聊天输入框,在里面输入聊天内容。这样整个聊天界面的布局文件就搭建好了。
3、搭建聊天条数布局
chatting_left_item文件为机器人聊天头像和聊天框显示文件,用于显示机器人的聊天内容。
chatting_right_item文件为用户聊天头像和聊天框显示文件,用于显示用户的聊天内容。
4、封装聊天信息实体类
创建一个ChatBean类,在该类中创建机器人与用户聊天信息的属性,重写了get和set方法。
packagecom.example.ffshixun;publicclassChatBean{publicstaticfinalintSEND=1;//发送消息publicstaticfinalintRECEIVE=2;//接收消息privateintstate;//消息的状态(是接收还是发送)privateStringmessage;//消息的内容publicintgetState(){returnstate;}publicvoidsetState(intstate){this.state=state;}publicStringgetMessage(){returnmessage;}publicvoidsetMessage(Stringmessage){this.message=message;}}5、编写聊天列表适配器
创建一个ChatAdapter类,由于聊天界面用了ListView控件显示聊天信息,因此需要创建一个数据适配器ChatAdapter对ListView控件进行数据适配。
packagecom.example.ffshixun;importandroid.content.Context;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.TextView;importjava.util.List;importzj.dzh.intelrobot.R;publicclassChatAdapterextendsBaseAdapter{privateListchatBeanList;//聊天数据privateLayoutInflaterlayoutInflater;publicChatAdapter(ListchatBeanList,Contextcontext){this.chatBeanList=chatBeanList;layoutInflater=LayoutInflater.from(context);}@OverridepublicintgetCount(){returnchatBeanList.size();}@OverridepublicObjectgetItem(intposition){returnchatBeanList.get(position);}@OverridepubliclonggetItemId(intposition){returnposition;}@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){Holderholder=newHolder();//判断当前的消息是发送的消息还是接收到的消息,不同消息加载不同的viewif(chatBeanList.get(position).getState()==ChatBean.RECEIVE){//加载左边布局,也就是机器人对应的布局信息convertView=layoutInflater.inflate(R.layout.chatting_left_item,null);}else{//加载右边布局,也就是用户对应的布局信息convertView=layoutInflater.inflate(R.layout.chatting_right_item,null);}holder.tv_chat_content=(TextView)convertView.findViewById(R.id.tv_chat_content);holder.tv_chat_content.setText(chatBeanList.get(position).getMessage());returnconvertView;}classHolder{publicTextViewtv_chat_content;//聊天内容}}6、实现智能机器人通信
在项目MainActivity中实现聊天界面的逻辑代码,首先添加okhttp库,然后设置机器人的欢迎信息,最后编写界面交互代码。
packagecom.example.ffshixun;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.telecom.Call;importandroid.text.TextUtils;importandroid.view.KeyEvent;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.ListView;importandroid.widget.Toast;importandroidx.appcompat.app.AppCompatActivity;importorg.json.JSONException;importorg.json.JSONObject;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importokhttp3.Call;importokhttp3.Callback;importokhttp3.OkHttpClient;importokhttp3.Request;importokhttp3.Response;importzj.dzh.intelrobot.R;publicclassMainActivityextendsAppCompatActivity{privateListViewlistView;privateChatAdapteradapter;privateListchatBeanList;//存放所有聊天数据的集合privateEditTextet_send_msg;privateButtonbtn_send;//接口地址privatestaticfinalStringWEB_SITE="http://www.tuling123.com/openapi/api";//唯一key,该key的值是从官网注册账号获取的,注册地址为:http://www.tuling123.com/privatestaticfinalStringKEY="d2001c59d6af4c51b4eff1535fbf81ec";privateStringsendMsg;//发送的信息privateStringwelcome[];//存储欢迎信息privateMHandlermHandler;publicstaticfinalintMSG_OK=1;//获取数据@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);chatBeanList=newArrayList();mHandler=newMHandler();//获取内置的欢迎信息welcome=getResources().getStringArray(R.array.welcome);initView();//初始化界面控件}publicvoidinitView(){listView=(ListView)findViewById(R.id.list);et_send_msg=(EditText)findViewById(R.id.et_send_msg);btn_send=(Button)findViewById(R.id.btn_send);adapter=newChatAdapter(chatBeanList,this);listView.setAdapter(adapter);btn_send.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){sendData();//点击发送按钮,发送信息}});et_send_msg.setOnKeyListener(newView.OnKeyListener(){@OverridepublicbooleanonKey(Viewv,intkeyCode,KeyEventkeyEvent){if(keyCode==KeyEvent.KEYCODE_ENTER&&keyEvent.getAction()==KeyEvent.ACTION_DOWN){sendData();//点击Enter键也可以发送信息}returnfalse;}});intposition=(int)(Math.random()*welcome.length-1);//获取一个随机数showData(welcome[position]);//用随机数获取机器人的首次聊天信息}privatevoidsendData(){sendMsg=et_send_msg.getText().toString();//获取你输入的信息if(TextUtils.isEmpty(sendMsg)){//判断是否为空Toast.makeText(this,"您还未输入任何信息哦",Toast.LENGTH_LONG).show();return;}et_send_msg.setText("");//替换空格和换行sendMsg=sendMsg.replaceAll("","").replaceAll(" ","").trim();ChatBeanchatBean=newChatBean();chatBean.setMessage(sendMsg);chatBean.setState(chatBean.SEND);//SEND表示自己发送的信息chatBeanList.add(chatBean);//将发送的信息添加到chatBeanList集合中adapter.notifyDataSetChanged();//更新ListView列表getDataFromServer();//从服务器获取机器人发送的信息}privatevoidgetDataFromServer(){OkHttpClientokHttpClient=newOkHttpClient();Requestrequest=newRequest.Builder().url(WEB_SITE+"?key="+KEY+"&info="+sendMsg).build();Callcall=okHttpClient.newCall(request);//开启异步线程访问网络call.enqueue(newCallback(){@OverridepublicvoidonFailure(Callcall,IOExceptione){}@OverridepublicvoidonResponse(Callcall,Responseresponse)throwsIOException{Stringres=response.body().string();Messagemsg=newMessage();msg.what=MSG_OK;msg.obj=res;mHandler.sendMessage(msg);}});}//事件捕获classMHandlerextendsHandler{@OverridepublicvoiddispatchMessage(Messagemsg){super.dispatchMessage(msg);switch(msg.what){caseMSG_OK:if(msg.obj!=null){StringvlResult=(String)msg.obj;paresData(vlResult);}break;}}}privatevoidparesData(StringJsonData){//Json解析try{JSONObjectobj=newJSONObject(JsonData);Stringcontent=obj.getString("text");//获取的机器人信息intcode=obj.getInt("code");//服务器状态码updateView(code,content);}catch(JSONExceptione){e.printStackTrace();showData("主人,你的网络不好哦");}}privatevoidshowData(Stringmessage){ChatBeanchatBean=newChatBean();chatBean.setMessage(message);chatBean.setState(ChatBean.RECEIVE);//机器人发送的消息chatBeanList.add(chatBean);//将机器人发送的消息添加到chatBeanList集合中adapter.notifyDataSetChanged();}privatevoidupdateView(intcode,Stringcontent){//code有很多形状,在此例举几种。switch(code){case4004:showData("主人,今天我累了,我要休息了,明天再来找我耍吧");break;case40005:showData("主人,你说的是火星语吗?");break;case40006:showData("主人,我今天要去约会哦,改天再聊哦。");break;case40007:showData("主人,明天再和你耍啦,我感冒了,呜呜呜。。。");break;default:showData(content);break;}}protectedlongexitTime;//记录第一次点击时的时间@OverridepublicbooleanonKeyDown(intkeyCode,KeyEventevent){if(keyCode==KeyEvent.KEYCODE_BACK&&event.getAction()==KeyEvent.ACTION_DOWN){if((System.currentTimeMillis()-exitTime)>2000){Toast.makeText(MainActivity.this,"再按一次退出聊天程序",Toast.LENGTH_SHORT).show();exitTime=System.currentTimeMillis();}else{MainActivity.this.finish();System.exit(0);}returntrue;}returnsuper.onKeyDown(keyCode,event);}privateclassOkHttpClient{}}在MainActivity中创建几个方法:
initView()用于获取界面控件并初始化界面数据;showData()用于显示欢迎信息到界面上;sendData()用于用户发送信息;getDataFromServer()从服务器获取机器人的回复信息;updateView()更新界面信息;3 调试过程
运行会会有随机的欢迎消息,可以在回复设置里面自定义修改。发英文字母a,b,c,它会自动往下接,实现了单人聊天。
4 功能测试
4.1测试仪器与设备
Androidstudio 笔记本电脑
4.2性能指标测试
实现联网自动对话,发送功能,未实现发送、删除等功能。
5 实训心得体会
安卓实训结束了,通过对智能聊天机器人的开发设计,对Android应用开发有了更为深层次的理解,对手机应用也有了全新的认识于熟练,对基于Android多种布局以及第三方软件API的引用有了更深层次的理解。实训前对android的应用操作还不熟悉,实训结束后终于知道了个步骤操作。本机器人聊天系统基本上实现了需求中的全部功能需求,整体上较为满意。本应用的难点在于如何设置的不同布局,以及跳转,实现聊天的效果。学完后,加深了对布局的理解,为以后开发类似程序打下了基础。但是自己对安卓的很多方面还不是很了解,各种方法也不是很会使用,实训过后自己还会加强对安卓应用设计的学习。
6 参考文献
[1] 张思民.Android Studio(第二版).北京:清华大学出版社,2017
附录
相关图片
程序清单
链接:https://pan.baidu.com/s/1yywLy4soGEQ9YNR8PEePtg 提取码:1314
Android智能聊天机器人
智能聊天机器人一、概述(一)研究背景随着科技的快速发展,机器人技术及其产业也发展迅速.越来越多各式各样的机器人被应用到社会生产的各个行业以及社会生活的各个领域,他们发挥着越来越重要的作用.智能机器人的研究备受关注越来越多,成为当今热点问题.本次介绍了基于Android的平台的智能机器人研究,机器人可以聊天,报天气预报,讲笑话等功能.
(二)研究意义聊天机器人在很多大型App上都有使用,比如QQ群里的QQ小冰,淘宝京东等App上在没有人工客服之前会有机器人跟你聊天,根据你发的问题关键词,向你推荐一些答案,可以省下很多人工的时间以及减小服务器的压力。
二、系统设计(一)关键设计先申请图灵机器人API官网注册一个账号。图灵机器人官网进行了更新,API连接做了改变,所以网站的接口地址换了。请求方式改为httpget。我们的Robot类中新增一个静态字符串成员ID是我们在图灵官网注册的用户ID。以传输json为参数,返回得到的json字符串。
(二)系统设计1.系统管理结构聊天界面用了ListView控件显示聊天信息,因此需要创建一个数据适配器ChatAdapter对ListView控件进行数据适配。所以要创建一个ChatAdapter类。getView方法内用if和else语句判断当前的消息是发送的消息还是接收到的消息,不同消息加载不同的view。如果是接收消息,说明就是机器人发的消息,那就加载左边布局;如果是发送消息,说明就是用户发的消息,则加载右边布局。
2.类的设计ChatMessage类声明的变量有名字、聊天信息、类型和时间。Result类声明的变量有code码和信息。添加网络权限和依赖
配置自己的图灵机器人主Java的实现过程 布局的实现:整个界面最外层采用线性布局,在最大的LinearLayout中先设置了一个TextView用来显示聊天窗口的文本为机器人。接着在TextView下面放置了一个RelativeLayout,在它里面先放置了一个ListView,用于显示聊天消息列表。然后放置了一个小的RelativeLayout,里面放置了一个Button和一个EditText,Button在EditText右侧,文本为“发送”,作为发送按钮,EditText则是聊天输入框,在里面输入聊天内容。 网络请求:设置文件类型,设置接收类型,往服务器里面发送数据,连接请求的内容后http获取的内容解析之后的结果给聊天信息赋值。 安卓版本变高,系统安全方面受到的限制也变多,我们这里到图灵机器人官网的网络连接,可能被系统视为不完全的,导致连接失败。我们需要添加的操作在res文件夹中新建一个xml文件夹,放入network_security_config.xml。
四、系统测试Log调试,查看是否收到官网回复的json 机器人能进行日常的对话,比如讲笑话和回复天气。
五、设计总结在本项目的实现过程中,熟悉了网络请求、JSON解析、Handler处理等知识点,这些知识点会在后来Android项目中经常使用。按照老师发的博客的步骤,一步一步的来就能很好的完成这个实验。遇到最大的困难可能就是网络请求的问题,由于图灵网的更新我们的代码也需要做新的改变,我们可以查看官网的文档接入。也是通过查询相关的博客才能一点一点的把问题解决。有许多的坑需要我们慢慢发现,比如官网的密钥不能打开,这也是我们需要修行的地方,遇到问题查看问题解决问题。能通过这样一个小小程序,体会到编程的乐趣,这个项目的性价比还是很高的。代码放在这啦!