-
Notifications
You must be signed in to change notification settings - Fork 0
/
assistant.py
139 lines (115 loc) · 4.34 KB
/
assistant.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import speech_recognition as sr
import playsound
from gtts import gTTS
import random
from time import ctime
import webbrowser
import yfinance as yf
import time
import os
class Person:
name = ''
def set_name(self, name):
self.name = name
def there_exists(terms):
for term in terms:
if term in voice_data:
return True
r = sr.Recognizer() # initialise a recogniser
# listen for audio and convert it to text:
def record_audio(ask=False):
with sr.Microphone() as source: # microphone as source
if ask:
speak(ask)
audio = r.listen(source) # listen for the audio via source
voice_data = ''
try:
voice_data = r.recognize_google(audio) # convert audio to text
except sr.UnknownValueError: # error: recognizer does not understand
speak('I did not get that')
except sr.RequestError:
speak('Sorry, the service is down') # error: recognizer is not connected
print(f">> {voice_data.lower()}") # print what user said
return voice_data.lower()
# get string and make an audio file to be played
def speak(audio_string):
tts = gTTS(text=audio_string, lang='en') # text to speech(voice)
rand_int = random.randint(1, 20000000)
audio_file = 'audio' + str(rand_int) + '.mp3'
tts.save(audio_file) # save as mp3
playsound.playsound(audio_file) # play the audio file
print(f"kiri: {audio_string}") # print what app said
os.remove(audio_file) # remove audio file
def respond(voice_data):
# 1: greeting
if there_exists(['hey', 'hi', 'hello']):
greetings = [
f"hey, how can I help you {person_obj.name}",
f"hey, what's up? {person_obj.name}",
f"I'm listening {person_obj.name}",
f"how can I help you? {person_obj.name}",
f"hello {person_obj.name}"
]
greet = greetings[random.randint(0, len(greetings) - 1)]
speak(greet)
# 2: name
if there_exists(["what is your name", "what's your name", "tell me your name"]):
if person_obj.name:
speak("my name is Alexis")
else:
speak("my name is Alexis. what's your name?")
if there_exists(["my name is"]):
person_name = voice_data.split("is")[-1].strip()
speak(f"okay, i will remember that {person_name}")
person_obj.set_name(person_name) # remember name in person object
# 3: greeting
if there_exists(["how are you", "how are you doing"]):
speak(f"I'm very well, thanks for asking {person_obj.name}")
# 4: time
if there_exists(["what's the time", "tell me the time", "what time is it"]):
time = ctime().split(" ")[3].split(":")[0:2]
if time[0] == "00":
hours = '12'
else:
hours = time[0]
minutes = time[1]
time = f'{hours} {minutes}'
speak(time)
# 5: search google
if there_exists(["search for"]) and 'youtube' not in voice_data:
search_term = voice_data.split("for")[-1]
url = f"https://google.com/search?q={search_term}"
webbrowser.get().open(url)
speak(f'Here is what I found for {search_term} on google')
# 6: search YouTube
if there_exists(["youtube"]):
search_term = voice_data.split("for")[-1]
url = f"https://www.youtube.com/results?search_query={search_term}"
webbrowser.get().open(url)
speak(f'Here is what I found for {search_term} on youtube')
# 7: get stock price
if there_exists(["price of"]):
search_term = voice_data.lower().split(" of ")[-1].strip() # Strips whitespace(s) after/before a term in
# string
stocks = {
"apple": "AAPL",
"microsoft": "MSFT",
"facebook": "FB",
"tesla": "TSLA",
"bitcoin": "BTC-USD"
}
try:
stock = stocks[search_term]
stock = yf.Ticker(stock)
price = stock.info["regularMarketPrice"]
speak(f'price of {search_term} is {price} {stock.info["currency"]} {person_obj.name}')
except:
speak('oops, something went wrong')
if there_exists(["exit", "quit", "goodbye"]):
speak("going offline")
exit()
time.sleep(1)
person_obj = Person()
while 1:
voice_data = record_audio() # get the voice input
respond(voice_data) # respond