MAIN_SCRIPT_MODULE (common_module)
import atexit import nltk import pyttsx3 import spacy import speech_recognition as sr import torch from transformers import GPTNeoForCausalLM, AutoTokenizer from nltk.sentiment import SentimentIntensityAnalyzer import os import json from memory_module import MemoryModule from sentiment_module import SentimentAnalysisModule
Get the current directory
current_directory = os.getcwd()
Get a list of files and directories in the current directory
file_list = os.listdir(current_directory)
Print the list
for file_name in file_list: print(file_name)
sia = SentimentIntensityAnalyzer() sentence = "This is a positive sentence." sentiment = sia.polarity_scores(sentence)
Access sentiment scores
compound_score = sentiment['compound'] positive_score = sentiment['pos'] negative_score = sentiment['neg']
model_directory = "EleutherAI/gpt-neo-125m"
Download necessary NLTK resources
nltk.download('punkt') nltk.download('wordnet') nltk.download('stopwords')
Check if GPU is available and set the device accordingly
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') if torch.cuda.is_available(): current_device = torch.cuda.current_device() print(f"Using GPU: {torch.cuda.get_device_name(current_device)}") else: print("No GPU available, using CPU.")
Initialize the speech engine
speech_engine = pyttsx3.init()
Get the list of available voices
voices = speech_engine.getProperty('voices') for voice in voices: print(voice.id, voice.name)
Set the desired voice
desired_voice = "Microsoft Hazel Desktop - English (Great Britain)" voice_id = None
Find the voice ID based on the desired voice name
for voice in voices: if desired_voice in voice.name: voice_id = voice.id break
if voice_id: speech_engine.setProperty('voice', voice_id) print("Desired voice set successfully.") else: print("Desired voice not found.")
Load the spaCy English model
nlp = spacy.load('en_core_web_sm')
Update the CommonModule instantiation
load_memory_file = "load_memory.json" save_memory_file = "save_memory.json"
class CommonModule: def init(self, model, name, param1, param2, load_memory_file, save_memory_file): # Initialize the instance variables using the provided arguments self.memory = [] # Initialize memory as a list self.name = name self.param1 = param1 self.param2 = param2 self.model = GPTNeoForCausalLM.from_pretrained(model_directory)
self.tokenizer = AutoTokenizer.from_pretrained(model_directory)
self.tokenizer.add_special_tokens({'pad_token': '[PAD]'})
self.gpt3_model = GPTNeoForCausalLM.from_pretrained(model_directory)
self.gpt3_model.to(device) # Move model to the device (GPU or CPU)
self.load_memory_file = "C:\\Users\\withe\\PycharmProjects\\no hope2\\Chat_Bot4\\load_memory.json"
self.save_memory_file = "C:\\Users\\withe\\PycharmProjects\\no hope2\\Chat_Bot4\\save_memory.json"
self.memory_module = MemoryModule(self.load_memory_file, self.save_memory_file)
self.sentiment_module = SentimentAnalysisModule()
self.speech_engine = speech_engine # Assign the initialized speech engine
self.max_sequence_length = 200 # Decrease the value for faster response
self.num_beams = 4 # Reduce the value for faster response
self.no_repeat_ngram_size = 2
self.temperature = 0.3
self.response_cache = {} # Cache for storing frequently occurring responses
# Initialize speech recognition
self.recognizer = sr.Recognizer()
def reset_conversation(self):
self.memory_module.reset_memory()
def retrieve_cached_response(self, input_text):
named_entities = self.memory_module.get_named_entities()
for entity in named_entities:
if entity.lower() in input_text.lower():
return self.response_cache.get(entity)
return None
def generate_gpt2_response(self, input_text, conversation_history):
# Prepare the conversation history for GPT-2 input format
if len(conversation_history) == 0:
gpt2_input = "USER: " + input_text + "\n"
else:
gpt2_input = "USER: " + conversation_history[-1] + "\n" # Append the user's query
gpt2_input += "BOT: " + conversation_history[-2] + "\n" # Append the bot's previous response
# Append the rest of the conversation history in reverse order
for i in range(len(conversation_history) - 3, -1, -2):
gpt2_input += "USER: " + conversation_history[i] + "\n"
gpt2_input += "BOT: " + conversation_history[i - 1] + "\n"
# Append the current user input to the conversation history
gpt2_input += "USER: " + input_text + "\n"
# Tokenize the input text
input_ids = self.tokenizer.encode(gpt2_input, return_tensors='pt')
# Generate response using the GPT-2 model
with torch.no_grad():
output = self.model.generate(input_ids, max_length=100, num_return_sequences=1)
# Decode the generated response
generated_text = self.tokenizer.decode(output[:, input_ids.shape[-1]:][0], skip_special_tokens=True)
# Process the GPT-2 response
response = generated_text.strip().split("\n")[-1] # Extract the last line (bot's response)
return response
def process_input(self, input_text, conversation_history):
named_entities = list(self.memory_module.get_named_entities())
for entity in named_entities:
if entity in input_text:
response = self.generate_gpt2_response(input_text, conversation_history)
self.memory_module.add_to_memory(response)
return response
# Check if the input contains a question
if '?' in input_text:
return "You're making me angry, you wouldn't like me when I'm angry."
# Check if the input is a greeting
greetings = ['hello', 'hi', 'hey', 'hola']
for greeting in greetings:
if greeting in input_text.lower():
return "Hello! How can I assist you today?"
# Check if the input is a statement about the model
if self.name.lower() in input_text.lower():
return "Yes, I am {}. How can I assist you today?".format(self.name)
# Check if the input is a statement about the creator
if 'creator' in input_text.lower():
return "I was created by {}.".format(self.param1)
# Check if the input is a sentiment analysis request
if 'sentiment' in input_text.lower():
sentiment = self.sentiment_module.analyze_sentiment(input_text)
if sentiment == 'positive':
return "The sentiment of the text is positive."
elif sentiment == 'negative':
return "The sentiment of the text is negative."
else:
return "The sentiment of the text is neutral."
# Retrieve a cached response if available
cached_response = self.retrieve_cached_response(input_text)
if cached_response:
return cached_response
# Generate a response using GPT-2
response = self.generate_gpt2_response(input_text, conversation_history)
# Update the conversation history and cache the response
conversation_history.append(input_text)
conversation_history.append(response)
self.response_cache[input_text] = response
# Update memory with the generated response
self.memory_module.add_to_memory(response)
return response
common_module = CommonModule(model_directory, "Chatbot", "John Doe", "Jane Smith", load_memory_file, save_memory_file)
def text_to_speech(text): common_module.speech_engine.say(text) common_module.speech_engine.runAndWait()
def exit_handler(): common_module.reset_conversation()
atexit.register(exit_handler)
recognizer = sr.Recognizer()
while True: with sr.Microphone() as source: print("Listening...") audio = recognizer.listen(source)
try:
user_input = recognizer.recognize_google(audio)
print("User:", user_input)
except sr.UnknownValueError:
print("Sorry, I could not understand your speech.")
continue
except sr.RequestError:
print("Sorry, the speech recognition service is currently unavailable.")
continue
response = common_module.process_input(user_input, [])
print("Bot:", response)
text_to_speech(response)
MEMORY_MODULE
import json import spacy
Load the spaCy English model
nlp = spacy.load('en_core_web_sm')
class MemoryModule: def init(self, load_file, save_file): self.memory = [] self.load_file = load_file self.save_file = save_file self.load_memory()
def add_to_memory(self, statement):
self.memory.append(statement)
self.save_memory()
def reset_memory(self):
self.memory = []
self.save_memory()
def save_memory(self):
with open(self.save_file, 'w') as file:
json.dump(self.memory, file)
def load_memory(self):
try:
with open(self.load_file, 'r') as file:
loaded_memory = json.load(file)
if isinstance(loaded_memory, list):
self.memory = loaded_memory
else:
print("Loaded memory is not a list. Starting with an empty memory.")
except FileNotFoundError:
print("Load memory file not found. Starting with an empty memory.")
def get_named_entities(self):
named_entities = set()
for statement in self.memory:
doc = nlp(statement)
for entity in doc.ents:
if entity.label_:
named_entities.add(entity.text)
return named_entities
memory_module = MemoryModule( r"C:\Users\withe\PycharmProjects\no hope2\Chat_Bot4\load_memory.json", r"C:\Users\withe\PycharmProjects\no hope2\Chat_Bot4\save_memory.json" )
SENTIMENT_MODULE
class SentimentAnalysisModule: def init(self): self.sia = SentimentIntensityAnalyzer()
def analyze_sentiment(self, text):
sentiment = self.sia.polarity_scores(text)
compound_score = sentiment['compound']
if compound_score >= 0.05:
return 'positive'
elif compound_score <= -0.05:
return 'negative'
else:
return 'neutral'
- Downloads last month
- 29