SkillForge45 commited on
Commit
3cc6d6c
verified
1 Parent(s): 11f7ffb

Upload SkillForge-1.0-EN.py

Browse files

English model of SkillForge.

Files changed (1) hide show
  1. SkillForge-1.0-EN.py +179 -0
SkillForge-1.0-EN.py ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import pandas as pd
3
+ import requests
4
+ from io import StringIO
5
+ from sklearn.feature_extraction.text import TfidfVectorizer
6
+ from sklearn.metrics.pairwise import cosine_similarity
7
+ import speech_recognition as sr
8
+ import pyttsx3
9
+ import time
10
+
11
+ class HybridChatBot:
12
+ def __init__(self, dataset_url=None):
13
+ self.dataset_url = dataset_url
14
+ self.qa_pairs = {}
15
+ self.vectorizer = TfidfVectorizer()
16
+ self.X = None
17
+ self.recognizer = sr.Recognizer()
18
+ self.engine = pyttsx3.init()
19
+
20
+ # Voice engine settings
21
+ voices = self.engine.getProperty('voices')
22
+ self.engine.setProperty('voice', voices[0].id)
23
+ self.engine.setProperty('rate', 150)
24
+
25
+ if dataset_url:
26
+ self.load_dataset()
27
+ self.train()
28
+
29
+ def load_dataset(self):
30
+ """Load dataset from web resource"""
31
+ try:
32
+ response = requests.get(self.dataset_url)
33
+ response.raise_for_status()
34
+
35
+ if self.dataset_url.endswith('.csv'):
36
+ data = pd.read_csv(StringIO(response.text))
37
+ elif self.dataset_url.endswith('.json'):
38
+ data = pd.read_json(StringIO(response.text))
39
+ else:
40
+ print("File format not supported")
41
+ return
42
+
43
+ for _, row in data.iterrows():
44
+ self.qa_pairs[row["question"].lower()] = row["answer"]
45
+
46
+ print(f"Loaded {len(self.qa_pairs)} question-answer pairs")
47
+
48
+ except Exception as e:
49
+ print(f"Error loading dataset: {e}")
50
+
51
+ def train(self):
52
+ """Train the model on loaded data"""
53
+ if not self.qa_pairs:
54
+ print("No data to train on!")
55
+ return
56
+
57
+ questions = list(self.qa_pairs.keys())
58
+ self.X = self.vectorizer.fit_transform(questions)
59
+ print("Model trained on loaded data")
60
+
61
+ def add_qa_pair(self, question, answer):
62
+ """Add new question-answer pair"""
63
+ self.qa_pairs[question.lower()] = answer
64
+ self.train()
65
+
66
+ def get_response(self, user_input):
67
+ """Get response to user input"""
68
+ if not self.qa_pairs:
69
+ return "I haven't been trained yet. Please add questions and answers."
70
+
71
+ user_vec = self.vectorizer.transform([user_input.lower()])
72
+ similarities = cosine_similarity(user_vec, self.X)
73
+ best_match_idx = np.argmax(similarities)
74
+ best_match_score = similarities[0, best_match_idx]
75
+
76
+ if best_match_score > 0.5:
77
+ best_question = list(self.qa_pairs.keys())[best_match_idx]
78
+ return self.qa_pairs[best_question]
79
+ else:
80
+ return None
81
+
82
+ def text_to_speech(self, text):
83
+ """Convert text to speech"""
84
+ self.engine.say(text)
85
+ self.engine.runAndWait()
86
+
87
+ def speech_to_text(self):
88
+ """Recognize speech from microphone"""
89
+ with sr.Microphone() as source:
90
+ print("\nSpeak now...")
91
+ self.recognizer.adjust_for_ambient_noise(source)
92
+ try:
93
+ audio = self.recognizer.listen(source, timeout=5)
94
+ text = self.recognizer.recognize_google(audio, language="en-US")
95
+ print(f"Recognized: {text}")
96
+ return text
97
+ except sr.UnknownValueError:
98
+ print("Speech not recognized")
99
+ return None
100
+ except sr.RequestError:
101
+ print("Recognition service error")
102
+ return None
103
+ except sr.WaitTimeoutError:
104
+ print("Timeout expired")
105
+ return None
106
+
107
+ def run(self):
108
+ """Improved interaction interface"""
109
+ print("\n" + "="*50)
110
+ print("WELCOME TO INTELLIGENT CHATBOT".center(50))
111
+ print("="*50)
112
+
113
+ current_mode = "text"
114
+ while True:
115
+ print("\n" + "-"*50)
116
+ print(f"Current input mode: {current_mode.upper()}")
117
+ print("[1] Send text message")
118
+ print("[2] Speak to the bot")
119
+ print("[3] Switch input mode")
120
+ print("[4] Teach the bot a new answer")
121
+ print("[5] Exit")
122
+
123
+ try:
124
+ choice = input("Select action (1-5): ").strip()
125
+
126
+ if choice == "1":
127
+ user_input = input("\nYour message: ")
128
+ if user_input.lower() in ["exit", "stop"]:
129
+ break
130
+
131
+ response = self.get_response(user_input)
132
+ if response:
133
+ print(f"\nBot: {response}")
134
+ self.text_to_speech(response)
135
+ else:
136
+ print("\nBot: I don't know what to answer. Would you like to teach me?")
137
+
138
+ elif choice == "2":
139
+ user_input = self.speech_to_text()
140
+ if user_input:
141
+ if user_input.lower() in ["exit", "stop"]:
142
+ break
143
+
144
+ response = self.get_response(user_input)
145
+ if response:
146
+ print(f"\nBot: {response}")
147
+ self.text_to_speech(response)
148
+ else:
149
+ print("\nBot: I don't know how to respond to that.")
150
+ self.text_to_speech("I don't know how to respond to that")
151
+
152
+ elif choice == "3":
153
+ current_mode = "voice" if current_mode == "text" else "text"
154
+ print(f"\nMode changed to: {current_mode.upper()}")
155
+
156
+ elif choice == "4":
157
+ print("\nTeaching the bot:")
158
+ question = input("Enter question: ")
159
+ answer = input("Enter answer: ")
160
+ self.add_qa_pair(question, answer)
161
+ print("Bot successfully trained!")
162
+
163
+ elif choice == "5":
164
+ print("\nShutting down...")
165
+ break
166
+
167
+ else:
168
+ print("\nPlease select option from 1 to 5")
169
+
170
+ except KeyboardInterrupt:
171
+ print("\nShutting down...")
172
+ break
173
+
174
+ if __name__ == "__main__":
175
+
176
+ DATASET_URL = "https://raw.githubusercontent.com/user/repo/main/qa_data.csv"
177
+
178
+ bot = HybridChatBot(DATASET_URL)
179
+ bot.run()