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, Scrollbar, Entry, Button import nltk from nltk.tokenize import word_tokenize from nltk.corpus import stopwords from nltk.stem import WordNetLemmatizer # Constants for audio recording framer = 16000 # Sample rate num_samples = 2000 # Sample points channels = 1 sampwidth = 2 audio_file = 'myvoices.wav' # Specify the path to save the recorded audio file APP_ID = '73927317' API_KEY = '3jGcj5fLma64CtB3tTEuLcei' SECRET_KEY = 'qm8gPCF7DSKpqatx5ZQ8e4OvNLmgdYcG' # Add your own API credentials here # Class for handling audio recording and saving 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('Speak now...') while time.time() < t_end: string_audio_data = stream.read(num_samples) my_buf.append(string_audio_data) print('Recording ended') self.save_wave_file(audio_file, my_buf) stream.close() client = AipSpeech('73927317', '3jGcj5fLma64CtB3tTEuLcei', 'qm8gPCF7DSKpqatx5ZQ8e4OvNLmgdYcG') class RobotSay(): def __init__(self): self.engine = pyttsx3.init() def say(self, msg): self.engine.say(msg) self.engine.runAndWait() class ReadWav(): 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('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 = [] nltk.download('punkt') nltk.download('stopwords') nltk.download('wordnet') def send_message(self): user_input = self.input_field.get() self.update_chat("你: " + user_input + "\n") response = self.get_qingyunke_response(user_input) self.update_chat("菲菲: " + response + "\n") self.speak(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 sr.AudioFile(audio_file) as source: audio_data = self.recognizer.record(source) text = self.recognizer.recognize_sphinx(audio_data) return text #使用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() print("聊天记录保存与数据库中.") 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 process_user_input(self, user_input): # 对用户输入进行分词 tokens = word_tokenize(user_input) # 去除停用词 stop_words = set(stopwords.words('english')) filtered_tokens = [word for word in tokens if word.lower() not in stop_words] # 词形还原 lemmatizer = WordNetLemmatizer() lemmatized_tokens = [lemmatizer.lemmatize(word) for word in filtered_tokens] # 将处理后的文本重新组合为句子 processed_input = ' '.join(lemmatized_tokens) # 返回处理后的文本 return processed_input user_input = "Can you tell me about machine learning?" def main(): root = Tk() login_window = LoginWindow(root) root.mainloop() if __name__ == "__main__": main()