Bootstrap

java实现小艾机器人陪聊

各位大佬,好久没有写新的东西给大家了,现在给大家来一个陪聊解闷的小艾机器人,来陪伴大家,希望大家喜欢哦!^- ^
现在可多手机上都有只能语音机器人,虽然说的话有些牛头不对马嘴的,但是在哪那么某一个时候,还是能逗你一下的,现在,博主页为大家送上一个机器人,闲话不多说,上干活
第一电路,环境依赖
其实,小艾机器人也是属于人工智能方面的,其添加的依赖也不是一般常用的依赖,当然,如果有腻害的大佬有更好的推荐依赖,欢迎评论留言
本次使用的是青课云的小艾机器人,只需要调用他的api就可以进行使用大的对话功能了,相关的依赖如下
核心依赖地址:http://api.qingyunke.com/api.php?key=free&appid=0&msg=%s
这个地址是调用后返回机器人语句的,除去这个关键的核心,也就没有其他的了,比较,只是和机器人聊天罢了
相关代码如下

    /**
     * 获取机器人响应回答结果
     *
     * @param msg 请求问题
     * @return 机器人响应结果
     */
    @Override
    public ResponseVO getReplyMsg(String msg) {
        String api = null;
        try {
            api = String.format(apiTpl, URLEncoder.encode(msg, "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        String result = HttpUtils.request(api);
        if (StringUtils.isEmpty(result)) {
            result = "我没有听懂你说的是什么东东!";
        }
        return gson.fromJson(result, ResponseVO.class);
    }

这里就是调用的关键方法了,而其中的apiTpL就是上面提到的那个URL了,对于httpUtil我也附上给大家,方便大家实现案例

package com.hui.demo.util;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @program: hui_product_demo
 * @ClassName HttpUtils
 * @description: 调用青课云接口工具类
 * @author: liuHui
 * @create: 2021-11-29 16:23
 * @Version 1.0
 **/
public class HttpUtils {

    public static String request(String api) {

        HttpURLConnection connection = null;
        int responseCode = 0;
        try {
            URL url = new URL(api);
            //获取对应的连接对象
            connection = (HttpURLConnection) url.openConnection();
            responseCode = connection.getResponseCode();
        } catch (Exception e) {
            e.printStackTrace();
        }

        if (200 <= responseCode && responseCode <= 299) {
            try (InputStream inputStream = connection.getInputStream();
                 BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
            ) {
                StringBuilder response = new StringBuilder();
                String currentLine;
                while ((currentLine = in.readLine()) != null) {
                    response.append(currentLine);
                }
                String result = response.toString();
                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;

    }
}

这就是获取到机器人的对话消息了,是不是很简单!
你是不是以为到这,这边博客就已经结束了,当然不是呀,这才获取到对话,怎么让机器人把对话读出来呢,不读出来,哪还有什么好玩的,对不对!这就上,前方高能哦!

需要读取文字内容转换成语音的,需要用到一个名为jacob的maven依赖,但是这个依赖在maven仓库暂没有提供下载,也就是说,这个需要大家通过其他途径去获取了,等依赖下载下来完成后,我们就可以使用Jacob的相关功能了
附上核心处理代码

public static void showText(){
        ActiveXComponent sap = new ActiveXComponent("Sapi.SpVoice");
        // 音量 0-100
        sap.setProperty("Volume", new Variant(100));
        // 语音朗读速度 -10 到 +10
        sap.setProperty("Rate", new Variant(0));
        // 获取执行对象
        Dispatch sapo = sap.getObject();
        // 执行朗读
        Dispatch.call(sapo, "Speak", new Variant("尊敬的大佬,请给我取个响亮的名字!"));
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        Dispatch.call(sapo, "Speak", new Variant("尊敬的大佬,"+name+"这个名字可真好听!"));
        Dispatch.call(sapo, "Speak", new Variant("现在让我们愉快的聊天吧!"));
        while (true) {
            String input = scanner.nextLine();
            if ("88".equalsIgnoreCase(input)) {
                Dispatch.call(sapo, "Speak", new Variant("欢迎下次使用,拜拜!"));
                break;
            } else {
                ResponseVO response = robotService.getReplyMsg(input);
                if (response != null && response.getCode() == 0) {
                    try {
                        Dispatch.call(sapo, "Speak", new Variant(new String(response.getContent().getBytes(), "UTF-8")));
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                } else {
                    Dispatch.call(sapo, "Speak", new Variant("大佬你刚刚这句话我没听懂,可否再陈述一次!"));
                }
            }

        }
        scanner.close();
        // 关闭执行对象
        sapo.safeRelease();

    }

这上面写的是一个案例,通过控制台输入与机器人进行交流,并将机器人返回的消息转换成语音告诉你他的回答,到这,小艾同学机器嗯算是OK了

但是博主呢是一个力求完美的人,手机上不是语音对话吗,而咱们刚实现的代码是需要打字文字交流的呀,多费劲,其实博主也去找了相关的知识,需要付费的,都是,比如腾讯云用的语音转换工具,在某荣耀和某新上用的都是这个转换工具,大家如果有需求的话可以去腾讯云中下载SDK然后注册上自己的项目,进行使用,使用的过程大家另行百度了。

然后,为了完善我们这个文字交流的,博主也想了一下方法,就是用java自带的窗口来优化使用呀,对不对,虽然也是打字,但是最起码有了一个用户输入的地方,可以打成EXE文件进行使用,方便用户操作了,下面也附上代码,供大家实现基础案例

package com.hui.demo.business.controller;

import com.hui.demo.business.service.RobotService;
import com.hui.demo.business.service.RobotServiceImpl;
import com.hui.demo.model.bo.ProductConfig;
import com.hui.demo.model.vo.ResponseVO;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import org.springframework.util.StringUtils;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;

/**
 * @program: hui_product_demo
 * @ClassName JframeWindow
 * @description: 窗口输入
 * @author: liuHui
 * @create: 2021-11-30 11:20
 * @Version 1.0
 **/
public class JframeWindow {

    private static String msg = "";
    private static String newMsg = "";
    private static final RobotService robotService = new RobotServiceImpl(new ProductConfig());


    public static void main(String[] args) {
        inputWindows();
    }

    /**
     * 创建一个弹出窗中可以输入的窗口
     */
    public static void inputWindows() {
        showMe();
        JFrame jf = new JFrame("小艾聊天室");
        jf.setSize(600, 600);
        jf.setLocation(150, 150);
        jf.setLayout(new FlowLayout(FlowLayout.CENTER, 30, 30));
        JTextField textField = new JTextField(30);
        textField.setSize(300,50);
        ImageIcon background = new ImageIcon("D:\\hui_product_demo\\src\\main\\resources\\image\\01.jpg");// 背景图片
        JLabel labelImage = new JLabel(background);// 把背景图片显示在一个标签里面
        // 把标签的大小位置设置为图片刚好填充整个面板
        labelImage.setBounds(0, 0, background.getIconWidth(),
                background.getIconHeight());
        // 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明
        JPanel jp =(JPanel) jf.getContentPane();
        jp.setOpaque(false);
        // 内容窗格默认的布局管理器为BorderLayout
        jp.setLayout(new FlowLayout());
        JButton jButton = new JButton("提交");
        JLabel title = new JLabel("请输入");
        title.setSize(300,50);
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String inputText = textField.getText().trim();
                if (("").equals(inputText)) {
                    JOptionPane.showMessageDialog(null, "请输入您的聊天内容:");
                    return;
                }
                if (!StringUtils.isEmpty(inputText)) {
                    msg = inputText;
                    if (StringUtils.isEmpty(newMsg)) {
                        newMsg = inputText;
                        msg = "";
                    } else {
                        msg = inputText;
                        newMsg = "";
                    }
                    showText();
                    textField.setText("");
                    return;
                }
            }
        });
//         加入顺序影响着在页面上的展示位置
        jf.add(title);
        jf.add(textField);
        jf.add(jButton);
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        jf.getLayeredPane().setLayout(null);
        // 把背景图片添加到分层窗格的最底层作为背景
        jf.getLayeredPane().add(labelImage, new Integer(Integer.MIN_VALUE));
        jf.setResizable(false);
        jf.setVisible(true);
    }


    public static void showMe() {
        ActiveXComponent sap = new ActiveXComponent("Sapi.SpVoice");
        // 音量 0-100
        sap.setProperty("Volume", new Variant(100));
        // 语音朗读速度 -10 到 +10
        sap.setProperty("Rate", new Variant(0));
        // 获取执行对象
        Dispatch sapo = sap.getObject();
        // 执行朗读
        Dispatch.call(sapo, "Speak", new Variant("尊敬的大佬,你好!现在让我们愉快的聊天吧!"));
        sapo.safeRelease();
    }
    public static void showText() {
        ActiveXComponent sap = new ActiveXComponent("Sapi.SpVoice");
        // 音量 0-100
        sap.setProperty("Volume", new Variant(100));
        // 语音朗读速度 -10 到 +10
        sap.setProperty("Rate", new Variant(0));
        // 获取执行对象
        Dispatch sapo = sap.getObject();
        String input = "";
        if (newMsg.equals("")) {
            input = msg;
        } else {
            input = newMsg;
        }
        if ("88".equalsIgnoreCase(input)) {
            Dispatch.call(sapo, "Speak", new Variant("欢迎下次使用,拜拜!"));
        } else {
            ResponseVO response = robotService.getReplyMsg(input);
            if (response != null && response.getCode() == 0) {
                try {
                    Dispatch.call(sapo, "Speak", new Variant(new String(response.getContent().getBytes(), "UTF-8")));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            } else {
                Dispatch.call(sapo, "Speak", new Variant("大佬你刚刚这句话我没听懂,可否再陈述一次!"));
            }
        }
        sapo.safeRelease();

    }





}

上面的代码是博主刚刚写好的,并且设置了一下背景图片,大家可以看看,代码不难,就不做过多的说明了,希望需要对需要用到的同学有所帮助哦,如果你给我点个赞的话,我就把maven依赖也给你送上,其他博主可都是收钱的呢?

白捡的jar包maven依赖来了(不要告诉其他的博主,不然我怕挨揍 ^ - ^ )
链接: https://pan.baidu.com/s/1yc60JEY0Rk1Ja-5Ev3on0A
提取码: qan7
使用方法也在下载下来的里面有了,记得点赞关注哦!

;