android智能聊天机器人
来源:互联网 发布:能源号 模拟软件 编辑:程序博客网 时间:2024/04/28 17:54
本人是某211高校计算机研究生研一的学生,自学android已经接近一年,做过几个android的小项目,平时都是学习大牛的博客,学习别人的代码,学习别人方法,得到了许多经验和提高,我觉得现在也是我回报大家的时候啦,这是我第一次写博客,一方面记录重要的代码,另一方面,共享代码。下面就是一个小app:
讯飞开放平台实现智能聊天机器人
1.首先你的注册一个讯飞开放平台的帐号:
[讯飞开放云平台地址](http://www.xfyun.cn/)
2.创建一个新应用
3单击SDK下载
4.组合服务SDK下载
5.选择语音听写、语音合成服务
6.选择android版本
7.选择你新建的应用
8.下载sdk
9.将下载的Android_voice解压。
10.打开eclipse,新建应用,如VoiceTest
11.将Android_voice/libs下的jar包导入VoiceTest项目
12.将Android_voice/asset目录下的iflytek文件夹拷贝到VoiceTest项目下的asset文件夹下
13.添加权限AndroidManifest.xml文件全部代码
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.chat" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <!--连接网络权限,用于执行云端语音能力 --> <uses-permission android:name="android.permission.INTERNET"/> <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 --> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <!--读取网络信息状态 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!--获取当前wifi状态 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!--允许程序改变网络连接状态 --> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <!--读取手机信息权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!--读取联系人权限,上传联系人需要用到此权限 --> <uses-permission android:name="android.permission.READ_CONTACTS"/> <!--外存储写入权限,构建语法需要用到此权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.chat.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
14.Mainactivity代码:
package com.example.chat;import java.util.ArrayList;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;import com.example.chat.JsonBean.WS;import com.google.gson.Gson;import com.iflytek.cloud.RecognizerResult;import com.iflytek.cloud.SpeechConstant;import com.iflytek.cloud.SpeechError;import com.iflytek.cloud.SpeechSynthesizer;import com.iflytek.cloud.SpeechUtility;import com.iflytek.cloud.ui.RecognizerDialog;import com.iflytek.cloud.ui.RecognizerDialogListener;public class MainActivity extends Activity { private StringBuffer msb; private ArrayList<TalkBean> talkBeanslist=new ArrayList<TalkBean>(); private String[] answers=new String[]{ "约吗","漂亮吗","这张怎么样","我美吗","我很清纯的" }; private int[] pics=new int[]{ R.drawable.p1,R.drawable.p2,R.drawable.p3,R.drawable.p4 }; private ListView lvlist; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 将“12345678”替换成您申请的 APPID,申请地址:http://www.xfyun.cn // 请勿在“=”与 appid 之间添加任务空字符或者转义符 SpeechUtility createUtility = SpeechUtility.createUtility(this, SpeechConstant.APPID +"=571aebc0"); lvlist = (ListView)findViewById(R.id.lvlist); } public void speak(String answercontent){ //1.创建 SpeechSynthesizer 对象, 第二个参数:本地合成时传 InitListener SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(getApplicationContext(), null); //2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类 //设置发音人(更多在线发音人,用户可参见 附录12.2 mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan"); //设置发音人 mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速 mTts.setParameter(SpeechConstant.VOLUME, "80");//设置音量,范围 0~100 mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端 //设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm” //保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限 //仅支持保存为 pcm 和 wav 格式,如果不需要保存合成音频,注释该行代码 mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm"); //3.开始合成 mTts.startSpeaking(answercontent, null); } /** * 语音听写 * @param v */ public void listen(View v){ msb=new StringBuffer(); //1.创建RecognizerDialog对象 RecognizerDialog mDialog = new RecognizerDialog(this, null); //2.设置accent、language等参数 mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); mDialog.setParameter(SpeechConstant.ACCENT, "mandarin"); //若要将UI控件用于语义理解,必须添加以下参数设置,设置之后onResult回调返回将是语义理解 //结果 // mDialog.setParameter("asr_sch", "1"); // mDialog.setParameter("nlp_version", "2.0"); //3.设置回调接口 mDialog.setListener(new RecognizerDialogListener() { //听写结果回调接口(返回Json格式结果,用户可参见附录13.1); //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加; //关于解析Json的代码可参见Demo中JsonParser类; //isLast等于true时会话结束。 @Override public void onResult(RecognizerResult results, boolean isLast) { String resultString=results.getResultString(); //监听的结果:{"sn":1,"ls":false,"bg":0,"ed":0,"ws":[{"bg":0,"cw":[{"sc":0.00,"w":"不"}]}]} System.out.println("监听的结果:"+resultString); System.out.println("是否结束:"+isLast); String parseData = parseData(resultString); msb.append(parseData); if(isLast){ String askcontent=msb.toString(); //初始化提问对象 TalkBean askbean=new TalkBean(askcontent, true, -1); talkBeanslist.add(askbean); //初始化回答对象 String answercontent="没听清"; int imageid=-1; if(askcontent.contains("你好")){ answercontent="你好呀!"; }else if(askcontent.contains("你是谁")){ answercontent="我是你的小助手啊"; }else if(askcontent.contains("安徽大学")){ answercontent="安徽大学(Anhui University),简称安大(AHU),坐落于安徽省省会合肥市 ;学校是国家“211工程”重点建设高校,入选“卓越法律人才教育培养计划”,是“国家华文教育基地”和“中国政府奖学金来华留学生接收院校”,由教育部与安徽省人民政府共建。"; imageid=R.drawable.anhui; }else if(askcontent.contains("天王盖地虎")){ answercontent="宝塔镇河妖"; imageid=R.drawable.m; }else if(askcontent.contains("美女")){ answercontent=answers[(int) (Math.random()*answers.length)]; imageid=pics[(int) (Math.random()*pics.length)]; } speak(answercontent); TalkBean answerbean=new TalkBean(answercontent, false, imageid); talkBeanslist.add(answerbean); MyAdapter adapter=new MyAdapter(); adapter.notifyDataSetChanged(); lvlist.setAdapter(adapter); lvlist.setSelection(talkBeanslist.size()-1); } } @Override public void onError(SpeechError arg0) { } }); //4.显示dialog,接收语音输入 mDialog.show(); } protected String parseData(String resultString) { Gson gson=new Gson(); StringBuffer sb=new StringBuffer(); JsonBean jsonBean = gson.fromJson(resultString, JsonBean.class); ArrayList<WS> ws = jsonBean.ws; for (WS w : ws) { String string = w.cw.get(0).w; sb.append(string); } return sb.toString(); } class MyAdapter extends BaseAdapter{ @Override public int getCount() { // TODO Auto-generated method stub return talkBeanslist.size(); } @Override public TalkBean getItem(int position) { // TODO Auto-generated method stub return talkBeanslist.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHodler viewhodler; if(convertView==null){ convertView=View.inflate(getApplicationContext(), R.layout.list_item, null); viewhodler=new ViewHodler(); viewhodler.tvask=(TextView) convertView.findViewById(R.id.tv_ask); viewhodler.tvanswer=(TextView) convertView.findViewById(R.id.tv_answer); viewhodler.llanswer=(LinearLayout) convertView.findViewById(R.id.ll_answer); viewhodler.iv_pic=(ImageView) convertView.findViewById(R.id.iv_pic); convertView.setTag(viewhodler); }else{ viewhodler=(ViewHodler) convertView.getTag(); } TalkBean item = talkBeanslist.get(position); if(item.isask){ //表示是提问 viewhodler.tvask.setVisibility(View.VISIBLE); viewhodler.llanswer.setVisibility(View.GONE); viewhodler.tvask.setText(item.content); }else{ //表示是回答 viewhodler.tvask.setVisibility(View.GONE); viewhodler.llanswer.setVisibility(View.VISIBLE); viewhodler.tvanswer.setText(item.content); if(item.imageid>0){ //表示有图片 viewhodler.iv_pic.setVisibility(View.VISIBLE); viewhodler.iv_pic.setImageResource(item.imageid); }else{ viewhodler.iv_pic.setVisibility(View.GONE); } } return convertView; } } class ViewHodler{ public TextView tvask; public TextView tvanswer; public LinearLayout llanswer; public ImageView iv_pic; }}
15.解析Json需要gson-2.3.1.jar,将它导入工程,新建JsonBean类:
package com.example.chat;import java.util.ArrayList;public class JsonBean { public ArrayList<WS> ws; class WS{ public ArrayList<CW> cw; } class CW{ public String w; }}
16.新建TalkBean类:
package com.example.chat;public class TalkBean { public String content; public boolean isask; public int imageid; public TalkBean(String content, boolean isask, int imageid) { super(); this.content = content; this.isask = isask; this.imageid = imageid; }}
18.activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/lvlist" android:divider="@null" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" ></ListView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bottom_bar" android:gravity="center"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bt_selector" android:onClick="listen" android:text="按住开始语音识别" /> </LinearLayout></LinearLayout>
18.list_item.xml:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dp" > <TextView android:id="@+id/tv_ask" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:background="@drawable/asker_bubble" android:gravity="center" android:paddingLeft="10dp" android:paddingRight="15dp" android:text="提问" android:textColor="#000" android:textSize="16sp" /> <LinearLayout android:id="@+id/ll_answer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/tv_ask" android:layout_marginTop="10dp" android:background="@drawable/answer_bubble" android:orientation="vertical" android:gravity="center_vertical" android:paddingLeft="15dp" android:paddingRight="10dp" > <TextView android:id="@+id/tv_answer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="center" android:text="回答" android:textColor="#000" android:textSize="16sp" /> <ImageView android:id="@+id/iv_pic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" /> </LinearLayout></RelativeLayout>
19.上述代码需要图片资源,感兴趣的可以在我的github上下载源程序。
我的github源程序下载
2 0
- Android--智能机器人聊天
- android智能聊天机器人
- Android 实现智能机器人聊天
- Android项目之智能聊天机器人Atom
- Android 简单的智能机器人聊天软件
- 智能聊天机器人小黄鸡
- 智能聊天机器人
- 智能聊天机器人
- 智能聊天机器人
- 智能聊天机器人
- Android开发智能机器人聊天项目(1)- 异步请求数据
- Android开发智能机器人聊天项目(2)- Json数据解析
- 高智能聊天机器人 --英国
- 《智能聊天机器人小燕子》发布
- 智能聊天机器人的接口
- QQ智能聊天机器人设想
- 智能聊天机器人的效果图
- Android聊天机器人Demo
- 企业信息化战略的实现方法(摘抄)
- 起点!
- 注册表写入二进制数据
- Mysql (二) - 增删改查
- LeetCode Clone Graph
- android智能聊天机器人
- linux基础命令(5)——rm命令
- Java IO系统——RandomAccessFile类
- 三 抽象工厂模式
- OpenCV: resize
- UTF-8编码规则
- Spark组件之Spark Streaming学习4--HdfsWordCount 学习
- 常用GDB命令-整理
- 约瑟夫环