项目需求:

  • 使用PySide6绘制用户交互界面
  • 调用cozeAPI,实现机器人与用户聊天
  • 调用百度智能云API,实现识别用户的语音输入及机器人语音回复用户
  • 使用SQLite实现数据持久化

设计思路:

1.设计仿qq好友列表,实现点击好友,进行用户聊天(单用户)
2.设计仿qq聊天窗口,实现窗口部分功能,包括表情包、发送图片、查看聊天记录等
3.调用cozeAPI对用户的输入进行回复
4.调用百度智能云API实现语音识别,语音合成等功能,对用户的语音进行识别,传给cozeAPI进行语音合成并回复


用户交互界面展示:

1.好友列表
请添加图片描述
2.
2.1聊天窗口(点击麦克风可以语音输入)

请添加图片描述
2.1表情包
请添加图片描述

2.2发送图片请添加图片描述
2.3发红包
请添加图片描述
2.4聊天历史(使用SQLite实现数据持久化)
请添加图片描述

代码展示:

1.好友列表

class FriendListWindow(QMainWindow, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.setFixedSize(361, 641)
        self.chat_window = ChatWindow()
        self.chat_his_window = ChatHisWindow()

        self.pushButton_6.clicked.connect(self.openChat)
        self.chat_window.setTitle(self.pushButton_6.text())
        self.chat_his_window.setTitle(self.pushButton_6.text())


    #打开聊天窗口
    def openChat(self):
        """
        打开聊天窗口
        :return:
        """
        self.chat_window.show()

2.聊天窗口(初始化)

    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setFixedSize(721, 661)

        # 创建数据库
        # self.create_database()

        # 发送按钮点击事件
        self.pushButton.clicked.connect(lambda: self.sendTextMessage())

        # 关闭按钮点击事件
        self.pushButton_2.clicked.connect(lambda: self.closePage())

        # 打开表情包
        self.pushButton_3.clicked.connect(lambda: self.openEmoji())

        # 发送图片
        self.pushButton_6.clicked.connect(lambda: self.sendImage())

        # 打开红包
        self.pushButton_7.clicked.connect(lambda: self.openRedPacket())

        # 打开聊天历史界面
        self.pushButton_9.clicked.connect(lambda: self.openChatHistory())

        # 为文本编辑控件安装事件过滤器,以便自定义处理各类事件
        self.textEdit.installEventFilter(self)

        # 连接推送按钮的按下和释放事件到相应的录音开始和停止方法
        self.recording_status = False  # 录音状态,默认为False
        self.pushButton_8.pressed.connect(self.start_recording)
        self.pushButton_8.released.connect(self.stop_recording)

        self.setButtonToolTip()

        # 初始化录音状态为False,表示未开始录音
        self.recording = False
        # 创建线程锁,用于同步访问录音数据帧
        self.frames_lock = threading.Lock()
        # 初始化录音数据帧列表
        self.frames = []
        # 设置音频块大小
        self.CHUNK = 1024
        # 设置音频格式为16位整数
        self.FORMAT = paInt16
        # 设置音频通道数为单声道
        self.CHANNELS = 1
        # 设置音频采样率为16000Hz
        self.RATE = 16000
        # 创建PyAudio对象,用于音频流的录入和播放
        self.audio = PyAudio()

3.表情包

class Emoji(QMainWindow):
    sendTextSignal = Signal(str)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.initUI()

    def initUI(self):
        self.setFixedSize(190, 91)

        vertical_layout = QVBoxLayout()

        button_texts = [
            ['😀', '😁', '😅', '🤣'],
            ['😊', '😏', '🫡', '😋']
        ]

        for row_texts in button_texts:
            horizontal_layout = QHBoxLayout()
            buttons_row = []
            for text in row_texts:
                button = QPushButton(text, self)
                try:
                    button.setFixedSize(31, 31)
                except Exception as e:
                    # 更具体的异常处理
                    print(f"Error setting fixed size for button '{text}': {e}")
                    continue

                # 解决Lambda变量捕获问题
                button.clicked.connect(lambda _, btn=button: self.getEmoji(btn.text()))

                buttons_row.append(button)
                horizontal_layout.addWidget(button)

            vertical_layout.addLayout(horizontal_layout)

4.发送图片

# 使用QFileDialog打开文件选择对话框
        file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "",
                                                   "图片文件 (*.png *.jpg *.jpeg *.bmp)")
        try:
            if file_path:
                # 更新图片路径到文本行
                if file_path:
                    now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                    html_image = f"""
                           <div style="text-align: left; margin-bottom: 10px;">
                               <span style="font-size: 10px; color: gray;">我:{now}</span>
                               <br/>
                               <img src="{file_path}" style="width: 150px; height: 150px; object-fit: cover;"/><br/>
                               
                           </div>
                           """
                    print(f"Selected file path: {file_path}")  # 调试输出
                    self.textBrowser.append(html_image)

5.发红包

    def on_send_button_clicked(self):
        # 获取输入框中的红包金额
        amount = self.amount_input.text()
        try:
            amount = float(amount)
            if amount <= 0:
                raise ValueError("红包金额必须大于0")
        except ValueError as e:
            print(f"错误:{e}")
            return

        now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        text = (f"我:[{now}]\n"
                f"🧧发放成功!\n"
                f"🧧金额:{amount} 元")
        self.sendTextSignal.emit(text)
        print("红包发放成功!")

6.聊天记录

    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setFixedSize(649, 658)
        conn = sqlite3.connect('chat.db')
        cursor = conn.cursor()

        # 将数据库的数据加载到文本中
        cursor.execute("SELECT * FROM chat_history")
        for row in cursor.fetchall():
            self.textBrowser.append(f"我:[{row[3]}]\n{row[1]}\n李四:[{row[3]}]\n{row[2]}\n")

7.语音识别及语音合成功能

# 语音识别功能
    def speech_recognition(self):
        #语音识别功能
        # 初始化BaiduVoice对象,用于后续的语音识别和合成操作
        voice = BaiduVoice()
        # 识别语音文件并打印识别结果
        recognition_result = voice.recognize_speech('medium/user.wav')
        # 发送识别结果到聊天窗口
        self.sendSpeechMessage(recognition_result)
        print("已识别的文本:", recognition_result)
        if recognition_result:
            #调用cozeapi接口
            response = self.coze_api(recognition_result)
            self.replySpeechMessage(response)
            self.insert_data(recognition_result, response)
        else:
            print("识别失败")
# 语音合成功能
    def speech_synthesis(self,kword):
        # 语音合成功能
        # 初始化BaiduVoice对象,用于后续的语音识别和合成操作
        voice = BaiduVoice()
        # 合成文本并保存为音频文件
        voice.synthesize_text(kword, 'medium/bot.mp3')
        print("已合成的语音文本:", kword)
        # 播放合成的音频文件
        # 初始化Pygame,这是运行Pygame功能的必要步骤
        pygame.init()
        # 加载背景音乐文件
        pygame.mixer.music.load('medium/bot.mp3')
        # 播放背景音乐
        pygame.mixer.music.play()
        # 等待音乐播放完毕,避免程序提前退出
        while pygame.mixer.music.get_busy():
            # 控制循环帧率为10帧/秒,以节省资源
            pygame.time.Clock().tick(10)
        # 音乐播放结束后,释放Pygame资源
        pygame.quit()

8.关于百度智能云和cozeAPI可自行从官方文档调用,使用自己的token

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐