聊天机器人(基于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.引用的库如下

时间: 2024-11-05 16:24:43

聊天机器人(基于android)的相关文章

基于torch学汪峰写歌词、聊天机器人、图像着色/生成、看图说话、生成字幕

手把手教你基于torch玩转 学汪峰写词.自动聊天机器人.图像着色.图像生成.看图说话.生成字幕 作者:骁哲.李伟.小蔡.July.说明:本教程出自七月在线开发/市场团队.及七月在线5月深度学习班学员之手,有何问题欢迎加Q群交流:472899334.时间:二零一六年十月十二日. 前言 我们教梵高作画的教程发布之后,国庆7天,上百位朋友一一陆续动手尝试,大有全民DL.全民实验之感.特别是来自DL班的小蔡同学,国庆7天连做10个开源实验,并把这10个实验的简易教程(含自动聊天机器人)发布在社区上:h

基于Perfect用Swift语言编写Slack聊天机器人

基于Perfect用Swift语言编写Slack聊天机器人 本项目是专门为Slack聊天机器人定制的模板服务器. 完整的源代码下载在Github https://github.com/PerfectServers/SlackBot 在本项目模板中,一个聊天机器人可以加入授权频道,读取频道内所有用户发送的"曲奇"并记录在案,而且可以直接答复用户的有关曲奇饼干的问题. 预备知识 在您决定编译.测试或者部署您自己的基于Perfect软件框架体系的聊天机器人之前,以下基础知识??不可或缺??:

【开源】一个基于智能问答的聊天机器人实现

智能问答应当是未来智能化发展中人机交互的主要方式,目前无论是在开源社区或者企业应用中,都有广泛的应用. 项目名称是Iveely.Brain,本次源码可以在Github的这里下载,,是主要用于聊天服务的一个项目,本次开源版本的示例如下所示: 整个开源版本分为两种模式:本地模式和远程模式.本地模式是开发环境的调试模式,主要用于测试准确性问题:远程模式主要应用于正式线上环境,通过TCP(默认端口8001)的方式提供对外服务(也可改为restful API的形式).智能问答的核心在于聊天语料和知识推理两

Android开发-图灵聊天机器人接口引用

转载注明出处: http://www.cnblogs.com/frank-zouxu/p/4121601.html  在前几日,偶然看到新闻,图灵机器人向开发者提供了API,API地址为:http://www.tuling123.com/openapi/,因为这个API可以定制自己的聊天机器人,这在我看来,是个很有意思的事情,于是我就试着在Android应用中进行了API测试,效果图如下(图1): 图1 主要代码如下: public class MainActivity extends Acti

10分钟实现android聊天机器人

转载自:http://myapptg.com/forum.php?mod=viewthread&tid=50&extra= Android开发,10分钟使用api,快速实现聊天机器人,功能很强大哦,集成十分十分简单.本例也模仿qq聊天气泡,实现起来也是很简单的 说明,不是单纯的内置聊天信息,机器人会根据您输入的信息,自动回复你,相当智能. 看下图,是不是觉得在和一个真人聊天? 没错,其实它就是一个机器人,自动根据你发的信息,可以自动回复您 源码地址: http://download.csd

Android学习之智能聊天机器人(图灵机器人)

今天我们来分享一个有趣的应用:Android版的智能聊天机器人 开发工具:Eclipse 开发时间:2015/07/07 所用技术:图灵机器人API  网络通信之异步请求 接口回调  自定义Adapter 下面我将详细叙述开发的步骤: 第一步:申请图灵机器人的API KEY 方法很简单,只需要在图灵机器人API官网注册一个账号,注册成功之后,会显示一个API KEY 图灵机器人API 账号注册网址:图灵机器人 注册成功后,点击平台接入,认真看一下API接入的流程 第二步:开始创建工程进行编码,首

从零开始优化基于RuleBased的聊天机器人

这里记录从最基础的基于规则的聊天机器人,升级到基于逻辑的机器人,再升级到调用Google提供的API来让机器人能说.会听普通话. 最基本的完全基于规则式的问答:问什么就答什么,幼儿园水平. import random # 打招呼greetings = ['hola', 'hello', 'hi', 'Hi', 'hey!','hey']# 回复打招呼random_greeting = random.choice(greetings) # 对于"你怎么样?"这个问题的回复question

vue-miniQQ——基于Vue2实现的仿手机QQ单页面应用(接入了聊天机器人,能够进行正常对话)

使用Vue2进行的仿手机QQ的webapp的制作,作品由个人独立开发,源码中进行了详细的注释. 由于自己也是初学Vue2,所以注释写的不够精简,请见谅. 项目地址 https://github.com/jiangqizheng/vue-MiniQQ 项目已实现功能 对话功能--想着既然是QQ总要能进行对话交流,所以在项目中接入了图灵聊天机器人,可以与列表中的每个人物进行对话. 左滑删除--左滑删除相关消息. 搜索页面--点击右上角搜索按钮,能够进入搜索页面,输入对应的单词或者数字,动态查找好友.

用tensorflow框架搭建基于seq2seq-attention的聊天机器人

Tensorflow版本: GPU: 1.12.0 理论部分: 参考:https://www.bilibili.com/video/av19080685,讲解的超级详细. 代码部分: 1.语料库预处理 2.搭建模型计算图 3.启动session会话,进行模型训练. 文件夹图示如下:其中data文件夹存储对话语料,ids文件夹存储词语和id之间的映射关系,tmp文件夹存储了整个的字典以及word2vec模型,checkpoint文件存储了tensorflow训练的模型. 进入代码实战部分: 首先得

【智能聊天机器人】小花猫的成长之路——1.初生

大家好,我是大花猫~ 为了响应慕女神MM的号召,我也来把最近开始学习HTML5移动webApp开发的一些心得和经验分享出来~ 先自我介绍一下,我是一枚位于魔都上海的处女座Android攻城狮(- - )~ 一次机缘巧合情况下来到慕课网,并跟着<慕课网2048私人定制>这个教学视频学着写了一个属于我自己的2048(升职版),又在机缘巧合情况下参加了慕课举办的2048源码比赛,又机缘巧合下拿了一等奖!0.0 ! 从此爱上了慕课网~~~ -------以上为开场白,下面进入主题-------- 我这