Я думаю что все знают голосового помощника Джарвиса из фильма «Железный человек». И много кто мечтал сделать голосового помощника своими руками. В этой статье мы его напишем.
Что понадобится
- Python версии 3.6.8
- Установленные по порядку модули: Librariespywin32, pipywin32, pyttsx3, SpeechRecognition, PyAudio, fuzzywuzzy, pyowm, python‑Levenshtein, CurrencyConverter.
Написание самого помощник
Создаём в папке вот такие файлы:
functions.py
Открываем файл functions.py и импортируем библиотеки и остальные файлы:
import pyttsx3
import speech_recognition as sr
import os
from fuzzywuzzy import fuzz
import datetime
import win32com.client as wincl
import site
import calculator
import envelope
import translator
После этого вставляем данный код и вписываем в строку alias название помощника(у нас pythonguru):
opts = {«alias»: (‘pythonguru’, ‘пайтонгуру’, ‘гурупайтон’),
«tbr»: (‘скажи’, ‘расскажи’, ‘покажи’, ‘сколько’, ‘произнеси’, ‘как’,’сколько’,’поставь’,’переведи’, «засеки»,’запусти’,’сколько будет’),
«cmds»:
{«ctime»: (‘текущее время’, ‘сейчас времени’, ‘который час’, ‘время’, ‘какое сейчас время’),
‘startStopwatch’: (‘запусти секундомер’, «включи секундомер», «засеки время»),
‘stopStopwatch’: (‘останови секундомер’, «выключи секундомер», «останови»),
«stupid1»: (‘расскажи анекдот’, ‘рассмеши меня’, ‘ты знаешь анекдоты’, «шутка», «прикол»),
«calc»: (‘прибавить’,’умножить’,’разделить’,’степень’,’вычесть’,’поделить’,’х’,’+’,’-‘,’/’),
«shutdown»: (‘выключи’, ‘выключить’, ‘отключение’, ‘отключи’, ‘выключи компьютер’),
«conv»: («валюта», «конвертер»,»доллар»,’руб’,’евро’),
«internet»: («открой», «вк», «гугл», «сайт», ‘вконтакте’, «ютуб»),
«translator»: («переводчик»,»translate»),
«deals»: («дела»,»делишки», ‘как сам’, ‘как дела’)}}
Дальше подключаем микрофон и голос самого помощника
startTime = 0
speak_engine = pyttsx3.init()
voices = speak_engine.getProperty(‘voices’)
speak_engine.setProperty(‘voice’, voices[2].id)
r = sr.Recognizer()
m = sr.Microphone(device_index=1)
voice = «str»
Если у вас не работает микрофон то пробуйте менять значение device_index=1 (например на device_index=2)
Далее вставляем весь этот код (функции разговора ассистента, фунции прослушки микрофона и возможности самого ассистента):
def speak(what):
print(what)
speak = wincl.Dispatch(«SAPI.SpVoice»)
speak.Speak(what)
def callback(recognizer, audio):
try:
global voice
voice = recognizer.recognize_google(audio, language=»ru-RU»).lower()
print(«[log] Распознано: » + voice)
if voice.startswith(opts[«alias»]):
cmd = voice
for x in opts[‘alias’]:
cmd = cmd.replace(x, «»).strip()
for x in opts[‘tbr’]:
cmd = cmd.replace(x, «»).strip()
voice = cmd
# распознаем и выполняем команду
cmd = recognize_cmd(cmd)
execute_cmd(cmd[‘cmd’])
except sr.UnknownValueError:
print(«[log] Голос не распознан!»)
except sr.RequestError as e:
print(«[log] Неизвестная ошибка, проверьте интернет!»)
def listen():
with m as source:
r.adjust_for_ambient_noise(source)
stop_listening = r.listen_in_background(m, callback)
while True: time.sleep(0.1)
def recognize_cmd(cmd):
RC = {‘cmd’: », ‘percent’: 0}
for c, v in opts[‘cmds’].items():
for x in v:
vrt = fuzz.ratio(cmd, x)
if vrt > RC[‘percent’]:
RC[‘cmd’] = c
RC[‘percent’] = vrt
return RC
ef execute_cmd(cmd):
global startTime
if cmd == ‘ctime’:
now = datetime.datetime.now()
speak(«Сейчас {0}:{1}».format(str(now.hour), str(now.minute)))
elif cmd == ‘shutdown’:
os.system(‘shutdown -s’)
speak(«Выключаю…»)
elif cmd == ‘calc’:
calc.calculator()
elif cmd == ‘conv’:
convert.convertation()
elif cmd == ‘translator’:
translate.translate()
elif cmd == ‘stupid1’:
anekdot.fun()
elif cmd == ‘internet’:
browser.browser()
elif cmd == ‘startStopwatch’:
speak(«Секундомер запущен»)
startTime = time.time()
elif cmd == «stopStopwatch»:
if startTime != 0:
Time = time.time() — startTime
speak(f»Прошло {round(Time // 3600)} часов {round(Time // 60)} минут {round(Time % 60, 2)} секунд»)
startTime = 0
else:
speak(«Секундомер не включен»)
elif cmd == ‘deals’:
speak(«Пока отлично.»)
else:
print(«Команда не распознана!»)
start.py
Этот файл будет служить для запуска всего ассистента
import functions
import time
import datetime
now = datetime.datetime.now()
if now.hour >= 6 and now.hour < 12:
funcs.speak(«Доброе утро!»)
elif now.hour >= 12 and now.hour < 18:
funcs.speak(«Добрый день!»)
elif now.hour >= 18 and now.hour < 23:
funcs.speak(«Добрый вечер!»)
else:
funcs.speak(«Доброй ночи!»)
funcs.listen()
site.py
С его помощью мы будем открывать любые сайты.
import webbrowser
import funcs
def browser():
sites = {«https://vk.com»:[«vk»,»вк»], ‘https://www.youtube.com/’:[‘youtube’, ‘ютуб’], ‘https://ru.wikipedia.org’: [«вики», «wiki»], ‘https://ru.aliexpress.com’:[‘али’, ‘ali’, ‘aliexpress’, ‘алиэспресс’], ‘http://google.com’:[‘гугл’,’google’], ‘https://www.amazon.com’:[‘амазон’, ‘amazon’], ‘https://www.apple.com/ru’:[‘apple’,’эпл’] ‘
https://telete.in/gurupython’:[‘пайтонгуру’, ‘pythonguru’]}
site = funcs.voice.split()[-1]
for k, v in sites.items():
for i in v:
if i not in site.lower():
open_tab = None
else:
open_tab = webbrowser.open_new_tab(k)
break
if open_tab is not None:
break
calculator.py
Самый простейший калькулятор на пайтоне
import funcs
def calculator():
try:
list_of_nums = funcs.voice.split()
num_1,num_2 = int((list_of_nums[-3]).strip()), int((list_of_nums[-1]).strip())
opers = [list_of_nums[0].strip(),list_of_nums[-2].strip()]
for i in opers:
if ‘дел’ in i or ‘множ’ in i or ‘лож’ in i or ‘приба’ in i or ‘выч’ in i or i == ‘x’ or i == ‘/’ or i ==’+’ or i == ‘-‘ or i == ‘*’:
oper = i
break
else:
oper = opers[1]
if oper == «+» or ‘слож’ in oper:
ans = num_1 + num_2
elif oper == «-» or ‘выче’ in oper:
ans = num_1 — num_2
elif oper == «х» or ‘множ’ in oper:
ans = num_1 * num_2
elif oper == «/» or ‘дел’ in oper:
if num_2 != 0:
ans = num_1 / num_2
else:
funcs.speak(«Делить на ноль невозможно»)
elif «степен» in oper:
ans = num_1 ** num_2
funcs.speak(«{0} {1} {2} = {3}».format(list_of_nums[-3], list_of_nums[-2], list_of_nums[-1], ans))
except:
funcs.speak(«Скажите, например: Сколько будет 5+5?»)
envelope.py
Конвертер денег
from currency_converter import CurrencyConverter
import funcs
def convertation():
class CurrencyError(Exception):
pass
c = CurrencyConverter()
money = None
from_currency = None
to_currency = None
list_of_conv = funcs.voice.split()
if len(list_of_conv) > 4:
list_of_conv = list_of_conv[1:]
else:
print()
while money is None:
try:
money = list_of_conv[0]
except ValueError:
funcs.speak(«Скажите, к примеру: 50 долларов в рубли»)
break
while from_currency is None:
try:
list_of_conv[0] = int(list_of_conv[0])
except ValueError:
funcs.speak(«Скажите, к примеру: 50 долларов в рубли»)
break
try:
if «руб» in list_of_conv[1]:
from_currency = «RUB»
elif «дол» in list_of_conv[1]:
from_currency = «USD»
elif «евр» in list_of_conv[1]:
from_currency = «EUR»
if from_currency not in c.currencies:
raise CurrencyError
except (CurrencyError, IndexError):
from_currency = None
funcs.speak(«Скажите, например: 50 долларов в рубли»)
break
while to_currency is None:
try:
list_of_conv[0] = int(list_of_conv[0])
except ValueError:
return None
try:
if «руб» in list_of_conv[3]:
to_currency = «RUB»
elif «дол» in list_of_conv[3]:
to_currency = «USD»
elif «евр» in list_of_conv[3]:
to_currency = «EUR»
if to_currency not in c.currencies:
raise CurrencyError
except (CurrencyError, IndexError):
to_currency = None
funcs.speak(«Скажите, например: 50 долларов в рубли»)
break
while True:
try:
funcs.speak(f»{money} {from_currency} в {to_currency} — »
f»{round(c.convert(money, from_currency, to_currency), 2)}»)
break
except ValueError:
funcs.speak(«Скажите, например: 50 долларов в рубли»)
break
translator.py
Простой переводчик
import requests
import funcs
def translate():
url = ‘https://translate.yandex.net/api/v1.5/tr.json/translate?’
key = ‘trnsl.1.1.20190227T075339Z.1b02a9ab6d4a47cc.f37d50831b51374ee600fd6aa0259419fd7ecd97’
text = funcs.voice.split()[1:]
lang = ‘en-ru’
r = requests.post(url, data={‘key’: key, ‘text’: text, ‘lang’: lang}).json()
try:
funcs.speak(r[«text»])
except:
funcs.speak(«Обратитесь к переводчику, начиная со слова ‘Переводчик'»)
Как видите сделать своего голосового помощника на Python не так уж сложно, главное иметь знания об основах языка и всё получится.
Совершенствуй знания по Python каждый день у нас на телеграм канале, PythonGuru.
Do you remember J.A.R.V.I.S., Tony Stark’s virtual personal assistant? If you’ve seen any of the Ironman or Avengers movies, I’m sure you do.
Have you ever wondered whether you could create your own personal assistant? Yes? Tony Stark can help us with that!
Oops, did you forget he is no more? It’s sad that he can no longer save us. But hey, your favorite programming language Python can help you with that.
Yes, you heard it right. We can create our own J.A.R.V.I.S. using Python. Let’s dive into it!
Project Setup
While you’re coding this project, you’ll come across various modules and external libraries. Let’s learn about them and install them. But before we install them, let’s create a virtual environment and activate it.
We are going to create a virtual environment using virtualenv
. Python now ships with a pre-installed virtualenv
library. So, to create a virtual environment, you can use the below command:
$ python -m venv env
The above command will create a virtual environment named env
. Now, we need to activate the environment using the command:
$ . env/Scripts/activate
To verify if the environment has been activated or not, you can see (env)
in your terminal. Now, we can install the libraries.
-
pyttsx3: pyttsx is a cross-platform text to speech library which is platform-independent. The major advantage of using this library for text-to-speech conversion is that it works offline. To install this module, type the below command in the terminal:
$ pip install pyttsx3
- SpeechRecognition: This allows us to convert audio into text for further processing. To install this module, type the below command in the terminal:
$ pip install SpeechRecognition
- pywhatkit: This is an easy-to-use library that will help us interact with the browser very easily. To install the module, run the following command in the terminal:
$ pip install pywhatkit
- wikipedia: We’ll use this to fetch a variety of information from the Wikipedia website. To install this module, type the below command in the terminal:
$ pip install wikipedia
- requests: This is an elegant and simple HTTP library for Python that allows you to send HTTP/1.1 requests extremely easily. To install the module, run the following command in the terminal:
$ pip install requests
.env File
We need this file to store some private data such as API Keys, Passwords, and so on that are related to the project. For now, let’s store the name of the user and the bot.
Create a file named .env
and add the following content there:
USER=Ashutosh
BOTNAME=JARVIS
To use the contents from the .env
file, we’ll install another module called python-decouple as:
$ pip install python-decouple
Learn more about Environment Variables in Python here.
Before we start defining a few important functions, let’s create a speech engine first.
import pyttsx3
from decouple import config
USERNAME = config('USER')
BOTNAME = config('BOTNAME')
engine = pyttsx3.init('sapi5')
# Set Rate
engine.setProperty('rate', 190)
# Set Volume
engine.setProperty('volume', 1.0)
# Set Voice (Female)
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)
Let’s analyze the above script. First of all, we have initialized an engine
using the pyttsx3
module. sapi5
is a Microsoft Speech API that helps us use the voices. Learn more about it here.
Next, we are setting the rate
and volume
properties of the speech engine using setProperty
method.
Now, we can get the voices from the engine using the getProperty
method. voices
will be a list of voices available in our system. If we print it, we can see as below:
[<pyttsx3.voice.Voice object at 0x000001AB9FB834F0>, <pyttsx3.voice.Voice object at 0x000001AB9FB83490>]
The first one is a male voice and the other one is a female voice. JARVIS was a male assistant in the movies, but I’ve chosen to set the voice
property to the female for this tutorial using the setProperty
method.
Note: If you get an error related to PyAudio, download PyAudio wheel from here and install it within the virtual environment.
Also, using the config
method from decouple, we are getting the value of USER
and BOTNAME
from the environment variables.
Enable the Speak Function
The speak function will be responsible for speaking whatever text is passed to it. Let’s see the code:
# Text to Speech Conversion
def speak(text):
"""Used to speak whatever text is passed to it"""
engine.say(text)
engine.runAndWait()
In the speak()
method, the engine speaks whatever text is passed to it using the say()
method. Using the runAndWait()
method, it blocks during the event loop and returns when the commands queue is cleared.
Enable the Greet Function
This function will be used to greet the user whenever the program is run. According to the current time, it greets Good Morning, Good Afternoon, or Good Evening to the user.
from datetime import datetime
def greet_user():
"""Greets the user according to the time"""
hour = datetime.now().hour
if (hour >= 6) and (hour < 12):
speak(f"Good Morning {USERNAME}")
elif (hour >= 12) and (hour < 16):
speak(f"Good afternoon {USERNAME}")
elif (hour >= 16) and (hour < 19):
speak(f"Good Evening {USERNAME}")
speak(f"I am {BOTNAME}. How may I assist you?")
First, we get the current hour, that is if the current time is 11:15 AM, the hour will be 11. If the value of hour is between 6 and 12, wish Good Morning to the user. If the value is between 12 and 16, wish Good Afternoon and similarly, if the value is between 16 and 19, wish Good Evening. We are using the speak method to speak to the user.
How to Take User Input
We use this function to take the commands from the user and recognize the command using the speech_recognition
module.
import speech_recognition as sr
from random import choice
from utils import opening_text
def take_user_input():
"""Takes user input, recognizes it using Speech Recognition module and converts it into text"""
r = sr.Recognizer()
with sr.Microphone() as source:
print('Listening....')
r.pause_threshold = 1
audio = r.listen(source)
try:
print('Recognizing...')
query = r.recognize_google(audio, language='en-in')
if not 'exit' in query or 'stop' in query:
speak(choice(opening_text))
else:
hour = datetime.now().hour
if hour >= 21 and hour < 6:
speak("Good night sir, take care!")
else:
speak('Have a good day sir!')
exit()
except Exception:
speak('Sorry, I could not understand. Could you please say that again?')
query = 'None'
return query
We have imported speech_recognition
module as sr
. The Recognizer class within the speech_recognition
module helps us recognize the audio. The same module has a Microphone class that gives us access to the microphone of the device. So with the microphone as the source
, we try to listen to the audio using the listen()
method in the Recognizer class.
We have also set the pause_threshold
to 1, that is it will not complain even if we pause for one second during we speak.
Next, using the recognize_google()
method from the Recognizer class, we try to recognize the audio. The recognize_google()
method performs speech recognition on the audio passed to it, using the Google Speech Recognition API.
We have set the language to en-in
, which is English India. It returns the transcript of the audio which is nothing but a string. We’ve stored it in a variable called query
.
If the query has exit or stop words in it, it means we’re asking the assistant to stop immediately. So, before stopping, we greet the user again as per the current hour. If the hour is between 21 and 6, wish Good Night to the user, else, some other message.
We create a utils.py
file which has just one list containing a few statements like this:
opening_text = [
"Cool, I'm on it sir.",
"Okay sir, I'm working on it.",
"Just a second sir.",
]
If the query doesn’t have those two words (exit or stop), we speak something to tell the user that we have heard them. For that, we will use the choice method from the random module to randomly select any statement from the opening_text
list. After speaking, we exit from the program.
During this entire process, if we encounter an exception, we apologize to the user and set the query
to None. In the end, we return the query
.
How to Set Up Offline Functions
Inside the functions
folder, create a Python file called os_ops.py
. In this file, we’ll create various functions to interact with the OS.
import os
import subprocess as sp
paths = {
'notepad': "C:\Program Files\Notepad++\notepad++.exe",
'discord': "C:\Users\ashut\AppData\Local\Discord\app-1.0.9003\Discord.exe",
'calculator': "C:\Windows\System32\calc.exe"
}
In the above script, we have created a dictionary called paths
which has a software name as the key and its path as the value. You can change the paths according to your system and add more software paths if you need to do so.
How to Open the Camera
We’ll use this function to open the camera in our system. We’ll be using the subprocess
module to run the command.
def open_camera():
sp.run('start microsoft.windows.camera:', shell=True)
How to Open Notepad and Discord
We’ll use these functions to open Notepad++ and Discord in the system.
def open_notepad():
os.startfile(paths['notepad'])
def open_discord():
os.startfile(paths['discord'])
How to Open the Command Prompt
We’ll use this function to open the command prompt in our system.
def open_cmd():
os.system('start cmd')
How to Open the Calculator
We’ll use this function to open the calculator on our system.
def open_calculator():
sp.Popen(paths['calculator'])
How to Set Up Online Functions
We’ll be adding several online functions. They are:
- Find my IP address
- Search on Wikipedia
- Play videos on YouTube
- Search on Google
- Send WhatsApp message
- Send Email
- Get Latest News Headlines
- Get Weather Report
- Get Trending Movies
- Get Random Jokes
- Get Random Advice
Let’s create a file called online_ops.py
within the functions
directory, and start creating these functions one after another. For now, add the following code in the file:
import requests
import wikipedia
import pywhatkit as kit
from email.message import EmailMessage
import smtplib
from decouple import config
Before we start working with APIs, if you’re not familiar with APIs and how to interact with them using Python, check out this tutorial.
How to Add the Find my IP Address Function
ipify provides a simple public IP address API. We just need to make a GET request on this URL: https://api64.ipify.org/?format=json. It returns JSON data as:
{
"ip": "117.214.111.199"
}
We can then simply return the ip
from the JSON data. So, let’s create this method:
def find_my_ip():
ip_address = requests.get('https://api64.ipify.org?format=json').json()
return ip_address["ip"]
How to Add the Search on Wikipedia Function
For searching on Wikipedia, we’ll be using the wikipedia
module that we had installed earlier in this tutorial.
def search_on_wikipedia(query):
results = wikipedia.summary(query, sentences=2)
return results
Inside the wikipedia
module, we have a summary()
method that accepts a query as an argument. Additionally, we can also pass the number of sentences required. Then we simply return the result.
How to Add the Play Videos on YouTube Function
For playing videos on YouTube, we are using PyWhatKit. We have already imported it as kit
.
def play_on_youtube(video):
kit.playonyt(video)
PyWhatKit has a playonyt()
method that accepts a topic as an argument. It then searches the topic on YouTube and plays the most appropriate video. It uses PyAutoGUI under the hood.
How to Add the Search on Google Function
Again we’ll be using PyWhatKit for searching on Google.
def search_on_google(query):
kit.search(query)
It has a method search()
that helps us search on Google instantly.
How to Add the Send WhatsApp Message Function
We’ll be using PyWhatKit once again for sending WhatsApp messages.
def send_whatsapp_message(number, message):
kit.sendwhatmsg_instantly(f"+91{number}", message)
Our method accepts two arguments – the phone number number
and the message
. It then calls the sendwhatmsg_instantly()
method to send a WhatsApp message. Make sure you’ve already logged in into your WhatsApp account on WhatsApp for Web.
How to Add the Send Email Function
For sending emails, we will be using the built-in smtplib
module from Python.
EMAIL = config("EMAIL")
PASSWORD = config("PASSWORD")
def send_email(receiver_address, subject, message):
try:
email = EmailMessage()
email['To'] = receiver_address
email["Subject"] = subject
email['From'] = EMAIL
email.set_content(message)
s = smtplib.SMTP("smtp.gmail.com", 587)
s.starttls()
s.login(EMAIL, PASSWORD)
s.send_message(email)
s.close()
return True
except Exception as e:
print(e)
return False
The method accepts receiver_address
, subject
, and message
as arguments. We create an object of the SMTP class from the smtplib
module. It takes host and port number as the parameters.
We then start a session and login with the email address and password and send the email. Make sure you add EMAIL and PASSWORD in the .env
file.
How to Add the Get Latest News Headlines Function
To fetch the latest news headlines, we’ll be using NewsAPI. Signup for a free account on NewsAPI and get the API Key. Add the NEWS_API_KEY in the .env
file.
NEWS_API_KEY = config("NEWS_API_KEY")
def get_latest_news():
news_headlines = []
res = requests.get(
f"https://newsapi.org/v2/top-headlines?country=in&apiKey={NEWS_API_KEY}&category=general").json()
articles = res["articles"]
for article in articles:
news_headlines.append(article["title"])
return news_headlines[:5]
In the above method, we’re first creating an empty list called news_headlines
. We are then making a GET request on the API URL specified in the NewsAPI Documentation. A sample JSON response from the request looks like this:
{
"status": "ok",
"totalResults": 38,
"articles": [
{
"source": {
"id": null,
"name": "Sportskeeda"
},
"author": "Aniket Thakkar",
"title": "Latest Free Fire redeem code to get Weapon loot crate today (14 October 2021) - Sportskeeda",
"description": "Gun crates are one of the ways that players in Free Fire can obtain impressive and appealing gun skins.",
"url": "https://www.sportskeeda.com/free-fire/latest-free-fire-redeem-code-get-weapon-loot-crate-today-14-october-2021",
"urlToImage": "https://staticg.sportskeeda.com/editor/2021/10/d0b83-16341799119781-1920.jpg",
"publishedAt": "2021-10-14T03:51:50Z",
"content": null
},
{
"source": {
"id": null,
"name": "NDTV News"
},
"author": null,
"title": "BSF Gets Increased Powers In 3 Border States: What It Means - NDTV",
"description": "Border Security Force (BSF) officers will now have the power toarrest, search, and of seizure to the extent of 50 km inside three newstates sharing international boundaries with Pakistan and Bangladesh.",
"url": "https://www.ndtv.com/india-news/bsf-gets-increased-powers-in-3-border-states-what-it-means-2574644",
"urlToImage": "https://c.ndtvimg.com/2021-08/eglno7qk_-bsf-recruitment-2021_625x300_10_August_21.jpg",
"publishedAt": "2021-10-14T03:44:00Z",
"content": "This move is quickly snowballing into a debate on state autonomy. New Delhi: Border Security Force (BSF) officers will now have the power to arrest, search, and of seizure to the extent of 50 km ins… [+4143 chars]"
},
{
"source": {
"id": "the-times-of-india",
"name": "The Times of India"
},
"author": "TIMESOFINDIA.COM",
"title": "5 health conditions that can make your joints hurt - Times of India",
"description": "Joint pain caused by these everyday issues generally goes away on its own when you stretch yourself a little and flex your muscles.",
"url": "https://timesofindia.indiatimes.com/life-style/health-fitness/health-news/5-health-conditions-that-can-make-your-joints-hurt/photostory/86994969.cms",
"urlToImage": "https://static.toiimg.com/photo/86995017.cms",
"publishedAt": "2021-10-14T03:30:00Z",
"content": "Depression is a mental health condition, but the symptoms may manifest even on your physical health. Unexpected aches and pain in the joints that you may experience when suffering from chronic depres… [+373 chars]"
},
{
"source": {
"id": null,
"name": "The Indian Express"
},
"author": "Devendra Pandey",
"title": "Rahul Dravid likely to be interim coach for New Zealand series - The Indian Express",
"description": "It’s learnt that a few Australian coaches expressed interest in the job, but the BCCI isn’t keen as they are focussing on an Indian for the role, before they look elsewhere.",
"url": "https://indianexpress.com/article/sports/cricket/rahul-dravid-likely-to-be-interim-coach-for-new-zealand-series-7570990/",
"urlToImage": "https://images.indianexpress.com/2021/05/rahul-dravid.jpg",
"publishedAt": "2021-10-14T03:26:09Z",
"content": "Rahul Dravid is likely to be approached by the Indian cricket board to be the interim coach for Indias home series against New Zealand. Head coach Ravi Shastri and the core of the support staff will … [+1972 chars]"
},
{
"source": {
"id": null,
"name": "CNBCTV18"
},
"author": null,
"title": "Thursday's top brokerage calls: Infosys, Wipro and more - CNBCTV18",
"description": "Goldman Sachs has maintained its 'sell' rating on Mindtree largely due to expensive valuations, while UBS expects a muted reaction from Wipro's stock. Here are the top brokerage calls for the day:",
"url": "https://www.cnbctv18.com/market/stocks/thursdays-top-brokerage-calls-infosys-wipro-and-more-11101072.htm",
"urlToImage": "https://images.cnbctv18.com/wp-content/uploads/2019/03/buy-sell.jpg",
"publishedAt": "2021-10-14T03:26:03Z",
"content": "MiniGoldman Sachs has maintained its 'sell' rating on Mindtree largely due to expensive valuations, while UBS expects a muted reaction from Wipro's stock. Here are the top brokerage calls for the day:"
}
]
}
Since the news is contained in a list called articles
, we are creating a variable articles
with the value res['articles']
. Now we are iterating over this articles
list and appending the article["title"]
to the news_headlines
list. We are then returning the first five news headlines from this list.
How to Add the Get Weather Report Function
To get the weather report, we’re using the OpenWeatherMap API. Signup for a free account and get the APP ID. Make sure you add the OPENWEATHER_APP_ID in the .env
file.
OPENWEATHER_APP_ID = config("OPENWEATHER_APP_ID")
def get_weather_report(city):
res = requests.get(
f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={OPENWEATHER_APP_ID}&units=metric").json()
weather = res["weather"][0]["main"]
temperature = res["main"]["temp"]
feels_like = res["main"]["feels_like"]
return weather, f"{temperature}℃", f"{feels_like}℃"
As per the OpenWeatherMap API, we need to make a GET request on the above-mentioned URL with the city name. We’ll get a JSON response as:
{
"coord": {
"lon": 85,
"lat": 24.7833
},
"weather": [
{
"id": 721,
"main": "Haze",
"description": "haze",
"icon": "50d"
}
],
"base": "stations",
"main": {
"temp": 26.95,
"feels_like": 26.64,
"temp_min": 26.95,
"temp_max": 26.95,
"pressure": 1011,
"humidity": 36
},
"visibility": 3000,
"wind": {
"speed": 2.57,
"deg": 310
},
"clouds": {
"all": 57
},
"dt": 1637227634,
"sys": {
"type": 1,
"id": 9115,
"country": "IN",
"sunrise": 1637195904,
"sunset": 1637235130
},
"timezone": 19800,
"id": 1271439,
"name": "Gaya",
"cod": 200
}
We’ll just need the weather
, temperature
, and feels_like
from the above response.
How to Add the Get Trending Movies Function
To get the trending movies, we’ll be using The Movie Database (TMDB) API. Signup for a free account and get the API Key. Add the TMDB_API_KEY in the .env
file.
TMDB_API_KEY = config("TMDB_API_KEY")
def get_trending_movies():
trending_movies = []
res = requests.get(
f"https://api.themoviedb.org/3/trending/movie/day?api_key={TMDB_API_KEY}").json()
results = res["results"]
for r in results:
trending_movies.append(r["original_title"])
return trending_movies[:5]
Just as we did for the latest news headlines, we are creating trending_movies
list. Then, as per the TMDB API, we’re making a GET request. A sample JSON response looks like this:
{
"page": 1,
"results": [
{
"video": false,
"vote_average": 7.9,
"overview": "Shang-Chi must confront the past he thought he left behind when he is drawn into the web of the mysterious Ten Rings organization.",
"release_date": "2021-09-01",
"title": "Shang-Chi and the Legend of the Ten Rings",
"adult": false,
"backdrop_path": "/cinER0ESG0eJ49kXlExM0MEWGxW.jpg",
"vote_count": 2917,
"genre_ids": [28, 12, 14],
"id": 566525,
"original_language": "en",
"original_title": "Shang-Chi and the Legend of the Ten Rings",
"poster_path": "/1BIoJGKbXjdFDAqUEiA2VHqkK1Z.jpg",
"popularity": 9559.446,
"media_type": "movie"
},
{
"adult": false,
"backdrop_path": "/dK12GIdhGP6NPGFssK2Fh265jyr.jpg",
"genre_ids": [28, 35, 80, 53],
"id": 512195,
"original_language": "en",
"original_title": "Red Notice",
"overview": "An Interpol-issued Red Notice is a global alert to hunt and capture the world's most wanted. But when a daring heist brings together the FBI's top profiler and two rival criminals, there's no telling what will happen.",
"poster_path": "/wdE6ewaKZHr62bLqCn7A2DiGShm.jpg",
"release_date": "2021-11-04",
"title": "Red Notice",
"video": false,
"vote_average": 6.9,
"vote_count": 832,
"popularity": 1990.503,
"media_type": "movie"
},
{
"genre_ids": [12, 28, 53],
"original_language": "en",
"original_title": "No Time to Die",
"poster_path": "/iUgygt3fscRoKWCV1d0C7FbM9TP.jpg",
"video": false,
"vote_average": 7.6,
"overview": "Bond has left active service and is enjoying a tranquil life in Jamaica. His peace is short-lived when his old friend Felix Leiter from the CIA turns up asking for help. The mission to rescue a kidnapped scientist turns out to be far more treacherous than expected, leading Bond onto the trail of a mysterious villain armed with dangerous new technology.",
"id": 370172,
"vote_count": 1804,
"title": "No Time to Die",
"adult": false,
"backdrop_path": "/1953j0QEbtN17WFFTnJHIm6bn6I.jpg",
"release_date": "2021-09-29",
"popularity": 4639.439,
"media_type": "movie"
},
{
"poster_path": "/5pVJ9SuuO72IgN6i9kMwQwnhGHG.jpg",
"video": false,
"vote_average": 0,
"overview": "Peter Parker is unmasked and no longer able to separate his normal life from the high-stakes of being a Super Hero. When he asks for help from Doctor Strange the stakes become even more dangerous, forcing him to discover what it truly means to be Spider-Man.",
"release_date": "2021-12-15",
"id": 634649,
"adult": false,
"backdrop_path": "/vK18znei8Uha2z7ZhZtBa40HIrm.jpg",
"vote_count": 0,
"genre_ids": [28, 12, 878],
"title": "Spider-Man: No Way Home",
"original_language": "en",
"original_title": "Spider-Man: No Way Home",
"popularity": 1084.815,
"media_type": "movie"
},
{
"video": false,
"vote_average": 6.8,
"overview": "After finding a host body in investigative reporter Eddie Brock, the alien symbiote must face a new enemy, Carnage, the alter ego of serial killer Cletus Kasady.",
"release_date": "2021-09-30",
"adult": false,
"backdrop_path": "/70nxSw3mFBsGmtkvcs91PbjerwD.jpg",
"vote_count": 1950,
"genre_ids": [878, 28, 12],
"id": 580489,
"original_language": "en",
"original_title": "Venom: Let There Be Carnage",
"poster_path": "/rjkmN1dniUHVYAtwuV3Tji7FsDO.jpg",
"title": "Venom: Let There Be Carnage",
"popularity": 4527.568,
"media_type": "movie"
}
],
"total_pages": 1000,
"total_results": 20000
}
From the above response, we just need the title of the movie. We get the results
which is a list and then iterate over it to get the movie title and append it to the trending_movies
list. In the end, we return the first five elements of the list.
How to Add the Get Random Jokes Function
To get a random joke, we just need to make a GET request on this URL: https://icanhazdadjoke.com/.
def get_random_joke():
headers = {
'Accept': 'application/json'
}
res = requests.get("https://icanhazdadjoke.com/", headers=headers).json()
return res["joke"]
How to Add the Get Random Advice Function
To get a piece of random advice, we’re using the Advice Slip API.
def get_random_advice():
res = requests.get("https://api.adviceslip.com/advice").json()
return res['slip']['advice']
How to Create the Main Method
To run the project, we’ll need to create a main method. Create a main.py
file and add the following code:
import requests
from functions.online_ops import find_my_ip, get_latest_news, get_random_advice, get_random_joke, get_trending_movies, get_weather_report, play_on_youtube, search_on_google, search_on_wikipedia, send_email, send_whatsapp_message
from functions.os_ops import open_calculator, open_camera, open_cmd, open_notepad, open_discord
from pprint import pprint
if __name__ == '__main__':
greet_user()
while True:
query = take_user_input().lower()
if 'open notepad' in query:
open_notepad()
elif 'open discord' in query:
open_discord()
elif 'open command prompt' in query or 'open cmd' in query:
open_cmd()
elif 'open camera' in query:
open_camera()
elif 'open calculator' in query:
open_calculator()
elif 'ip address' in query:
ip_address = find_my_ip()
speak(f'Your IP Address is {ip_address}.n For your convenience, I am printing it on the screen sir.')
print(f'Your IP Address is {ip_address}')
elif 'wikipedia' in query:
speak('What do you want to search on Wikipedia, sir?')
search_query = take_user_input().lower()
results = search_on_wikipedia(search_query)
speak(f"According to Wikipedia, {results}")
speak("For your convenience, I am printing it on the screen sir.")
print(results)
elif 'youtube' in query:
speak('What do you want to play on Youtube, sir?')
video = take_user_input().lower()
play_on_youtube(video)
elif 'search on google' in query:
speak('What do you want to search on Google, sir?')
query = take_user_input().lower()
search_on_google(query)
elif "send whatsapp message" in query:
speak('On what number should I send the message sir? Please enter in the console: ')
number = input("Enter the number: ")
speak("What is the message sir?")
message = take_user_input().lower()
send_whatsapp_message(number, message)
speak("I've sent the message sir.")
elif "send an email" in query:
speak("On what email address do I send sir? Please enter in the console: ")
receiver_address = input("Enter email address: ")
speak("What should be the subject sir?")
subject = take_user_input().capitalize()
speak("What is the message sir?")
message = take_user_input().capitalize()
if send_email(receiver_address, subject, message):
speak("I've sent the email sir.")
else:
speak("Something went wrong while I was sending the mail. Please check the error logs sir.")
elif 'joke' in query:
speak(f"Hope you like this one sir")
joke = get_random_joke()
speak(joke)
speak("For your convenience, I am printing it on the screen sir.")
pprint(joke)
elif "advice" in query:
speak(f"Here's an advice for you, sir")
advice = get_random_advice()
speak(advice)
speak("For your convenience, I am printing it on the screen sir.")
pprint(advice)
elif "trending movies" in query:
speak(f"Some of the trending movies are: {get_trending_movies()}")
speak("For your convenience, I am printing it on the screen sir.")
print(*get_trending_movies(), sep='n')
elif 'news' in query:
speak(f"I'm reading out the latest news headlines, sir")
speak(get_latest_news())
speak("For your convenience, I am printing it on the screen sir.")
print(*get_latest_news(), sep='n')
elif 'weather' in query:
ip_address = find_my_ip()
city = requests.get(f"https://ipapi.co/{ip_address}/city/").text
speak(f"Getting weather report for your city {city}")
weather, temperature, feels_like = get_weather_report(city)
speak(f"The current temperature is {temperature}, but it feels like {feels_like}")
speak(f"Also, the weather report talks about {weather}")
speak("For your convenience, I am printing it on the screen sir.")
print(f"Description: {weather}nTemperature: {temperature}nFeels like: {feels_like}")
While the above script looks quite lengthy, it is very simple and easy to understand.
If you look closely, all we have done is imported the required modules and the online and offline functions. Then within the main method, the first thing we do is greet the user using the greet_user()
function.
Next, we run a while loop to continuously take input from the user using the take_user_input()
function. Since we have our query string here, we can add if-else ladder to check for the different conditions on the query
string.
Note: For Python 3.10, you can use Python Match Case instead of if-else ladder.
To run the program, you can use the following command:
$ python main.py
Conclusion
We just created our very own virtual personal assistant with the help of Python. You can add more features to the application if you like. You can add this project to your résumé or just do it for fun!
Watch the demo video to see it in action:
For the full code, check out this GitHub repository: https://github.com/ashutoshkrris/Virtual-Personal-Assistant-using-Python
Learn to code for free. freeCodeCamp’s open source curriculum has helped more than 40,000 people get jobs as developers. Get started
I thought it would be cool to create a personal assistant in Python. If you are into movies you may have heard of Jarvis, an A.I. based character in the Iron Man films. In this tutorial we will create a robot.
In this tutorial you get started with coding your own Jarvis, the voice activated assistant in Iron Man. Jarvis is a voice assistant, similar to Apple’s Siri or Google Now. In this tutorial we use the power of the Python programming language and a text-to-speech service.
I’m going to be using Ubuntu Linux for this project but you should be able to use it in Windows or Mac as well. However, since there’s quite a bit of command line work required, I’d recommend doing this on a Linux machine.
The features I want to have are:
- Recognize spoken voice (Speech recognition)
- Answer in spoken voice (Text to speech)
- Answer simple commands
For this tutorial you will need (Ubuntu) Linux, Python and a working microphone.
Related course:
- Master Computer Vision with OpenCV
Video
This is what you’ll create (watch the whole video, demo at the end):
Recognize spoken voice
Speech recognition can by done using the Python SpeechRecognition module. We make use of the Google Speech API because of it’s great quality.
Answer in spoken voice (Text To Speech)
Various APIs and programs are available for text to speech applications. Espeak and pyttsx work out of the box but sound very robotic. We decided to go with the Google Text To Speech API, gTTS.
sudo pip install gTTS
Using it is as simple as:
from gtts import gTTS
import os
tts = gTTS(text='Hello World', lang='en')
tts.save("hello.mp3")
os.system("mpg321 hello.mp3")
Complete program
The program below will answer spoken questions.
import speech_recognition as sr
from time import ctime
import time
import os
from gtts import gTTS
def speak(audioString):
print(audioString)
tts = gTTS(text=audioString, lang='en')
tts.save("audio.mp3")
os.system("mpg321 audio.mp3")
def recordAudio():
r = sr.Recognizer()
with sr.Microphone() as source:
print("Say something!")
audio = r.listen(source)
data = ""
try:
data = r.recognize_google(audio)
print("You said: " + data)
except sr.UnknownValueError:
print("Google Speech Recognition could not understand audio")
except sr.RequestError as e:
print("Could not request results from Google Speech Recognition service; {0}".format(e))
return data
def jarvis(data):
if "how are you" in data:
speak("I am fine")
if "what time is it" in data:
speak(ctime())
if "where is" in data:
data = data.split(" ")
location = data[2]
speak("Hold on Frank, I will show you where " + location + " is.")
os.system("chromium-browser https://www.google.nl/maps/place/" + location + "/&")
time.sleep(2)
speak("Hi Frank, what can I do for you?")
while 1:
data = recordAudio()
jarvis(data)
Related posts:
- Robotics, computer vision and awesome stuff
- Speech Engines (TTS)
- Speech Recognition
Design Jarvis Algorithm using Python
In this tutorial, we will learn how to Design Jarvis’s Algorithm using machine learning in Python. It is nothing like Iron man Jarvis coz he does way more things, but our Jarvis is kind of a personal assistant that helps you in doing some basic tasks. let’s get started!
Design Jarvis Algorithm using Python
Let’s Import some Libraries that we have to use here
import pyttsx3 #pip install pyttsx3 import speech_recognition as sr #pip install speechRecognition import datetime import wikipedia # pip install wikipedia import webbrowser import os
All the above-mentioned libraries will work fine but you may find an error about PyAudio. In that case just follow this link and you will get all your answers.
Let’s define Engine so that our Speak function will use the voice we have in our system
engine = pyttsx3.init('sapi5') voices = engine.getProperty('voices') # print(voices[0].id) engine.setProperty('voice', voices[0].id)
def speak(audio): engine.say(audio) engine.runAndWait()
The above function speaks a given string
def wishMe(): hour = int(datetime.datetime.now().hour) if hour>=0 and hour<12: speak("Good Morning Sir") elif hour>=12 and hour<18: speak("Good Afternoon Sir") else: speak("Good Evening Sir") speak("I am Jarvis Sir. I am here to help you")
The above function wish us according to the time
def takeCommand(): r = sr.Recognizer() with sr.Microphone() as source: print("Listening...") r.pause_threshold = 1 audio = r.listen(source) # it converts the audio input into string try: print("Recognizing...") query = r.recognize_google(audio, language='en-in') print(f"User said: {query}n") except Exception as e: # print(e) print("Say that again please...") return "None" return query
The above function takes microphone input from the user and returns string output.
Now let’s move further and do the remaining part
if __name__ == "__main__": wishMe() while True: query = takeCommand().lower() # #logic for executing tasks based on query if "how are you" in query: speak("I'm fine sir, how can i help you ?") elif "who are you" in query: speak("Sir I am Jarvis personal assistant ") elif 'wikipedia' in query: speak('Searching Wikipedia...please wait') query = query.replace("wikipedia", "") results = wikipedia.summary(query, sentences = 2) speak("wikipedia says") print(results) speak(results) elif'open youtube' in query: webbrowser.open("youtube.com") elif 'open google' in query: webbrowser.open('https://www.google.co.in/') elif 'open stackoverflow' in query: webbrowser.open('https://stackoverflow.com/') elif 'play music'in query: music_dir = "C:\Users\Baali\Music" songs = os.listdir(music_dir) print(songs) os.startfile(os.path.join(music_dir, songs[0])) elif 'the time' in query: strTime = datetime.datetime.now().strftime("%H:%M:%S") speak(f"Sir, the time is {strTime}") elif 'open code' in query: codePath = "C:\Users\Baali\AppData\Local\Programs\Microsoft VS Code\Code.exe" os.startfile(codePath) elif 'jarvis quit' in query or 'exit' in query or 'close' in query: speak("Thanks you for using Jarvis Sir") exit()
In the above-mentioned code line whenever our Jarvis hear anything Like “what is the time” it recognizes that we have used “the time” in the query so it will answer accordingly the same followed by other queries and at last if we want to quit the Jarvis just say”Jarvis quit or Exit” our program will end.
Thanks this is all for a basic Jarvis you can put many more things in this. I hope you like it.
Check out my other work here
- Predict Weather Report Using Machine Learning in Python
For installing python programming language simple to have to click to this link given below —
import random
import tkinter # pip install tkinter
from tkinter import *
import datetime
import pyttsx3 # pip install pyttsx3
import os
import time
import subprocess
import webbrowser
from tkinter import _tkinter
from PIL import ImageTk,Image # pip install PIL
engine = pyttsx3.init()
# in windows
# engine = pyttsx3.init(‘sapi5’)
window = Tk()
window.configure(bg = «black»)
SET_WIDTH = 800
SET_HEIGHT = 700
global ques
ques = Entry(window,width=40,bg=»black»,fg=»white»,font = (‘arial’,18,’bold’))
ques.pack(padx = 10,pady = 20)
def speak(audio):
engine.say(audio)
engine.runAndWait()
def wish():
hour = int(datetime.datetime.now().hour)
if hour == 0 and hour<=12:
speak(«Good morning sir»)
elif hour>=12 and hour<=18:
speak(«Good afternoon sir»)
else:
speak(«Good evening sir»)
def command():
if ‘open desktop’ in ques.get():
speak(«ok sir do it «)
# d = «C:UsersPublicDesktop»
os.startfile(d)
# or
# os.system(d)
elif ‘open file’ in ques.get():
speak(«which file sir «)
d = Toplevel()
Toplevel.configure(bg=»black»)
e = Entry(d,bg = «black», fg = «white» ,width = 20)
e.pack()
def open_file():
os.system(e.get())
speak(«ok sir i will open «+e.get())
s = Button(d,bg = «black»,font = (‘arial’,18,’bold’),fg = «white»,width = 10,activeforeground = «grey»,activebackground = «black»,text = «open it»,command=open_file).pack()
elif ‘shutdown’ in ques.get():
os.system(«shutdown now -h»)
speak(«ok sir i shutdown the computer»)
elif ‘open stackoverflow’ in ques.get():
speak(«ok sir i will open the stck over flow website»)
webbrowser.open(«https://wwww.stackoverflow.com»)
elif ‘open website’ in ques.get():
speak(«which website sir «)
d = Toplevel()
e = Entry(d,bg = «black», fg = «white» ,font = (‘arial’,18,’bold’),width = 20)
e.pack()
def open_web():
webbrowser.open(«https://»+e.get()+».com»)
speak(«ok sir i will open «+e.get())
s = Button(d,bg = «black»,fg = «white»,width = 10,activeforeground = «grey»,activebackground = «black»,text = «open it»,command=open_web).pack()
elif ‘open google’ in ques.get():
speak(«ok sir i will open google.com»)
webbrowser.open(«https://wwww.google.com»)
elif ‘open youtube’ in ques.get():
speak(«ok sir i will opwn youtube dot com»)
webbrowser.open(«https://wwww.youtube.com»)
elif ‘copy code’ in ques.get():
speak(«of which file sir «)
d = Toplevel()
e = Entry(d,bg = «black»,font = (‘arial’,18,’bold’), fg = «white» ,width = 20)
e.pack()
def open_code():
file = open(e.get(),»r+»)
re = file.read()
speak(re)
s = Button(d,bg = «black»,fg = «white»,width = 10,activeforeground = «grey»,activebackground = «black»,text = «open it»,command=open_code).pack()
elif ‘exit’ in ques.get():
exit()
speak(«good bye sir have a good day»)
elif ‘quite’ in ques.get():
speak(«good bye sir have a good day»)
exit()
else :
speak(«sorry sir i can not do this»)
def you():
speak(«ok sir open the youtube.com»)
webbrowser.open(«https://www.youtube.com»)
def win():
speak(«ok sir i open it»)
webbrowser.open(«https://techflayer.blogspot.com»)
def main():
# screen
bgImg = Image.open(«/home/abhishek/Desktop/Assistants/back.png»)
window.title(«J.A.R.V.I.S»)
canvas = tkinter.Canvas(window,width = SET_WIDTH,height = SET_HEIGHT)
# image=ImageTk.PhotoImage(Image.open(«back.png»)
image=ImageTk.PhotoImage(bgImg)
canvas.create_image(0,0,anchor=NW,image=image)
# entry
btn = Button(text = «Open Techflayer» ,bg = «black» ,fg=»white»,width=20,activeforeground = «grey»,activebackground = «black»,command = win)
btn.pack(padx = 0,pady= 0)
btn = Button(text = » Open Youtube» ,bg = «black»,fg = «white» ,width = 20,activeforeground = «grey» ,activebackground = «black»,command =you)
btn.pack(side = TOP)
btn = Button(bg = «black» ,fg = «white»,width=20,activeforeground = «grey»,activebackground = «black»,text = «command»,command=command).pack(side = BOTTOM,pady = 1 , padx = 3)
canvas.configure(bg=»black»)
shape = canvas.create_oval(10,10,60,60,fill = «blue»)
xspeed = random.randrange(1,8)
yspeed = random.randrange(1,
shape2 = canvas.create_oval(10,10,60,60,fill = «blue»)
xspeed2 = random.randrange(1,9)
yspeed2 = random.randrange(1,9)
canvas.pack()
while True:
canvas.move(shape,xspeed,yspeed)
pos = canvas.coords(shape)
if pos[3]>= 700 or pos[1] <=0:
yspeed = -yspeed
if pos[2] >= 800 or pos[0] <=0:
xspeed= -xspeed
canvas.move(shape2,xspeed2,yspeed2)
pos = canvas.coords(shape2)
if pos[3]>= 700 or pos[1] <=0:
yspeed2 = -yspeed2
if pos[2] >= 800 or pos[0] <=0:
xspeed2= -xspeed2
window.update()
time.sleep(0.01)
def ball():
canvas = Canvas()
if __name__ == «__main__»:
wish()
main()
window.mainloop()
Create desktop assistant i.e. Jarvis and you’ll submit it as your the school project otherwise you can use it on your computer too. Friends, if you need to get the present day updates of our website, then please join our Techflayer, this can maintain you from getting the state-of-the-art updates about our upcoming.
if
__name__
=
=
'__main__'
:
clear
=
lambda
: os.system(
'cls'
)
clear()
wishMe()
username()
while
True
:
query
=
takeCommand().lower()
if
'wikipedia'
in
query:
speak(
'Searching Wikipedia...'
)
query
=
query.replace(
"wikipedia"
, "")
results
=
wikipedia.summary(query, sentences
=
3
)
speak(
"According to Wikipedia"
)
print
(results)
speak(results)
elif
'open youtube'
in
query:
speak(
"Here you go to Youtuben"
)
webbrowser.
open
(
"youtube.com"
)
elif
'open google'
in
query:
speak(
"Here you go to Googlen"
)
webbrowser.
open
(
"google.com"
)
elif
'open stackoverflow'
in
query:
speak(
"Here you go to Stack Over flow.Happy coding"
)
webbrowser.
open
(
"stackoverflow.com"
)
elif
'play music'
in
query
or
"play song"
in
query:
speak(
"Here you go with music"
)
music_dir
=
"C:\Users\GAURAV\Music"
songs
=
os.listdir(music_dir)
print
(songs)
random
=
os.startfile(os.path.join(music_dir, songs[
1
]))
elif
'the time'
in
query:
strTime
=
datetime.datetime.now().strftime(
"% H:% M:% S"
)
speak(f
"Sir, the time is {strTime}"
)
elif
'open opera'
in
query:
codePath
=
r
"C:\Users\GAURAV\AppData\Local\Programs\Opera\launcher.exe"
os.startfile(codePath)
elif
'email to gaurav'
in
query:
try
:
speak(
"What should I say?"
)
content
=
takeCommand()
to
=
"Receiver email address"
sendEmail(to, content)
speak(
"Email has been sent !"
)
except
Exception as e:
print
(e)
speak(
"I am not able to send this email"
)
elif
'send a mail'
in
query:
try
:
speak(
"What should I say?"
)
content
=
takeCommand()
speak(
"whome should i send"
)
to
=
input
()
sendEmail(to, content)
speak(
"Email has been sent !"
)
except
Exception as e:
print
(e)
speak(
"I am not able to send this email"
)
elif
'how are you'
in
query:
speak(
"I am fine, Thank you"
)
speak(
"How are you, Sir"
)
elif
'fine'
in
query
or
"good"
in
query:
speak(
"It's good to know that your fine"
)
elif
"change my name to"
in
query:
query
=
query.replace(
"change my name to"
, "")
assname
=
query
elif
"change name"
in
query:
speak(
"What would you like to call me, Sir "
)
assname
=
takeCommand()
speak(
"Thanks for naming me"
)
elif
"what's your name"
in
query
or
"What is your name"
in
query:
speak(
"My friends call me"
)
speak(assname)
print
(
"My friends call me"
, assname)
elif
'exit'
in
query:
speak(
"Thanks for giving me your time"
)
exit()
elif
"who made you"
in
query
or
"who created you"
in
query:
speak(
"I have been created by Gaurav."
)
elif
'joke'
in
query:
speak(pyjokes.get_joke())
elif
"calculate"
in
query:
app_id
=
"Wolframalpha api id"
client
=
wolframalpha.Client(app_id)
indx
=
query.lower().split().index(
'calculate'
)
query
=
query.split()[indx
+
1
:]
res
=
client.query(
' '
.join(query))
answer
=
next
(res.results).text
print
(
"The answer is "
+
answer)
speak(
"The answer is "
+
answer)
elif
'search'
in
query
or
'play'
in
query:
query
=
query.replace(
"search"
, "")
query
=
query.replace(
"play"
, "")
webbrowser.
open
(query)
elif
"who i am"
in
query:
speak(
"If you talk then definitely your human."
)
elif
"why you came to world"
in
query:
speak(
"Thanks to Gaurav. further It's a secret"
)
elif
'power point presentation'
in
query:
speak(
"opening Power Point presentation"
)
power
=
r
"C:\Users\GAURAV\Desktop\Minor Project\Presentation\Voice Assistant.pptx"
os.startfile(power)
elif
'is love'
in
query:
speak(
"It is 7th sense that destroy all other senses"
)
elif
"who are you"
in
query:
speak(
"I am your virtual assistant created by Gaurav"
)
elif
'reason for you'
in
query:
speak(
"I was created as a Minor project by Mister Gaurav "
)
elif
'change background'
in
query:
ctypes.windll.user32.SystemParametersInfoW(
20
,
0
,
"Location of wallpaper"
,
0
)
speak(
"Background changed successfully"
)
elif
'open bluestack'
in
query:
appli
=
r
"C:\ProgramData\BlueStacks\Client\Bluestacks.exe"
os.startfile(appli)
elif
'news'
in
query:
try
:
jsonObj
=
urlopen(
)
data
=
json.load(jsonObj)
i
=
1
speak(
'here are some top news from the times of india'
)
print
(
+
'n')
for
item
in
data[
'articles'
]:
print
(
str
(i)
+
'. '
+
item[
'title'
]
+
'n'
)
print
(item[
'description'
]
+
'n'
)
speak(
str
(i)
+
'. '
+
item[
'title'
]
+
'n'
)
i
+
=
1
except
Exception as e:
print
(
str
(e))
elif
'lock window'
in
query:
speak(
"locking the device"
)
ctypes.windll.user32.LockWorkStation()
elif
'shutdown system'
in
query:
speak(
"Hold On a Sec ! Your system is on its way to shut down"
)
subprocess.call(
'shutdown / p /f'
)
elif
'empty recycle bin'
in
query:
winshell.recycle_bin().empty(confirm
=
False
, show_progress
=
False
, sound
=
True
)
speak(
"Recycle Bin Recycled"
)
elif
"don't listen"
in
query
or
"stop listening"
in
query:
speak(
"for how much time you want to stop jarvis from listening commands"
)
a
=
int
(takeCommand())
time.sleep(a)
print
(a)
elif
"where is"
in
query:
query
=
query.replace(
"where is"
, "")
location
=
query
speak(
"User asked to Locate"
)
speak(location)
elif
"camera"
in
query
or
"take a photo"
in
query:
ec.capture(
0
,
"Jarvis Camera "
,
"img.jpg"
)
elif
"restart"
in
query:
subprocess.call([
"shutdown"
,
"/r"
])
elif
"hibernate"
in
query
or
"sleep"
in
query:
speak(
"Hibernating"
)
subprocess.call(
"shutdown / h"
)
elif
"log off"
in
query
or
"sign out"
in
query:
speak(
"Make sure all the application are closed before sign-out"
)
time.sleep(
5
)
subprocess.call([
"shutdown"
,
"/l"
])
elif
"write a note"
in
query:
speak(
"What should i write, sir"
)
note
=
takeCommand()
file
=
open
(
'jarvis.txt'
,
'w'
)
speak(
"Sir, Should i include date and time"
)
snfm
=
takeCommand()
if
'yes'
in
snfm
or
'sure'
in
snfm:
strTime
=
datetime.datetime.now().strftime(
"% H:% M:% S"
)
file
.write(strTime)
file
.write(
" :- "
)
file
.write(note)
else
:
file
.write(note)
elif
"show note"
in
query:
speak(
"Showing Notes"
)
file
=
open
(
"jarvis.txt"
,
"r"
)
print
(
file
.read())
speak(
file
.read(
6
))
elif
"update assistant"
in
query:
speak(
"After downloading file please replace this file with the downloaded one"
)
url
=
'# url after uploading file'
r
=
requests.get(url, stream
=
True
)
with
open
(
"Voice.py"
,
"wb"
) as Pypdf:
total_length
=
int
(r.headers.get(
'content-length'
))
for
ch
in
progress.bar(r.iter_content(chunk_size
=
2391975
),
expected_size
=
(total_length
/
1024
)
+
1
):
if
ch:
Pypdf.write(ch)
elif
"jarvis"
in
query:
wishMe()
speak(
"Jarvis 1 point o in your service Mister"
)
speak(assname)
elif
"weather"
in
query:
api_key
=
"Api key"
speak(
" City name "
)
print
(
"City name : "
)
city_name
=
takeCommand()
complete_url
=
base_url
+
"appid ="
+
api_key
+
"&q ="
+
city_name
response
=
requests.get(complete_url)
x
=
response.json()
if
x[
"code"
] !
=
"404"
:
y
=
x[
"main"
]
current_temperature
=
y[
"temp"
]
current_pressure
=
y[
"pressure"
]
current_humidiy
=
y[
"humidity"
]
z
=
x[
"weather"
]
weather_description
=
z[
0
][
"description"
]
print
(
" Temperature (in kelvin unit) = "
+
str
(current_temperature)
+
"n atmospheric pressure (in hPa unit) ="
+
str
(current_pressure)
+
"n humidity (in percentage) = "
+
str
(current_humidiy)
+
"n description = "
+
str
(weather_description))
else
:
speak(
" City Not Found "
)
elif
"send message "
in
query:
account_sid
=
'Account Sid key'
auth_token
=
'Auth token'
client
=
Client(account_sid, auth_token)
message
=
client.messages
.create(
body
=
takeCommand(),
from_
=
'Sender No'
,
to
=
'Receiver No'
)
print
(message.sid)
elif
"wikipedia"
in
query:
webbrowser.
open
(
"wikipedia.com"
)
elif
"Good Morning"
in
query:
speak(
"A warm"
+
query)
speak(
"How are you Mister"
)
speak(assname)
elif
"will you be my gf"
in
query
or
"will you be my bf"
in
query:
speak(
"I'm not sure about, may be you should give me some time"
)
elif
"how are you"
in
query:
speak(
"I'm fine, glad you me that"
)
elif
"i love you"
in
query:
speak(
"It's hard to understand"
)
elif
"what is"
in
query
or
"who is"
in
query:
client
=
wolframalpha.Client(
"API_ID"
)
res
=
client.query(query)
try
:
print
(
next
(res.results).text)
speak (
next
(res.results).text)
except
StopIteration:
print
(
"No results"
)
if
__name__
=
=
'__main__'
:
clear
=
lambda
: os.system(
'cls'
)
clear()
wishMe()
username()
while
True
:
query
=
takeCommand().lower()
if
'wikipedia'
in
query:
speak(
'Searching Wikipedia...'
)
query
=
query.replace(
"wikipedia"
, "")
results
=
wikipedia.summary(query, sentences
=
3
)
speak(
"According to Wikipedia"
)
print
(results)
speak(results)
elif
'open youtube'
in
query:
speak(
"Here you go to Youtuben"
)
webbrowser.
open
(
"youtube.com"
)
elif
'open google'
in
query:
speak(
"Here you go to Googlen"
)
webbrowser.
open
(
"google.com"
)
elif
'open stackoverflow'
in
query:
speak(
"Here you go to Stack Over flow.Happy coding"
)
webbrowser.
open
(
"stackoverflow.com"
)
elif
'play music'
in
query
or
"play song"
in
query:
speak(
"Here you go with music"
)
music_dir
=
"C:\Users\GAURAV\Music"
songs
=
os.listdir(music_dir)
print
(songs)
random
=
os.startfile(os.path.join(music_dir, songs[
1
]))
elif
'the time'
in
query:
strTime
=
datetime.datetime.now().strftime(
"% H:% M:% S"
)
speak(f
"Sir, the time is {strTime}"
)
elif
'open opera'
in
query:
codePath
=
r
"C:\Users\GAURAV\AppData\Local\Programs\Opera\launcher.exe"
os.startfile(codePath)
elif
'email to gaurav'
in
query:
try
:
speak(
"What should I say?"
)
content
=
takeCommand()
to
=
"Receiver email address"
sendEmail(to, content)
speak(
"Email has been sent !"
)
except
Exception as e:
print
(e)
speak(
"I am not able to send this email"
)
elif
'send a mail'
in
query:
try
:
speak(
"What should I say?"
)
content
=
takeCommand()
speak(
"whome should i send"
)
to
=
input
()
sendEmail(to, content)
speak(
"Email has been sent !"
)
except
Exception as e:
print
(e)
speak(
"I am not able to send this email"
)
elif
'how are you'
in
query:
speak(
"I am fine, Thank you"
)
speak(
"How are you, Sir"
)
elif
'fine'
in
query
or
"good"
in
query:
speak(
"It's good to know that your fine"
)
elif
"change my name to"
in
query:
query
=
query.replace(
"change my name to"
, "")
assname
=
query
elif
"change name"
in
query:
speak(
"What would you like to call me, Sir "
)
assname
=
takeCommand()
speak(
"Thanks for naming me"
)
elif
"what's your name"
in
query
or
"What is your name"
in
query:
speak(
"My friends call me"
)
speak(assname)
print
(
"My friends call me"
, assname)
elif
'exit'
in
query:
speak(
"Thanks for giving me your time"
)
exit()
elif
"who made you"
in
query
or
"who created you"
in
query:
speak(
"I have been created by Gaurav."
)
elif
'joke'
in
query:
speak(pyjokes.get_joke())
elif
"calculate"
in
query:
app_id
=
"Wolframalpha api id"
client
=
wolframalpha.Client(app_id)
indx
=
query.lower().split().index(
'calculate'
)
query
=
query.split()[indx
+
1
:]
res
=
client.query(
' '
.join(query))
answer
=
next
(res.results).text
print
(
"The answer is "
+
answer)
speak(
"The answer is "
+
answer)
elif
'search'
in
query
or
'play'
in
query:
query
=
query.replace(
"search"
, "")
query
=
query.replace(
"play"
, "")
webbrowser.
open
(query)
elif
"who i am"
in
query:
speak(
"If you talk then definitely your human."
)
elif
"why you came to world"
in
query:
speak(
"Thanks to Gaurav. further It's a secret"
)
elif
'power point presentation'
in
query:
speak(
"opening Power Point presentation"
)
power
=
r
"C:\Users\GAURAV\Desktop\Minor Project\Presentation\Voice Assistant.pptx"
os.startfile(power)
elif
'is love'
in
query:
speak(
"It is 7th sense that destroy all other senses"
)
elif
"who are you"
in
query:
speak(
"I am your virtual assistant created by Gaurav"
)
elif
'reason for you'
in
query:
speak(
"I was created as a Minor project by Mister Gaurav "
)
elif
'change background'
in
query:
ctypes.windll.user32.SystemParametersInfoW(
20
,
0
,
"Location of wallpaper"
,
0
)
speak(
"Background changed successfully"
)
elif
'open bluestack'
in
query:
appli
=
r
"C:\ProgramData\BlueStacks\Client\Bluestacks.exe"
os.startfile(appli)
elif
'news'
in
query:
try
:
jsonObj
=
urlopen(
)
data
=
json.load(jsonObj)
i
=
1
speak(
'here are some top news from the times of india'
)
print
(
+
'n')
for
item
in
data[
'articles'
]:
print
(
str
(i)
+
'. '
+
item[
'title'
]
+
'n'
)
print
(item[
'description'
]
+
'n'
)
speak(
str
(i)
+
'. '
+
item[
'title'
]
+
'n'
)
i
+
=
1
except
Exception as e:
print
(
str
(e))
elif
'lock window'
in
query:
speak(
"locking the device"
)
ctypes.windll.user32.LockWorkStation()
elif
'shutdown system'
in
query:
speak(
"Hold On a Sec ! Your system is on its way to shut down"
)
subprocess.call(
'shutdown / p /f'
)
elif
'empty recycle bin'
in
query:
winshell.recycle_bin().empty(confirm
=
False
, show_progress
=
False
, sound
=
True
)
speak(
"Recycle Bin Recycled"
)
elif
"don't listen"
in
query
or
"stop listening"
in
query:
speak(
"for how much time you want to stop jarvis from listening commands"
)
a
=
int
(takeCommand())
time.sleep(a)
print
(a)
elif
"where is"
in
query:
query
=
query.replace(
"where is"
, "")
location
=
query
speak(
"User asked to Locate"
)
speak(location)
elif
"camera"
in
query
or
"take a photo"
in
query:
ec.capture(
0
,
"Jarvis Camera "
,
"img.jpg"
)
elif
"restart"
in
query:
subprocess.call([
"shutdown"
,
"/r"
])
elif
"hibernate"
in
query
or
"sleep"
in
query:
speak(
"Hibernating"
)
subprocess.call(
"shutdown / h"
)
elif
"log off"
in
query
or
"sign out"
in
query:
speak(
"Make sure all the application are closed before sign-out"
)
time.sleep(
5
)
subprocess.call([
"shutdown"
,
"/l"
])
elif
"write a note"
in
query:
speak(
"What should i write, sir"
)
note
=
takeCommand()
file
=
open
(
'jarvis.txt'
,
'w'
)
speak(
"Sir, Should i include date and time"
)
snfm
=
takeCommand()
if
'yes'
in
snfm
or
'sure'
in
snfm:
strTime
=
datetime.datetime.now().strftime(
"% H:% M:% S"
)
file
.write(strTime)
file
.write(
" :- "
)
file
.write(note)
else
:
file
.write(note)
elif
"show note"
in
query:
speak(
"Showing Notes"
)
file
=
open
(
"jarvis.txt"
,
"r"
)
print
(
file
.read())
speak(
file
.read(
6
))
elif
"update assistant"
in
query:
speak(
"After downloading file please replace this file with the downloaded one"
)
url
=
'# url after uploading file'
r
=
requests.get(url, stream
=
True
)
with
open
(
"Voice.py"
,
"wb"
) as Pypdf:
total_length
=
int
(r.headers.get(
'content-length'
))
for
ch
in
progress.bar(r.iter_content(chunk_size
=
2391975
),
expected_size
=
(total_length
/
1024
)
+
1
):
if
ch:
Pypdf.write(ch)
elif
"jarvis"
in
query:
wishMe()
speak(
"Jarvis 1 point o in your service Mister"
)
speak(assname)
elif
"weather"
in
query:
api_key
=
"Api key"
speak(
" City name "
)
print
(
"City name : "
)
city_name
=
takeCommand()
complete_url
=
base_url
+
"appid ="
+
api_key
+
"&q ="
+
city_name
response
=
requests.get(complete_url)
x
=
response.json()
if
x[
"code"
] !
=
"404"
:
y
=
x[
"main"
]
current_temperature
=
y[
"temp"
]
current_pressure
=
y[
"pressure"
]
current_humidiy
=
y[
"humidity"
]
z
=
x[
"weather"
]
weather_description
=
z[
0
][
"description"
]
print
(
" Temperature (in kelvin unit) = "
+
str
(current_temperature)
+
"n atmospheric pressure (in hPa unit) ="
+
str
(current_pressure)
+
"n humidity (in percentage) = "
+
str
(current_humidiy)
+
"n description = "
+
str
(weather_description))
else
:
speak(
" City Not Found "
)
elif
"send message "
in
query:
account_sid
=
'Account Sid key'
auth_token
=
'Auth token'
client
=
Client(account_sid, auth_token)
message
=
client.messages
.create(
body
=
takeCommand(),
from_
=
'Sender No'
,
to
=
'Receiver No'
)
print
(message.sid)
elif
"wikipedia"
in
query:
webbrowser.
open
(
"wikipedia.com"
)
elif
"Good Morning"
in
query:
speak(
"A warm"
+
query)
speak(
"How are you Mister"
)
speak(assname)
elif
"will you be my gf"
in
query
or
"will you be my bf"
in
query:
speak(
"I'm not sure about, may be you should give me some time"
)
elif
"how are you"
in
query:
speak(
"I'm fine, glad you me that"
)
elif
"i love you"
in
query:
speak(
"It's hard to understand"
)
elif
"what is"
in
query
or
"who is"
in
query:
client
=
wolframalpha.Client(
"API_ID"
)
res
=
client.query(query)
try
:
print
(
next
(res.results).text)
speak (
next
(res.results).text)
except
StopIteration:
print
(
"No results"
)