聊天机器人(基于android)
1.本人最近写了一个小项目关于语音聊天的,采用讯飞语音引擎和数据,看看效果
2.项目名称叫小秘书,它可以和你进行交互,可以通过语音聊天,蛮有意思的,聊天内容你也可以定制
3.如果想做这款应用,先看看我前面写的语音识别
http://www.cnblogs.com/huipengbo/p/7043384.html
4.先看清单文件
<?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-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<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"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="18" /> <application
android:allowBackup="true"
android:icon="@drawable/login_user_selected"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".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>
5.在看布局
主界面布局
<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/lv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:background="@drawable/detail_btn_bg_normal">
<Button android:layout_width="wrap_content"
android:onClick="click"
android:layout_height="wrap_content"
android:background="@drawable/bt_selector"
android:text="开始和小秘对话"
android:padding="5dp"
/>
</LinearLayout> </LinearLayout>
item布局展示
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dp" > <LinearLayout
android:id="@+id/ll_up"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="2dp" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/category_mama01"
android:gravity="center_vertical"
android:padding="4dp"
android:text="貂蝉"
android:textSize="18sp" /> <TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="哈鲁kljflgjdljgdlf"
android:textColor="#008"
android:textSize="18sp" />
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:src="@drawable/logo"
android:layout_height="wrap_content"/>
</LinearLayout> <RelativeLayout
android:id="@+id/ll_down"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"> <TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:drawableRight="@drawable/app_icon"
android:gravity="center_vertical"
android:padding="4dp"
android:textColor="#000"
android:text="我"
android:textSize="18sp" /> <TextView
android:id="@+id/tv3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/tv2"
android:textColor="#080"
android:textSize="18sp" /> </RelativeLayout> </LinearLayout>
6.资源配置和资产配置,资产配置参考语音识别那节随笔
7.上源代码,有三个文件
@1MainActivity文件
package com.example.chat; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import com.example.chat.VoiceBean.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; import android.app.Activity;
import android.os.Bundle;
import android.provider.Telephony.Sms.Conversations;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
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.RelativeLayout;
import android.widget.TextView; public class MainActivity extends Activity { StringBuffer strbuf;
ListView mlv;
private List<TalkBean> lists;
MyAdapter adapter; private String[] answers = new String[]{"约吗?","想我吗?","我漂亮吗","喜欢我吗?","有没有做饭的想法啊","来不来?","你女朋友有我漂亮吗?","想吃我做的菜吗?",
"看见我有没有年轻的冲动","来嘛,人家要玩游戏啊","帅哥,我受不了你神经的样子","看我的身材好不","我胸丰满不","哥哥,你快点把水拿过来","晚上请我看电影,好吗?","最近有没有回家吗?"}; private int []imges = new int[]{R.drawable.m1,R.drawable.m2,R.drawable.m3,R.drawable.m4,R.drawable.m5,
R.drawable.m6,R.drawable.m7,R.drawable.m8,R.drawable.m9,R.drawable.m10,
R.drawable.m11,R.drawable.m12,R.drawable.m13,R.drawable.m14,R.drawable.m15,R.drawable.after19};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化语音配置对象,必须,这样才能使用MSC语音服务
SpeechUtility.createUtility(this, SpeechConstant.APPID+"=59454d78");
mlv = (ListView) findViewById(R.id.lv);
lists = new ArrayList<TalkBean>(); adapter = new MyAdapter(); mlv.setAdapter(adapter); } public void click(View view){
//创建语音识别对话框
RecognizerDialog rd = new RecognizerDialog(this,null);
//设置参数accent,language等参数
rd.setParameter(SpeechConstant.LANGUAGE,"zh_cn");//中文
rd.setParameter(SpeechConstant.ACCENT,"mandarin");//普通话
strbuf = new StringBuffer();
//设置回调接口
rd.setListener(new RecognizerDialogListener() { @Override
public void onResult(RecognizerResult arg0, boolean arg1) {
// TODO Auto-generated method stub
String result = arg0.getResultString();
String data = parseJsonData(result);
Log.e("data",data); strbuf.append(data);
if(arg1){//回话结束
String voice = strbuf.toString();
Log.e("result",voice);
//初始化提问对象
TalkBean tb = new TalkBean(voice, -1, true);
lists.add(tb);
String ans = "没听清楚,哥哥";
int imgid = -1;
if(voice.contains("你好")){
ans = "你好啊";
}else if(voice.contains("你是")){
ans = "我是穿越来的貂蝉";
}else if(voice.contains("美女")|| voice.contains("我想你")){
//随机回答
ans = answers [(int) (Math.random()*answers.length)];
imgid = imges[(int) (Math.random()*imges.length)];
}else if(voice.contains("照片")){
ans ="这个就是我本人,漂亮吧";
imgid = imges[(int) (Math.random()*imges.length)];
}else if(voice.contains("天王盖地虎")){
ans = "宝塔镇河妖";
imgid =R.drawable.logo;
}else if(voice.contains("漂亮")){
ans = "谢谢哥哥夸奖";
}else if(voice.contains("干")){
ans = "来吧,干杯吧";
imgid = imges[(int) (Math.random()*imges.length)];
}
TalkBean tbans = new TalkBean(ans, imgid, false);
lists.add(tbans); //数据改变刷新适配器listview
adapter.notifyDataSetChanged(); //让listview始终显示最后一个
mlv.setSelection(lists.size()-1);
//将要说的话读出来
read(ans);
} } @Override
public void onError(SpeechError arg0) {
// TODO Auto-generated method stub }
});
//显示对话框
rd.show();
}
/**
* 解析json串
* @param result
*/
protected String parseJsonData(String json) {
// 使用Gson来解析Json串
Gson gson = new Gson();
VoiceBean bean = gson.fromJson(json, VoiceBean.class);
ArrayList<WS> ws = bean.ws;
StringBuffer sb = new StringBuffer();
for (WS ws2 : ws) {
String info = ws2.cw.get(0).w;
sb.append(info);
}
return sb.toString();
} /**
* 语音合成
* @param view
*/
public void read(String text){
//创建合成器对象
SpeechSynthesizer ss = SpeechSynthesizer.createSynthesizer(this, null);
//设置参数
ss.setParameter(SpeechConstant.VOICE_NAME, "xiaoqi");//设置发音人
ss.setParameter(SpeechConstant.SPEED, "30");//语速设置
ss.setParameter(SpeechConstant.VOLUME, "80");//设置音量
ss.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);//设置为云端类型
//ss.setParameter(SpeechConstant.TTS_AUDIO_PATH, "/mnt/sdcard/if.pcm");//设置音频保存路径,不用则注释 //开始合成语音
ss.startSpeaking(text, null); } class MyAdapter extends BaseAdapter{ @Override
public int getCount() {
// TODO Auto-generated method stub
return lists.size();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return lists.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) {
ViewHolder vh = null;
if(convertView == null){
convertView = View.inflate(getApplicationContext(), R.layout.list_item, null);
vh = new ViewHolder();
vh.ll_answer = (LinearLayout)convertView.findViewById(R.id.ll_up);
vh.tvanswer = (TextView)convertView.findViewById(R.id.tv1);
vh.ivanswer = (ImageView) convertView.findViewById(R.id.iv); vh.rl_ask = (RelativeLayout)convertView. findViewById(R.id.ll_down);
vh.tvask = (TextView) convertView.findViewById(R.id.tv3); convertView.setTag(vh);
}else{
vh = (ViewHolder) convertView.getTag();
}
TalkBean tb = (TalkBean) getItem(position); if(tb.isAsk){//如果是问,则不显示回答的一方
vh.ll_answer.setVisibility(View.GONE);
vh.rl_ask.setVisibility(View.VISIBLE);
vh.tvask.setText(tb.text);
}else{//如果是回答,则不显示问的一方
vh.ll_answer.setVisibility(View.VISIBLE);
vh.rl_ask.setVisibility(View.GONE);
vh.tvanswer.setText(tb.text);
//图片
if(tb.imageId>0){
vh.ivanswer.setVisibility(View.VISIBLE);
vh.ivanswer.setImageResource(tb.imageId);
}else{
vh.ivanswer.setVisibility(View.GONE);
}
} return convertView;
} } static class ViewHolder{
public LinearLayout ll_answer;
public TextView tvanswer;
public ImageView ivanswer; public RelativeLayout rl_ask;
public TextView tvask; }
}
@2问答数据封装类
package com.example.chat;
/*
* 提问与回答的bean
*/
public class TalkBean { public String text;
public int imageId;
public boolean isAsk; public TalkBean(String text, int imageId, boolean isAsk) {
super();
this.text = text;
this.imageId = imageId;
this.isAsk = isAsk;
} }
@3返回的json数据封装类
package com.example.chat; import java.util.ArrayList; public class VoiceBean { public ArrayList<WS> ws; public class WS{
public ArrayList<CW> cw; } public class CW{
public String w;//说话的文字信息
} }
8.引用的库如下
聊天机器人(基于android)的更多相关文章
- 智能聊天机器人——基于RASA搭建
前言: 最近了解了一下Rasa,阅读了一下官方文档,初步搭建了一个聊天机器人. 官方文档:https://rasa.com/docs/ 搭建的chatbot项目地址: https://github.c ...
- AI中台——智能聊天机器人平台的架构与应用(分享实录)
内容来源:宜信技术学院第3期技术沙龙-线上直播|AI中台——智能聊天机器人平台 主讲人:宜信科技中心AI中台团队负责人王东 导读:随着“中台”战略的提出,目前宜信中台建设在思想理念及架构设计上都已经取 ...
- ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档]
ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档] 简介 简单地说就是该有的都有了,但是总体跑起来效果还不好. 还在开发中,它工作的效果还不好.但是你可以直 ...
- 深度学习项目——基于循环神经网络(RNN)的智能聊天机器人系统
基于循环神经网络(RNN)的智能聊天机器人系统 本设计研究智能聊天机器人技术,基于循环神经网络构建了一套智能聊天机器人系统,系统将由以下几个部分构成:制作问答聊天数据集.RNN神经网络搭建.seq2s ...
- 基于PaddlePaddle的语义匹配模型DAM,让聊天机器人实现完美回复 |
来源商业新知网,原标题:让聊天机器人完美回复 | 基于PaddlePaddle的语义匹配模型DAM 语义匹配 语义匹配是NLP的一项重要应用.无论是问答系统.对话系统还是智能客服,都可以认为是问题和回 ...
- 计算机网络课设之基于UDP协议的简易聊天机器人
前言:2017年6月份计算机网络的课设任务,在同学的帮助和自学下基本搞懂了,基于UDP协议的基本聊天的实现方法.实现起来很简单,原理也很简单,主要是由于老师必须要求使用C语言来写,所以特别麻烦,而且C ...
- 基于Android Classic Bluetooth的蓝牙聊天软件
代码地址如下:http://www.demodashi.com/demo/12133.html BluetoothChat 基于Android Classic Bluetooth的蓝牙聊天软件,目前仅 ...
- 人工智能不过尔尔,基于Python3深度学习库Keras/TensorFlow打造属于自己的聊天机器人(ChatRobot)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_178 聊天机器人(ChatRobot)的概念我们并不陌生,也许你曾经在百无聊赖之下和Siri打情骂俏过,亦或是闲暇之余与小爱同学谈 ...
- vue-miniQQ——基于Vue2实现的仿手机QQ单页面应用(接入了聊天机器人,能够进行正常对话)
使用Vue2进行的仿手机QQ的webapp的制作,作品由个人独立开发,源码中进行了详细的注释. 由于自己也是初学Vue2,所以注释写的不够精简,请见谅. 项目地址 https://github.com ...
- 我用 tensorflow 实现的“一个神经聊天模型”:一个基于深度学习的聊天机器人
概述 这个工作尝试重现这个论文的结果 A Neural Conversational Model (aka the Google chatbot). 它使用了循环神经网络(seq2seq 模型)来进行 ...
随机推荐
- “战术竞技类”外挂打击已开始!揭秘腾讯We Test游戏安全服务新动作!
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/353.html We Test导读 国服PUBG的游戏安全将由我 ...
- 《java.util.concurrent 包源码阅读》20 DelayQueue
DelayQueue有序存储Delayed类型或者子类型的对象,没当从队列中取走元素时,需要等待延迟耗完才会返回该对象. 所谓Delayed类型,因为需要比较,所以继承了Comparable接口: p ...
- Java 操作 Json
1. 使用Gson构建Json 初始化 JsonObject jsonObject = new JsonObject(); 添加属性 jsonObject.addProperty("name ...
- Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- react入门到进阶(二)
一.react属性与事件 1.State属性 State,翻译过来是状态的意思,所以它就代表着组件的状态.React把用户界面(UI)当做是状态机,想象它有不同的状态然后渲染这些状态,可以轻松让用户界 ...
- gcc & gdb & make 定义与区别
GCC 通常所说的GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码. ...
- springmvc中对日期格式化的处理
@DateTimeFormat(pattern="yyyy-MM-dd") 返回的时候java.util.Date pattern="yyyy-MM-dd"必须 ...
- Spring MVC 学习总结(九)——Spring MVC实现RESTful与JSON(Spring MVC为前端提供服务)
很多时候前端都需要调用后台服务实现交互功能,常见的数据交换格式多是JSON或XML,这里主要讲解Spring MVC为前端提供JSON格式的数据并实现与前台交互.RESTful则是一种软件架构风格.设 ...
- javascript设计模式——职责链模式
前面的话 职责链模式的定义是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.职责链模式的名字非常形象,一 ...
- Codeforces 482B Interesting Array
题意:构造一个长度为n的序列,使其满足m个形式如下如下约束:a[l]&a[l+1]&a[l+2]&....&a[r]=q 从Dalao的博客上看到这题,决定去水水.做法 ...