开源项目——小Q聊天机器人V1.4

小Q聊天机器人V1.0

小Q聊天机器人V1.1

小Q聊天机器人V1.2

小Q聊天机器人V1.3

GitHub:https://github.com/baiyuliang/QRobot

V1.4版本中,对来聊天界面不同消息布局进行了优化,使得聊天消息类型的扩展性更强!1.4之前的版本我们知道,我是将各种消息类型布局全部集中在了一个xml中,这种方式对少量消息类型的应用还可以,如果消息类型过多,那么这种方式就显得很low了,而且影响性能!1.4版本中,将各种消息类型逐一拆分(并且发送和接收一一对应),在adapter中根据消息类型去加载不同view:

同时使用了通用ViewHolder,我们可以比较下1.4之前版本和1.4版本中adapter的getview部分:

1.4之前:

 @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHodler hodler;
        if (convertView == null) {
            hodler = new ViewHodler();
            convertView = LayoutInflater.from(mContext).inflate(R.layout.chat_lv_item, null);
            hodler.rl_chat = (RelativeLayout) convertView.findViewById(R.id.rl_chat);//聊天布局
            //接收的消息
            hodler.fromIcon = (CircleImageView) convertView.findViewById(R.id.chatfrom_icon);//他人头像
            hodler.toIcon = (CircleImageView) convertView.findViewById(R.id.chatto_icon);//自己头像

            hodler.fromContainer = (LinearLayout) convertView.findViewById(R.id.chart_from_container);
            hodler.fromText = (TextView) convertView.findViewById(R.id.chatfrom_content);//文本
            hodler.fromImg = (ImageView) convertView.findViewById(R.id.chatfrom_img);//图片
            hodler.fromLocation = (ImageView) convertView.findViewById(R.id.chatfrom_location);//位置
            hodler.ll_music = (LinearLayout) convertView.findViewById(R.id.ll_music);//音乐
            hodler.iv_music= (ImageView) convertView.findViewById(R.id.iv_music);
            hodler.pb_music=(ProgressBar)convertView.findViewById(R.id.pb_music);
            hodler.tv_song_name = (TextView) convertView.findViewById(R.id.tv_song_name);//音乐名
            hodler.tv_song_author = (TextView) convertView.findViewById(R.id.tv_song_author);//音乐作者
            hodler.progress_load = (ProgressBar) convertView.findViewById(R.id.progress_load);//ProgressBar
            //发送的消息
            hodler.toContainer = (RelativeLayout) convertView.findViewById(R.id.chart_to_container);
            hodler.toText = (TextView) convertView.findViewById(R.id.chatto_content);//文本
            hodler.toImg = (ImageView) convertView.findViewById(R.id.chatto_img);//图片
            hodler.toLocation = (ImageView) convertView.findViewById(R.id.chatto_location);//位置
            //时间
            hodler.time = (TextView) convertView.findViewById(R.id.chat_time);

            convertView.setTag(hodler);
        } else {
            hodler = (ViewHodler) convertView.getTag();
        }

        final Msg msg = list.get(position);

        if (msg.getIsComing() == 0) {// 收到消息 from显示
            hodler.toContainer.setVisibility(View.GONE);//隐藏右侧布局
            hodler.fromContainer.setVisibility(View.VISIBLE);
            hodler.time.setText(msg.getDate());
            if (msg.getType().equals(Const.MSG_TYPE_TEXT)) {//文本类型
                hodler.fromText.setVisibility(View.VISIBLE);//文本
                hodler.fromImg.setVisibility(View.GONE);//图片
                hodler.fromLocation.setVisibility(View.GONE);//位置
                hodler.ll_music.setVisibility(View.GONE);//音乐
                hodler.progress_load.setVisibility(View.GONE);
                SpannableStringBuilder sb = ExpressionUtil.prase(mContext, hodler.fromText, msg.getContent());// 对内容做处理
                hodler.fromText.setText(sb);
                Linkify.addLinks(hodler.fromText, Linkify.ALL);//增加文本链接类型
            } else if (msg.getType().equals(Const.MSG_TYPE_IMG)) {//图片类型
                hodler.fromText.setVisibility(View.GONE);//文本
                hodler.fromImg.setVisibility(View.VISIBLE);//图片
                hodler.fromLocation.setVisibility(View.GONE);//位置
                hodler.ll_music.setVisibility(View.GONE);//音乐
                hodler.progress_load.setVisibility(View.GONE);
                finalImageLoader.display(hodler.fromImg, msg.getContent());//加载图片
            } else if (msg.getType().equals(Const.MSG_TYPE_LOCATION)) {//位置类型
                hodler.fromText.setVisibility(View.GONE);//文本
                hodler.fromImg.setVisibility(View.GONE);//图片
                hodler.fromLocation.setVisibility(View.VISIBLE);//位置
                hodler.ll_music.setVisibility(View.GONE);//音乐
                hodler.progress_load.setVisibility(View.GONE);
                finalImageLoader.display(hodler.fromLocation, msg.getContent());//加载网络图片
            } else if (msg.getType().equals(Const.MSG_TYPE_MUSIC)) {//音乐类型
                hodler.fromText.setVisibility(View.GONE);//文本
                hodler.fromImg.setVisibility(View.GONE);//图片
                hodler.fromLocation.setVisibility(View.GONE);//位置
                hodler.ll_music.setVisibility(View.VISIBLE);//音乐
                hodler.progress_load.setVisibility(View.GONE);
                if(!TextUtils.isEmpty(msg.getBak1())&&msg.getBak1().equals("1")){
                    hodler.pb_music.setVisibility(View.VISIBLE);
                    hodler.iv_music.setVisibility(View.GONE);
                }else{
                    hodler.pb_music.setVisibility(View.GONE);
                    hodler.iv_music.setVisibility(View.VISIBLE);
                }
                String[] musicinfo = msg.getContent().split(",");
                if (musicinfo.length==3) {//音乐链接,歌曲名,作者
                    hodler.tv_song_name.setText(musicinfo[1]);
                    hodler.tv_song_author.setText(musicinfo[2]);
                }
            }
        } else {// 发送消息 to显示(目前发送消息只能发送文本类型,后期将会增加其它类型)
            hodler.toContainer.setVisibility(View.VISIBLE);
            hodler.fromContainer.setVisibility(View.GONE);
            hodler.time.setText(msg.getDate());
            if (msg.getType().equals(Const.MSG_TYPE_TEXT)) {//文本类型
                hodler.toText.setVisibility(View.VISIBLE);//文本
                hodler.toImg.setVisibility(View.GONE);//图片
                hodler.toLocation.setVisibility(View.GONE);//位置
                SpannableStringBuilder sb = ExpressionUtil.prase(mContext, hodler.toText, msg.getContent());// 对内容做处理
                hodler.toText.setText(sb);
                Linkify.addLinks(hodler.toText, Linkify.ALL);
            } else if (msg.getType().equals(Const.MSG_TYPE_IMG)) {//图片类型
                hodler.toText.setVisibility(View.GONE);//文本
                hodler.toImg.setVisibility(View.VISIBLE);//图片
                hodler.toLocation.setVisibility(View.GONE);//位置
                finalImageLoader.display(hodler.toImg, msg.getContent());//加载图片
            } else if (msg.getType().equals(Const.MSG_TYPE_LOCATION)) {//位置类型
                hodler.toText.setVisibility(View.GONE);//文本
                hodler.toImg.setVisibility(View.GONE);//图片
                hodler.toLocation.setVisibility(View.VISIBLE);//位置
                finalImageLoader.display(hodler.toLocation, msg.getContent());//加载网络图片
            }
        }

        // 文本点击
        hodler.fromText.setOnClickListener(new onClick(position));
        hodler.fromText.setOnLongClickListener(new onLongCilck(position));
        hodler.toText.setOnClickListener(new onClick(position));
        hodler.toText.setOnLongClickListener(new onLongCilck(position));
        //图片点击
        hodler.fromImg.setOnClickListener(new onClick(position));
        hodler.fromImg.setOnLongClickListener(new onLongCilck(position));
        hodler.toImg.setOnClickListener(new onClick(position));
        hodler.toImg.setOnLongClickListener(new onLongCilck(position));
        //位置
        hodler.fromLocation.setOnClickListener(new onClick(position));
        hodler.fromLocation.setOnLongClickListener(new onLongCilck(position));
        hodler.toLocation.setOnClickListener(new onClick(position));
        hodler.toLocation.setOnLongClickListener(new onLongCilck(position));
        //音乐
        hodler.ll_music.setOnClickListener(new onClick(position));
        hodler.ll_music.setOnLongClickListener(new onLongCilck(position));

        return convertView;
    }

    class ViewHodler {
        RelativeLayout rl_chat;
        CircleImageView fromIcon, toIcon;
        ImageView fromImg, fromLocation, toImg, toLocation;
        TextView fromText, toText, time;
        LinearLayout fromContainer;
        RelativeLayout toContainer;
        ProgressBar progress_load;
        //音乐
        LinearLayout ll_music;
        ImageView iv_music;
        ProgressBar pb_music;
        TextView tv_song_name, tv_song_author;
    }

1.4版本:

 final Msg msg = list.get(position);
        if (convertView == null) {
            convertView = createViewByType(msg, position);
        }

        CircleImageView head_view = ViewHolder.get(convertView, R.id.head_view);//头像
        TextView chat_time = ViewHolder.get(convertView, R.id.chat_time);//时间
        TextView tv_text = ViewHolder.get(convertView, R.id.tv_text);//文本
        ImageView iv_image = ViewHolder.get(convertView, R.id.iv_image);//图片
        ImageView iv_location = ViewHolder.get(convertView, R.id.iv_location);//位置

        LinearLayout layout_voice = ViewHolder.get(convertView, R.id.layout_voice);//语音 语音播放按钮父控件
        ImageView iv_voice = ViewHolder.get(convertView, R.id.iv_voice);//动画
        ImageView iv_fy = ViewHolder.get(convertView, R.id.iv_fy);//翻译按钮
        final TextView tv_fy = ViewHolder.get(convertView, R.id.tv_fy);//翻译内容

        LinearLayout ll_music = (LinearLayout) convertView.findViewById(R.id.ll_music);//音乐
        ImageView iv_music = (ImageView) convertView.findViewById(R.id.iv_music);
        ProgressBar pb_music = (ProgressBar) convertView.findViewById(R.id.pb_music);
        TextView tv_song_name = (TextView) convertView.findViewById(R.id.tv_song_name);//音乐名
        TextView tv_song_author = (TextView) convertView.findViewById(R.id.tv_song_author);//音乐作者

        chat_time.setText(msg.getDate());//时间

        switch (msg.getType()) {
            case Const.MSG_TYPE_TEXT://文本
                tv_text.setText(msg.getContent());
                tv_text.setOnClickListener(new onClick(position));
                tv_text.setOnLongClickListener(new onLongCilck(position));
                break;
            case Const.MSG_TYPE_IMG://图片
                finalImageLoader.display(iv_image, msg.getContent());
                iv_image.setOnClickListener(new onClick(position));
                iv_image.setOnLongClickListener(new onLongCilck(position));
                break;
            case Const.MSG_TYPE_LOCATION://位置
                finalImageLoader.display(iv_location, msg.getContent());
                iv_location.setOnClickListener(new onClick(position));
                iv_location.setOnLongClickListener(new onLongCilck(position));
                break;
            case Const.MSG_TYPE_VOICE://语音
                final String[] _content = msg.getContent().split(Const.SPILT);
                tv_fy.setText(_content[1]);
                tv_fy.setVisibility(View.GONE);
                layout_voice.setOnClickListener(new RecordPlayClickListener(mContext, iv_voice, _content[0]));
                iv_fy.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (tv_fy.getVisibility() == View.GONE) {
                            tv_fy.setVisibility(View.VISIBLE);
                        }else{
                            tv_fy.setVisibility(View.GONE);
                        }
                    }
                });
                layout_voice.setOnLongClickListener(new onLongCilck(position));
                break;
            case Const.MSG_TYPE_MUSIC://音乐
                if (!TextUtils.isEmpty(msg.getBak1()) && msg.getBak1().equals("1")) {
                    pb_music.setVisibility(View.VISIBLE);
                    iv_music.setVisibility(View.GONE);
                } else {
                    pb_music.setVisibility(View.GONE);
                    iv_music.setVisibility(View.VISIBLE);
                }
                String[] musicinfo = msg.getContent().split(Const.SPILT);
                if (musicinfo.length == 3) {//音乐链接,歌曲名,作者
                    tv_song_name.setText(musicinfo[1]);
                    tv_song_author.setText(musicinfo[2]);
                }
                ll_music.setOnClickListener(new onClick(position));
                ll_music.setOnLongClickListener(new onLongCilck(position));
                break;
        }

        return convertView;

就拿代码行数来说就非常直观,而且1.4版本中还增加了语音消息类型!代码简洁,逻辑更加清晰,扩展也更加容易,这也算的上IM应用的标准写法啦!

好了,接下来看看1.4版本中增加了哪些功能:

1.增加语音聊天功能及语音翻译功能:

1.4之前是录音完毕后转为文字并放进输入框,手动发送,而1.4版本中录音完毕后,可以转为语音形式自动发送,可点击播放,也可点击翻译按钮翻译成文字形式,类似QQ,看效果图:

看完你肯定会想问我是如何实现的,是直接识别音频文件并将音频文件转为文字吗?这么高大上?——哈哈,非也,其实我是取巧!在使用讯飞语音(录音)的参数设置代码中,看到如下代码:

 mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Const.FILE_VOICE_CACHE + "iat.wav");

这个文件就是每次说话时,自动生成的音频文件,那么你刚说完的话,直接取这个音频文件播放不就可以了吗?!当然,你需要复制这个文件或者说移动这个文件,并修改文件名,否则你原封不动的话,下次录音不久吧上次录音的文件覆盖掉了吗?

  /**
     * 移动文件
     * @param oldPath
     * @param newPath
     * @return
     */
    public static boolean copyFile(String oldPath, String newPath) {
        File oldFile = new File(oldPath);
        if (!oldFile.exists()) {
            return false;
        }
        if(oldFile.renameTo(new File(newPath))){
            return true;
        }else{
            return false;
        }
    }

音频文件路径有了,而语音识别后的文本也是讯飞直接识别后生成的,现在音频文件路径和对应的语音识别文本都有了,将其存储起来,那么所谓的语音聊天,语音翻译实现也就顺理成章了!(哎,还以为是多么高大上呢,原来是投机取巧啊^^)

2.增加录音发送形式和回复自动朗读设置:

录音以语音形式发送,即录音完毕,直接以语音形式发送;

录音以文字形式发送,即录音完毕,转为文字形式手动发送;

回复内容直接朗读,即文本形式的回复直接朗读出来!

GitHub:https://github.com/baiyuliang/QRobot

时间: 2024-10-01 21:24:45

开源项目——小Q聊天机器人V1.4的相关文章

微信小程序开发—项目实战之聊天机器人

我参加CSDN博客之星评选啦,感谢大家前往投票支持! 投票地址:http://blog.csdn.net/vote/list.html?keyword=anda0109#search 项目功能介绍 人工智能虚拟机器人"微软小冰"大家玩过吧,很酷的一个应用.发送文字.语音和图片都能得到智能的回复. 那现在我们就用小程序做一个模拟的应用,智能聊天机器人.发送文字它可以回复一段话,或一张图片,是不是有点小酷! 下面是小程序开发的一个智能聊天机器人的应用界面: 当然,这种智能回复的算法和数据库

练手的小项目(1)——智能聊天机器人

我一直坚信.即使是一个简单APP,他也有难度,假设一个复杂APP你可以这样做.这当然不是一个坚实的基础,你,我总是问我身边的人.为什么要学习安卓忘记,总是学不好.有些事情要记住,事实上这不能怪你.假设别人开发了那么久的东西,你一下子就学会了,你让谷歌怎么活. 篇幅有限.假设读者看不懂的话,能够复习下基础.我尽量将代码简单化了.  先看效果图 假设你是初学安卓.这个APP你可能要半小时 假设你是有经验的开发人员,OK,你可能看一遍就能将自己的开发类带入,10分钟不到就搞定. watermark/2

练手小项目(1)——智能聊天机器人

我一直坚信着,即使一个最简单的APP,也有他的难点,如果一个复杂的APP你无法做出来,那肯定是你基础不扎实,我身边的人总是问我,安卓为什么学了有忘记了,总是学不好,有些东西记不住,其实这不能怪你,如果别人开发了那么久的东西,你一下子就学会了,你让谷歌怎么活. 篇幅有限,如果读者看不懂的话,可以复习下基础,我尽量将代码简单化了.  先看效果图 如果你是初学安卓,这个APP你可能要半小时 如果你是有经验的开发者,OK,你可能看一遍就能将自己的开发类带入,10分钟不到就搞定. 开发步骤: 1. 先去图

Python进阶开发之网络编程,socket实现在线聊天机器人

系列文章 √第一章 元类编程,已完成 ; √第二章 网络编程,已完成 ; 本文目录 什么是socket?创建socket客户端创建socket服务端socket工作流程图解socket公共函数汇总实战:搭建在线聊天机器人 . 什么是socket? 说到网络编程,难免要提到socket? 那什么是socket呢,中文名叫"套接字",更难理解了吧. 通俗来讲,socket表示一个网络连接,通过这个连接,使得主机间或者一台计算机上的进程间可以通讯. 不管是不同主机,还是同一主机.既然是通信,

小程序聊天会话组件

效果图 场景 用于在线客服的聊天对话等 一.布局圈点 1.三角箭头 绘制一个26rpx*26rpx矩形,使它旋转45度,然后隐去对半,形成气泡上的直角三角形. <!-- 画三角箭头 --> <view class="triangle" style="{{item.myself == 1 ? 'right: 140rpx; background: #7ECB4B' : 'left: 140rpx;'}}"></view> /* 三角

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

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

ROS(9):机器人开源项目poppy-project

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/48661397 未经博主允许不得转载. 博主地址是:http://blog.csdn.net/freewebsys 1,关于poppy-project poppy是一个机器人的开源项目,一个人型机器人的项目,设计cad啥的都是开源的. 项目使用GPL v3开源的. 总成本在 5万RMB,60%的成本在Dynamixel 舵机上面,需要25个舵机. 不知道国产舵机能补能替代. 2,

两种开源聊天机器人的性能测试(二)——基于tensorflow的chatbot

http://blog.csdn.net/hfutdog/article/details/78155676 开源项目链接:https://github.com/dennybritz/chatbot-retrieval/ 它实现一个检索式的机器人.采用检索式架构,有预定好的语料答复库.检索式模型的输入是上下文潜在的答复.模型输出对这些答复的打分,选择最高分的答案作为回复. 下面进入正题. 1.环境配置 首先此项目需要的基本条件是使用Python3(我用的是Python3.4),tensorflow

自动聊天机器人项目班 [一门课搞定聊天机器人]

打造传统NLP聊天机器人第1课 聊天机器人的基础模型与综述知识点1:行业与业界综述实战项目:最简单的Rule-Base聊天机器人第2课 NLP基础及扫盲知识点1:NLP基本算法实战项目:经典NLP问题与解法第3课 用基础机器学习方法制作聊天机器人知识点1:神经网络与基础实战项目:说学逗唱的基础机器人打造深度学习聊天机器人第4课 深度学习基础及扫盲知识点1:深度学习基础算法实战项目:经典深度学习问题与解法第5课 深度学习聊天机器人原理知识点1:seq2seq生成模型知识点2:user modeli