在今天的博客中,我们将探讨如何使用 Python 创建一个功能丰富的智能聊天助手桌面应用程序。这个应用结合了语音识别、语音合成、聊天记录管理、以及基本的用户界面交互功能。我们将会涵盖以下几个方面:
目录
1.项目概述
2.主要功能介绍
3.技术栈和工具
4.界面展示
5.代码实现
6.总结与展望
1. 项目概述
这个智能聊天助手桌面应用程序允许用户通过语音与机器人对话。应用程序提供了录音、语音识别、文本转语音、聊天记录查看等功能,并且具有友好的用户界面,支持黑暗模式切换和背景设置选项。项目的目标是创建一个具有实用性的聊天工具,并提供与用户互动的智能体验。
2. 主要功能介绍
- 语音录制和识别:用户可以录制语音,应用将语音转换为文本,并将其发送给聊天机器人。
- 聊天记录管理:保存和查看聊天历史记录。
- 文本转语音:机器人回应以语音形式播放给用户。
- 界面交互:用户可以通过图形界面进行操作,如发送消息、查看聊天记录等。
- 背景和主题切换:支持背景颜色的切换,提供黑暗模式和正常模式。
3. 技术栈和工具
- Python:编程语言,用于实现应用逻辑。
- Coze:智能体平台,用于搭建聊天智能体
- PySide6:用于创建图形用户界面(GUI)。
- Pyaudio:用于音频录制和播放。
- Pygame:用于处理音频播放。
- Baidu API:百度云提供的语音识别和语音合成服务。
- SQLite:用于存储聊天记录的数据库。
- wave:用于处理 WAV 音频文件。
4.界面展示
5.代码实现
5.1 导入模块和初始化
我们首先导入必要的模块,并从环境变量中获取百度 API 的密钥。接着,初始化百度语音服务、音频播放和录音相关的组件。
import sys
import os
import wave
import pyaudio
import datetime
import pygame
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox
from PySide6.QtCore import Qt, QTimer, QThread, Signal
from QQchat import Ui_MainWindow
from functionality import functionality
from baidu_api import BaiduVoice
import database
from chat_history_dialog import ChatHistoryDialog
APP_ID = os.getenv('BAIDU_APP_ID', '110835125')
API_KEY = os.getenv('BAIDU_API_KEY', 'FAgFRRLz2MpSHy7FdN8mufdb')
SECRET_KEY = os.getenv('BAIDU_SECRET_KEY', 'x066aIDV2QdTRaVatLG5Nmv1xIW4D8UU')
voice = BaiduVoice(APP_ID, API_KEY, SECRET_KEY)
5.2 音频播放器
创建一个 AudioPlayer
类,负责播放语音文件,并在播放结束后发出信号。使用 pygame
处理音频播放。
class AudioPlayer(QThread):
finished = Signal()
stopped = Signal()
def __init__(self, filename):
super().__init__()
self.filename = filename
self._stopped = False
def run(self):
try:
pygame.mixer.music.load(self.filename)
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
if self._stopped:
pygame.mixer.music.stop()
break
pygame.time.Clock().tick(10)
except pygame.error as e:
print(f"播放音频时出错: {e}")
finally:
self.finished.emit()
def stop(self):
self._stopped = True
self.stopped.emit()
5.3 主窗口和用户交互
创建 MainWindow
类,负责主界面的逻辑和用户交互,包括录音、发送消息、查看聊天记录等。
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# 连接按钮点击事件
self.ui.pushButton.clicked.connect(self.send_message)
self.ui.pushButton_6.clicked.connect(self.toggle_recording)
self.ui.pushButton_10.clicked.connect(self.show_chat_history)
self.ui.pushButton_7.clicked.connect(self.stop_audio_playback)
self.ui.pushButton_8.clicked.connect(self.show_options)
self.ui.pushButton_9.clicked.connect(self.clear_chat_history)
# 更多初始化...
5.4 语音录制和识别
实现录音功能和语音识别。录音数据存储到 WAV 文件中,并通过百度 API 进行识别。
def start_recording(self):
self.ui.pushButton_6.setStyleSheet("background-color: red; color: white;")
self.ui.pushButton_6.setText("录音中")
self.frames = []
self.recording = True
self.output_file = self.generate_output_filename()
# 释放之前的流和设备
if self.stream:
self.stream.stop_stream()
self.stream.close()
if self.audio:
self.audio.terminate()
self.audio = pyaudio.PyAudio()
try:
self.stream = self.audio.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True,
frames_per_buffer=1024)
except OSError as e:
print(f"录音设备错误: {e}")
self.ui.textBrowser.append(f"录音设备错误: {e}")
self.stop_recording()
return
self.record()
if self.timer is not None:
self.timer.stop()
self.timer = QTimer(self)
self.timer.timeout.connect(self.stop_recording)
self.timer.start(5000) # 5秒钟后停止录音
4.5 文本转语音
将机器人的回复文本分段转换为语音,并播放给用户。
def convert_text_to_speech_in_chunks(self, text, chunk_size=1000):
chunks = [text[i:i + chunk_size] for i in range(0, len(text), chunk_size)]
def play_next_chunk():
if chunks:
chunk = chunks.pop(0)
mp3_file = f"response_{datetime.datetime.now().strftime('%Y%m%d%H%M%S')}.mp3"
try:
success = voice.synthesize_text(chunk, mp3_file, language='zh')
if success:
self.ui.pushButton_7.setStyleSheet("background-color: red; color: white;")
self.current_player = AudioPlayer(mp3_file)
self.current_player.finished.connect(play_next_chunk)
self.current_player.stopped.connect(lambda: self.ui.pushButton_7.setStyleSheet(""))
self.current_player.start()
else:
self.ui.textBrowser.append("文本转语音失败")
except Exception as e:
print(f"合成失败: {e}")
self.ui.textBrowser.append(f"合成失败: {e}")
else:
print("所有文本块已播放完毕")
self.ui.pushButton_7.setStyleSheet("")
QTimer.singleShot(100, play_next_chunk)
5. 总结与展望
通过本项目,我们展示了如何利用 Python 和各种库实现一个功能丰富的聊天助手应用。应用程序不仅支持语音交互,还提供了聊天记录管理和用户界面定制的功能。接下来,你可以进一步扩展这个项目,比如增加更多的智能功能、优化语音识别和合成的效果、以及改进用户界面体验。无论是个人使用还是作为学习项目,这个应用都展示了 Python 在桌面应用开发中的强大能力。
希望你能从中获得灵感,创造出更多有趣且实用的应用程序。如果有任何问题或建议,欢迎在评论区讨论!