You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

266 lines
9.3 KiB

import pymysql
import time
import wave
import requests
from pyaudio import PyAudio, paInt16
from aip import AipSpeech
import pyttsx3
from tkinter import *
from tkinter import messagebox
import speech_recognition as sr
from tkinter import Text, Entry, Button
framer = 16000
num_samples = 2000
channels = 1
sampwidth = 2
APP_ID = '78542969'
API_KEY = 'B37LWVxLfoHixHx52OrNCPij'
SECRET_KEY = 'bkNnbC37K3Ac6gI8kQ8phG1h5RIivMwj'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
audio_file = '../pythonProject6/myvoices.wav'
# 用于处理音频录制和保存
class Speak():
def save_wave_file(self, filepath, data):
wf = wave.open(filepath, 'wb')
wf.setnchannels(channels)
wf.setsampwidth(sampwidth)
wf.setframerate(framer)
wf.writeframes(b''.join(data))
wf.close()
def my_record(self):
pa = PyAudio()
stream = pa.open(format=paInt16, channels=channels, rate=framer, input=True, frames_per_buffer=num_samples)
my_buf = []
t_end = time.time() + 5
print('识别中...')
while time.time() < t_end:
string_audio_data = stream.read(num_samples)
my_buf.append(string_audio_data)
print('识别完成')
self.save_wave_file(audio_file, my_buf)
stream.close()
class RobotSay():
def __init__(self):
self.engine = pyttsx3.init()
def say(self, msg):
self.engine.say(msg)
self.engine.runAndWait()
class ReadWav():
def __init__(self):
self.APP_ID = '78542969'
self.API_KEY = 'B37LWVxLfoHixHx52OrNCPij'
self.SECRET_KEY = 'bkNnbC37K3Ac6gI8kQ8phG1h5RIivMwj'
self.client = AipSpeech(self.APP_ID, self.API_KEY, self.SECRET_KEY)
def get_file_content(self, filePath):
with open(filePath, 'rb') as fp:
return fp.read()
def predict(self):
return client.asr(self.get_file_content('../pythonProject6/myvoices.wav'), 'wav', 16000, {
'dev_pid': 1537,
})
# 定义登录窗口
class LoginWindow:
def __init__(self, master):
self.master = master
self.master.title("登录")
self.master.geometry("300x200")
# Center align the login window
self.screen_width = self.master.winfo_screenwidth()
self.screen_height = self.master.winfo_screenheight()
self.x_pos = (self.screen_width - 300) // 2
self.y_pos = (self.screen_height - 200) // 2
self.master.geometry(f"300x200+{self.x_pos}+{self.y_pos}")
self.label_username = Label(master, text="账号")
self.label_username.pack()
self.entry_username = Entry(master)
self.entry_username.pack()
self.label_password = Label(master, text="密码")
self.label_password.pack()
self.entry_password = Entry(master, show="*")
self.entry_password.pack()
self.button_login = Button(master, text="登录", command=self.login)
self.button_login.pack()
def login(self):
username = self.entry_username.get()
password = self.entry_password.get()
if username == "123" and password == "123":
messagebox.showinfo("登陆成功", "恭喜你登陆成功")
self.open_chat_window()
else:
messagebox.showerror("登录失败", "无效的用户名或密码")
def open_chat_window(self):
self.master.withdraw()
chat_root = Toplevel(self.master)
chat_window = ChatWindow(chat_root)
chat_root.protocol("WM_DELETE_WINDOW", self.master.quit)
class ChatWindow:
def __init__(self, master):
self.master = master
self.master.title("开始聊天")
self.master.geometry("700x500")
self.screen_width = self.master.winfo_screenwidth()
self.screen_height = self.master.winfo_screenheight()
self.x_pos = (self.screen_width - 300) // 2
self.y_pos = (self.screen_height - 200) // 2
self.master.geometry(f"700x500+{self.x_pos}+{self.y_pos}")
self.chat_text = Text(self.master)
self.chat_text.pack()
self.input_field = Entry(self.master)
self.input_field.pack()
self.send_button = Button(self.master, text="发送", command=self.send_message)
self.send_button.pack()
self.view_button = Button(self.master, text="查看聊天记录", command=self.view_chat_history)
self.view_button.pack()
self.delete_button = Button(self.master, text="删除聊天记录", command=self.delete_chat_history)
self.delete_button.pack()
self.recognizer = sr.Recognizer()
self.engine = pyttsx3.init()
self.connection = pymysql.connect(host="localhost",
user="root",
password="myroot",
database="ai_chatter",
port=3306)
self.cursor = self.connection.cursor()
self.chat_history = []
self.voice_button = Button(self.master, text="语音对话", command=self.start_voice_conversation)
self.voice_button.pack()
self.APP_ID = APP_ID
self.API_KEY = API_KEY
self.SECRET_KEY = SECRET_KEY
self.client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
'''
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
'''
def send_message(self):
user_input = self.input_field.get()
response = self.get_qingyunke_response(user_input)
self.update_chat("你: " + user_input + "\n")
self.update_chat("菲菲: " + response + "\n")
self.speak(response)
self.save_to_database(user_input, response)
def start_voice_conversation(self):
self.speak("开始语音对话,请说话...")
speak_instance = Speak()
speak_instance.my_record()
text = self.transcribe_audio('../pythonProject6/myvoices.wav')
self.update_chat("你说: " + text + "\n")
response = self.get_qingyunke_response(text)
self.update_chat("菲菲: " + response + "\n")
self.speak(response)
self.save_to_database(text, response)
def get_qingyunke_response(self, message):
api_url = "http://api.qingyunke.com/api.php?key=free&appid=0&msg=" + message
response = requests.get(api_url)
if response.status_code == 200:
data = response.json()
if data['result'] == 0:
return data['content']
else:
return "对不起,我不能理解."
else:
return "我目前无法处理您的请求."
def update_chat(self, text):
self.chat_text.insert(END, text)
def speak(self, text):
self.engine.say(text)
self.engine.runAndWait()
def transcribe_audio(self, audio_file):
with open(audio_file, 'rb') as f:
audio_data = f.read()
result = self.client.asr(audio_data, 'wav', 16000, {
'dev_pid': 1537, # Use the model for Mandarin
})
if 'result' in result:
return result['result'][0]
else:
return "百度语音识别失败"
#使用mysql数据库来保存
def save_to_database(self, user_message, bot_response):
sql = "INSERT INTO chat_history (user_message, bot_response) VALUES (%s, %s)"
text = (user_message, bot_response)
self.connection.cursor().execute(sql, text)
self.connection.commit()
self.update_chat("聊天记录保存与数据库中\n")
def view_chat_history(self):
self.chat_text.delete('1.0', END)
sql = "SELECT * FROM ai_chatter.chat_history"
self.cursor.execute(sql)
records = self.cursor.fetchall()
for record in records:
self.update_chat("你: " + record[1] + "\n")
self.update_chat("菲菲: " + record[2] + "\n")
if self.chat_history:
self.update_chat("\n--- 聊天记录 ---\n")
for message in self.chat_history:
self.update_chat(message + "\n")
else:
self.update_chat("\n")
def delete_chat_history(self):
sql = "DELETE FROM chat_history"
self.cursor.execute(sql)
self.connection.commit()
self.chat_text.delete('1.0', END)
self.update_chat("聊天记录已删除。\n")
if self.chat_history:
self.chat_history.clear()
self.update_chat("聊天记录已删除\n")
else:
self.update_chat("没有找到聊天记录\n")
def close_connection(self):
self.cursor.close()
self.connection.close()
#自然语言处理
#知识图谱模块
def fetch_knowledge_graph_info(self, query):
# 使用Google知识图谱API
api_key = ''
base_url = 'https://kgsearch.googleapis.com/v1/entities:search'
params = {
'query': query,
'key': api_key,
'limit': 1
}
response = requests.get(base_url, params=params).json()
if 'itemListElement' in response:
item = response['itemListElement'][0]
if 'result' in item:
return item['result']['name'], item['result']['detailedDescription']['articleBody']
def main():
root = Tk()
login_window = LoginWindow(root)
root.mainloop()
if __name__ == "__main__":
main()