Movetosrc

This commit is contained in:
Technerd Brainiac
2022-11-23 00:09:49 +05:30
committed by GitHub
parent 054697fcea
commit cf0f811750
5 changed files with 0 additions and 0 deletions

189
src/Jarvis2.py Normal file
View File

@@ -0,0 +1,189 @@
#!/usr/bin/env python3
import datetime
import getpass
import os
import random
import smtplib
import sys
import webbrowser
import pyttsx3
import speech_recognition as sr
import wikipedia
import gui
print("Initializing Jarvis....")
master = getpass.getuser() or "Harsha"
engine = pyttsx3.init()
voices = engine.getProperty("voices")
engine.setProperty("voice", voices[0].id)
popular_websites = {
"google": "https://www.google.com",
"youtube": "https://www.youtube.com",
"wikipedia": "https://www.wikipedia.org",
"amazon": "https://www.amazon.com",
}
search_engines = {
"google": "https://www.google.com",
"youtube": "https://www.youtube.com",
"bing": "https://www.bing.com",
}
def open_url(url):
webbrowser.open(url)
chrome_path = r"open -a /Applications/Google\ Chrome.app %s"
webbrowser.get(chrome_path).open(url)
def search(search_query, search_engine):
try:
open_url(f"{search_engines[search_engine]}/search?q={search_query}")
except IndexError:
open_url(f"https://www.google.com/search?q={search_query}")
def speak(text):
gui.speak(text)
engine.say(text)
engine.runAndWait()
def print_and_speak(text):
print(text)
speak(text)
def wish_me():
hour = datetime.datetime.now().hour
if hour < 12:
speak("Good Morning" + master)
elif hour < 18:
speak("Good Afternoon" + master)
else:
speak("Good Evening" + master)
# speak("Hey I am Jarvis. How may I help you")
# This is where our programme begins....
def take_command():
r = sr.Recognizer()
with sr.Microphone() as source:
print("Listening....")
r.pause_threshold = 0.5
r.energy_threshold = 300
"""The default value as per speech_recognition documentation.
Increase if application stops responding. and decrease if
assistant doesn't execute any command and just says next
command sir."""
audio = r.listen(source)
print("Recognizing....")
query = ""
try:
query = r.recognize_google(audio, language="en-in")
print("User said: " + query)
except sr.UnknownValueError:
print("Sorry could you please try again?")
except Exception as e:
print(e)
print("Say that again, please?")
return query
speak("Initializing Jarvis....")
wish_me()
def execute_the_command_said_by_user():
query = take_command().lower()
# logic for executing basic tasks
if "wikipedia" in query:
speak("Searching wikipedia....")
query = query.replace("wikipedia", "")
print_and_speak(wikipedia.summary(query, sentences=2))
elif "what's up" in query or "how are you" in query:
st_msgs = (
"Just doing my thing!",
"I am fine!",
"Nice!",
"I am nice and full of energy",
)
speak(random.choice(st_msgs))
elif "date" in query:
print_and_speak(f"{datetime.datetime.now():%A, %B %d, %Y}")
elif "time" in query:
print_and_speak(f"{datetime.datetime.now():%I %M %p}")
elif "open" in query.lower():
website = query.replace("open", "").strip().lower()
try:
open_url(popular_websites[website])
except IndexError: # If the website is unknown
print(f"Unknown website: {website}")
speak(f"Sorry, I don't know the website {website}")
elif "search" in query.lower():
search_query = query.split("for")[-1]
search_engine = query.split("for")[0].replace("search", "").strip().lower()
search(search_query, search_engine)
elif "email" in query:
speak("Who is the recipient? ")
recipient = take_command()
if "me" in recipient:
try:
speak("What should I say? ")
content = take_command()
server = smtplib.SMTP("smtp.gmail.com", 587)
server.ehlo()
server.starttls()
server.login("Your_Username", "Your_Password")
server.sendmail("Your_Username", "Recipient_Username", content)
server.close()
speak("Email sent!")
except Exception:
speak("Sorry Sir! I am unable to send your message at this moment!")
elif "nothing" in query or "abort" in query or "stop" in query:
speak("okay")
speak("Bye Sir, have a good day.")
sys.exit()
elif "hello" in query:
speak("Hello Sir")
elif "bye" in query:
speak("Bye Sir, have a good day.")
sys.exit()
elif "play music" in query:
music_folder = "Your_music_folder_path(absolute_path)"
music = ("music1", "music2", "music3", "music4", "music5")
random_music = music_folder + random.choice(music) + ".mp3"
os.system(random_music)
speak("Playing your request")
speak("Next Command! Sir!")
gui.set_speak_command(execute_the_command_said_by_user)
gui.mainloop()

148
src/Jarvis2_4windows.py Normal file
View File

@@ -0,0 +1,148 @@
import configparser # isort: skip
import os # isort: skip
import gui # isort: skip
import speech_recognition as sr # isort: skip
from actions import ( # isort: skip
change_rate,
change_voice,
change_volume,
search_engine_selector,
set_gui_speak,
speak,
wish_me
)
from commands import ( # isort: skip
command_bye,
command_hello,
command_mail,
command_nothing,
command_open,
command_pause_music,
command_play_music,
command_search,
command_stop_music,
command_unpause_music,
command_whatsup,
command_wikipedia
)
popular_websites = {
"google": "https://www.google.com",
"youtube": "https://www.youtube.com",
"wikipedia": "https://www.wikipedia.org",
"amazon": "https://www.amazon.com",
"github": "https://www.github.com",
}
def main(search_engine, take_command, debug):
def execute_the_command_said_by_user():
query = take_command()
# logic for executing commands without arguments
phrases = {
"what's up": command_whatsup,
"nothing": command_nothing,
"abort": command_nothing,
"stop": command_nothing,
"hello": command_hello,
"bye": command_bye,
"play music": command_play_music,
"unpause": command_unpause_music,
"pause music": command_pause_music,
"stop music": command_stop_music
}
for phrase, command in phrases.items():
if phrase in query:
command()
# logic for executing commands with arguments
if "wikipedia" in query:
command_wikipedia(speak, debug, query)
elif "open" in query:
command_open(
query,
popular_websites,
debug,
search_engine,
take_command
)
elif "search" in query:
command_search(query, search_engine)
elif "mail" in query:
command_mail(take_command)
elif "change rate" in query:
change_rate(query, take_command)
elif "change voice" in query.lower():
change_voice(query, take_command)
elif "change volume" in query.lower():
change_volume(query, take_command)
speak("Next Command! Sir!")
gui.set_speak_command(execute_the_command_said_by_user)
set_gui_speak(gui.speak)
gui.mainloop()
def run():
master = config['DEFAULT']['master']
search_engine = search_engine_selector(config)
debug = config['DEFAULT']['debug']
if debug == "True":
def take_command():
return input("Command |--> ")
else:
def take_command():
r = sr.Recognizer()
with sr.Microphone() as source:
print("Listening....")
r.pause_threshold = 0.5
r.energy_threshold = int(config['DEFAULT']['energy_threshold'])
audio = r.listen(source)
query = " "
try:
print("Recognizing....")
query = r.recognize_google(audio, language="en-in")
print("user said: " + query)
except sr.UnknownValueError:
if debug == "True":
print("Sorry Could You please try again")
else:
pass
speak("Sorry Could You please try again")
except Exception as e:
if debug == "True":
print(e)
print("Say That Again Please")
else:
pass
return query
speak(text="Initializing Jarvis....")
wish_me(master)
main(search_engine, take_command, debug)
if os.path.isfile('./config.ini'): # Checks if config.ini exists.
config = configparser.ConfigParser() # if exists loads library.
config.read('config.ini') # and also the file.
run() # Then it launches the main program
else:
# if it doesn't exist it drops an error message and exits.
print('You need a config.ini file.')
print('Check the documentation in the Github Repository.')

155
src/actions.py Normal file
View File

@@ -0,0 +1,155 @@
import configparser
import datetime
import webbrowser
import pyttsx3
import requests
def search_engine_selector(config):
if config['DEFAULT']['search_engine'] == 'Google':
return "https://www.google.com"
elif config['DEFAULT']['search_engine'] == 'Bing':
return "https://www.bing.com"
elif config['DEFAULT']['search_engine'] == 'DuckDuckGo':
return "https://www.duckduckgo.com"
elif config['DEFAULT']['search_engine'] == 'Youtube':
return "https://www.youtube.com"
else:
# If none of default ones selected triesto fetch https://example.com
# to see if its valid as search engine and if its valid it uses it.
# If not valid it uses Google.
try:
if requests.get(
f"https://{config['DEFAULT']['search_engine'].lower()}.com",
params={'q': 'example'}
).status_code == 200:
return (
f"https://{config['DEFAULT']['search_engine'].lower()}.com"
)
else:
return "https://www.google.com"
except Exception as e:
print(e)
return "https://www.google.com"
def open_url(url):
webbrowser.open(url)
chrome_path = r"open -a /Applications/Google\ Chrome.app %s"
webbrowser.get(chrome_path).open(url)
def search(search_query, search_engine):
open_url(f"{search_engine}/search?q={search_query}")
def gui_speak(text):
pass
def set_gui_speak(command):
global gui_speak
gui_speak = command
def speak(text):
gui_speak(text)
engine.say(text)
engine.runAndWait()
def wish_me(master):
hour = datetime.datetime.now().hour
# print(hour)
if hour >= 0 and hour < 12:
speak("Good Morning" + master)
elif hour >= 12 and hour < 18:
speak("Good Afternoon" + master)
else:
speak("Good Evening" + master)
# speak("Hey I am Jarvis. How may I help you")
def change_rate(query, take_command):
try:
rate = query.split('to')[-1]
engine.setProperty('rate', int(rate))
speak("¿Do you want to keep this config?")
answer = take_command()
if answer == "yes":
config['DEFAULT']['rate'] = rate
with open('config.ini', 'w') as configfile:
config.write(configfile)
else:
pass
except Exception:
speak("Invalid value. Please try again.")
def change_voice(query, take_command):
try:
voice = query.split('to')[-1]
if voice == "male":
engine.setProperty('voice', voices[0].id)
speak("¿Do you want to keep this config?")
if take_command() == "yes":
config['DEFAULT']['voice'] = 'Male'
with open('config.ini', 'w') as configfile:
config.write(configfile)
else:
pass
elif voice == "female":
engine.setProperty('voice', voices[1].id)
speak("¿Do you want to keep this config?")
answer = take_command()
print(answer)
if answer == "yes":
config['DEFAULT']['voice'] = 'Female'
with open('config.ini', 'w') as configfile:
config.write(configfile)
else:
pass
else:
speak("Invalid value. Please try again.")
except Exception:
speak("Invalid value. Please try again.")
def change_volume(query, take_command):
try:
volume = query.split('to')[-1]
engine.setProperty('volume', int(volume)/100)
speak("¿Do you want to keep this config?")
answer = take_command()
if answer == "yes":
config['DEFAULT']['volume'] = volume
with open('config.ini', 'w') as configfile:
config.write(configfile)
else:
pass
except Exception:
speak("Invalid value. Please try again.")
engine = pyttsx3.init("sapi5")
voices = engine.getProperty("voices")
config = configparser.ConfigParser()
config.read('config.ini')
if config['DEFAULT']['voice'] == 'Male':
engine.setProperty('voice', voices[0].id)
else:
engine.setProperty('voice', voices[1].id)
try:
engine.setProperty('rate', int(config['DEFAULT']['rate']))
engine.setProperty('volume', int(config['DEFAULT']['volume'])/100)
except Exception:
speak("Bad config. Setting up default values")

115
src/commands.py Normal file
View File

@@ -0,0 +1,115 @@
import configparser
import random
import smtplib
import sys
import wikipedia
from pygame import mixer
from actions import open_url, search, speak
config = configparser.ConfigParser() # if exists loads library.
config.read('config.ini')
def command_wikipedia(debug, query):
speak("Searching wikipedia....")
query = query.replace("wikipedia", "")
results = wikipedia.summary(query, sentences=2)
if debug == "True":
print(results)
else:
pass
speak(results)
def command_whatsup():
st_msgs = [
"Just doing my thing!",
"I am fine!",
"Nice!",
"I am nice and full of energy",
]
speak(random.choice(st_msgs))
def command_open(query, popular_websites, debug, search_engine, take_command):
website = query.replace("open", "").strip().lower()
try:
open_url(popular_websites[website])
except KeyError: # If the website is unknown
if debug == "True":
print(f"Unknown website: {website}")
else:
pass
speak(f"Sorry, i don't know the website {website}")
speak(f"¿Do you want me to search {website} in the web?")
if take_command() == "yes":
search(website, search_engine)
else:
pass
def command_search(query, search_engine):
search_query = query.split("for")[-1]
search(search_query, search_engine)
def command_mail(take_command):
speak("Who is the recipient? ")
recipient = take_command()
try:
speak("What should I say? ")
content = take_command()
email = config['EMAIL']
server = smtplib.SMTP(email['server'], email['port'])
server.ehlo()
server.starttls()
server.login(email['username'], email['password'])
server.sendmail(email['username'], recipient, content)
server.close()
speak("Email sent!")
except Exception:
speak("Sorry Sir!")
speak("I am unable to send your message at this moment!")
def command_nothing():
speak("okay")
speak("Bye Sir, have a good day.")
sys.exit()
def command_hello():
speak("Hello Sir")
def command_bye():
speak("Bye Sir, have a good day.")
sys.exit()
def command_play_music():
try:
music_folder = config['DEFAULT']['musicPath']
music = ("music1", "music2", "music3", "music4")
random_music = music_folder + random.choice(music) + ".mp3"
speak("Playing your request")
mixer.music.load(random_music)
mixer.music.play()
except Exception as e:
speak(e)
def command_pause_music():
mixer.music.pause()
def command_stop_music():
mixer.music.stop()
def command_unpause_music():
mixer.music.unpause()

30
src/gui.py Normal file
View File

@@ -0,0 +1,30 @@
import tkinter as tk
root = tk.Tk()
main_frame = tk.Frame(master=root)
chat_listbox = tk.Listbox(master=main_frame, height=200, width=50)
scroll_bar = tk.Scrollbar(master=main_frame)
speak_button = tk.Button(master=root, text='Speak', command=lambda: None)
def set_speak_command(command):
speak_button.configure(command=command)
speak_button.pack(side=tk.LEFT, anchor=tk.SW)
def speak(text):
chat_listbox.insert('end', f'Assistant: {text}')
scroll_bar.pack(side=tk.RIGHT, fill=tk.Y)
chat_listbox.pack(fill=tk.Y, side=tk.RIGHT)
scroll_bar.configure(command=chat_listbox.yview)
chat_listbox.configure(yscrollcommand=scroll_bar.set)
main_frame.pack(fill=tk.BOTH)
root.geometry('700x500')
root.minsize(700, 500)
root.wm_title('Desktop assistant')
root.resizable(False, True)
mainloop = root.mainloop