main
parent
111dfaf20d
commit
74b1a7a7a5
@ -1,149 +0,0 @@
|
||||
import tkinter as tk
|
||||
|
||||
import threading
|
||||
import speech_recognition as sr
|
||||
import requests
|
||||
import pyttsx3
|
||||
from AiChatterbot import talkWithRobot, robotSay
|
||||
|
||||
# Initialize speech synthesis object
|
||||
talker = pyttsx3.init()
|
||||
|
||||
# Initialize speech recognition object
|
||||
recognizer = sr.Recognizer()
|
||||
|
||||
userName = "admin"
|
||||
userPass = "123"
|
||||
# Create chat window
|
||||
def chat_window():
|
||||
chat_window = tk.Tk()
|
||||
chat_window.title("对话")
|
||||
chat_window.geometry("800x400")
|
||||
|
||||
def send_text_message():
|
||||
message = input_entry.get()
|
||||
chat_text.insert(tk.END, "你: " + message + "\n")
|
||||
response = get_response(message)
|
||||
chat_text.insert(tk.END, "机器人: " + response + "\n")
|
||||
input_entry.delete(0, tk.END)
|
||||
# 语音合成回复并播放
|
||||
talker.say(response)
|
||||
talker.runAndWait()
|
||||
|
||||
def start_voice_recognition(chat_text):
|
||||
with sr.Microphone() as source:
|
||||
print("请说话...")
|
||||
audio = recognizer.listen(source)
|
||||
|
||||
try:
|
||||
print("识别中...")
|
||||
text = recognizer.recognize_google(audio, language="zh-CN")
|
||||
print("你说: " + text)
|
||||
|
||||
# 调用自然语言处理功能获取回复
|
||||
response = get_response(text)
|
||||
|
||||
# 显示用户输入的消息和机器人的回复
|
||||
chat_text.insert(tk.END, "你: " + text + "\n")
|
||||
chat_text.insert(tk.END, "机器人: " + response + "\n")
|
||||
|
||||
# 语音合成回复并播放
|
||||
talker.say(response)
|
||||
talker.runAndWait()
|
||||
except sr.UnknownValueError:
|
||||
print("抱歉, 未能识别,请重试")
|
||||
|
||||
def send_voice_message():
|
||||
start_voice_recognition(chat_text)
|
||||
|
||||
chat_frame = tk.Frame(chat_window)
|
||||
chat_frame.pack(pady=10)
|
||||
|
||||
chat_text = tk.Text(chat_frame)
|
||||
chat_text.pack()
|
||||
|
||||
input_entry = tk.Entry(chat_frame)
|
||||
input_entry.pack(side=tk.LEFT, expand=True, fill=tk.BOTH)
|
||||
|
||||
send_text_button = tk.Button(chat_frame, text="发送", command=send_text_message)
|
||||
send_text_button.pack(side=tk.LEFT)
|
||||
|
||||
send_voice_button = tk.Button(chat_frame, text="语音输入", command=start_voice_recognition)
|
||||
send_voice_button.pack(side=tk.LEFT)
|
||||
|
||||
chat_window.mainloop()
|
||||
|
||||
# 启动聊天窗口
|
||||
# 创建登录窗口
|
||||
def login_window():
|
||||
login_window = tk.Tk()
|
||||
login_window.title("登录")
|
||||
|
||||
# 获取屏幕宽度和高度
|
||||
screen_width = login_window.winfo_screenwidth()
|
||||
screen_height = login_window.winfo_screenheight()
|
||||
|
||||
# 设置窗口居中
|
||||
window_width = 300
|
||||
window_height = 200
|
||||
x = (screen_width - window_width) // 2
|
||||
y = (screen_height - window_height) // 2
|
||||
login_window.geometry(f"{window_width}x{window_height}+{x}+{y}")
|
||||
|
||||
def login():
|
||||
inputName = name_entry.get()
|
||||
inputPass = pass_entry.get()
|
||||
|
||||
if inputName == userName and inputPass == userPass:
|
||||
talker.say("恭喜你登录成功!")
|
||||
talker.runAndWait()
|
||||
login_window.destroy()
|
||||
chat_window()
|
||||
else:
|
||||
talker.say("账号或密码错误,登录失败")
|
||||
talker.runAndWait()
|
||||
|
||||
name_label = tk.Label(login_window, text="用户名:")
|
||||
name_label.pack()
|
||||
name_entry = tk.Entry(login_window)
|
||||
name_entry.pack()
|
||||
|
||||
pass_label = tk.Label(login_window, text="密码:")
|
||||
pass_label.pack()
|
||||
pass_entry = tk.Entry(login_window, show="*")
|
||||
pass_entry.pack()
|
||||
|
||||
login_button = tk.Button(login_window, text="登录", command=login)
|
||||
login_button.pack()
|
||||
|
||||
login_window.mainloop()
|
||||
# 自然语言处理功能
|
||||
def get_response(message):
|
||||
if "你好" in message:
|
||||
return "你好,有什么可以帮助你的吗?"
|
||||
elif "再见" in message:
|
||||
return "再见,祝你一天愉快!"
|
||||
else:
|
||||
return "抱歉,我不明白你说的是什么。"
|
||||
|
||||
|
||||
def send_message():
|
||||
# 获取用户输入的消息
|
||||
chat_text = tk.Text(chat_window)
|
||||
chat_text.pack()
|
||||
|
||||
input_entry = tk.Entry(chat_window)
|
||||
input_entry.pack()
|
||||
message = input_entry.get()
|
||||
|
||||
# 显示用户输入的消息
|
||||
chat_text.insert(tk.END, "You: " + message + "\n")
|
||||
|
||||
# 获取模型生成的回复
|
||||
response = get_response(message)
|
||||
|
||||
# 显示模型生成的回复
|
||||
chat_text.insert(tk.END, "Bot: " + response + "\n")
|
||||
|
||||
# 启动登录窗口
|
||||
login_window()
|
@ -0,0 +1,184 @@
|
||||
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
|
||||
import nltk
|
||||
from nltk.tokenize import word_tokenize
|
||||
from nltk.corpus import stopwords
|
||||
from nltk.tokenize import RegexpTokenizer
|
||||
from nltk.stem import WordNetLemmatizer
|
||||
from nltk.probability import FreqDist
|
||||
import string
|
||||
|
||||
# Constants for audio recording
|
||||
framer = 16000 # Sample rate
|
||||
num_samples = 2000 # Sample points
|
||||
channels = 1
|
||||
sampwidth = 2
|
||||
FILEPATH = '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 = [] # Store recorded data
|
||||
t_end = time.time() + 5 # Record for 5 seconds
|
||||
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(FILEPATH, my_buf) # Save the recorded audio
|
||||
stream.close()
|
||||
|
||||
# Initialize the AipSpeech client
|
||||
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
|
||||
|
||||
# Class for handling text-to-speech
|
||||
class RobotSay():
|
||||
def __init__(self):
|
||||
self.engine = pyttsx3.init() # Initialize TTS engine
|
||||
|
||||
def say(self, msg):
|
||||
self.engine.say(msg)
|
||||
self.engine.runAndWait()
|
||||
|
||||
# Class for handling speech recognition
|
||||
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,
|
||||
})
|
||||
|
||||
# Define the login window
|
||||
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()
|
||||
# You can add actual validation logic here by checking against a database or hardcoded values
|
||||
if username == "123" and password == "123":
|
||||
messagebox.showinfo("登陆成功", "恭喜你登陆成功")
|
||||
self.open_chat_window()
|
||||
else:
|
||||
messagebox.showerror("登录失败", "无效的用户名或密码")
|
||||
|
||||
def open_chat_window(self):
|
||||
self.master.withdraw() # Hide the login window
|
||||
chat_root = Toplevel(self.master) # Create a new window for chat
|
||||
chat_window = ChatWindow(chat_root) # Open the chat window
|
||||
chat_root.protocol("WM_DELETE_WINDOW", self.master.quit) # Close the entire application when chat window is closed
|
||||
class ChatWindow:
|
||||
def __init__(self, master):
|
||||
self.master = master
|
||||
self.master.title("开始聊天")
|
||||
self.master.geometry("700x500")
|
||||
|
||||
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.recognizer = sr.Recognizer()
|
||||
self.engine = pyttsx3.init()
|
||||
|
||||
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) # Speaking the 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 "我目前无法处理您的请求."
|
||||
# 下载NLTK数据
|
||||
nltk.download('stopwords')
|
||||
nltk.download('punkt')
|
||||
nltk.download('wordnet')
|
||||
# 假设用户输入作为文本样本
|
||||
user_input = "我想了解自然语言处理。你能帮助我吗?"
|
||||
# 小写化
|
||||
user_input = user_input.lower()
|
||||
# 标点符号移除
|
||||
translator = str.maketrans('', '', string.punctuation)
|
||||
user_input = user_input.translate(translator)
|
||||
# 分词
|
||||
tokens = word_tokenize(user_input)
|
||||
# 去除停用词
|
||||
stop_words = set(stopwords.words('english'))
|
||||
filtered_tokens = [word for word in tokens if word not in stop_words]
|
||||
# 词形还原
|
||||
lemmatizer = WordNetLemmatizer()
|
||||
lemmatized_tokens = [lemmatizer.lemmatize(word) for word in filtered_tokens]
|
||||
# 频率分布
|
||||
fdist = FreqDist(lemmatized_tokens)
|
||||
print(fdist.most_common(5))
|
||||
def update_chat(self, text):
|
||||
self.chat_text.insert(END, text)
|
||||
def speak(self, text):
|
||||
self.engine.say(text)
|
||||
self.engine.runAndWait()
|
||||
def main():
|
||||
root = Tk()
|
||||
login_window = LoginWindow(root)
|
||||
root.mainloop()
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in new issue