class Brain: """ initializes everything EVE needs to function, listens for activation input from julius, and executes commands based on voice input. The Brain class coordinates all other components of EVE. """ def __init__(self): self.audioInput = Microphone() self.speaker = tts.Google() self.voice_cmd = VoiceCommand(self.speaker) self._load_ai() self._print_welcome() print "Saying: Hello there!" self.speaker.play_wav("./wav/hello.wav") def _load_ai(self): self.AI = aiml.Kernel() self.AI.bootstrap(brainFile="./brain/standard.brn") try: sessionFile = open("./brain/Memory.ses", "rb") session = marshal.load(sessionFile) sessionFile.close() for pred, value in session.items(): self.AI.setPredicate(pred, value, "Memory") except Exception: self.AI._addSession("Memory") def _print_welcome(self): print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" print "+++++++++++++++++++++ Welcome to E.V.E. ++++++++++++++++++++++" print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" print "+ +" print "+ Say 'okay computer' to start! +" print "+ +" print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" ################################################################################ def get_input(self, ln): startstring = "sentence1: <s> " endstring = " </s>" line = ln if not line: return if "missing phones" in line.lower(): sys.exit("Error: Missing phonemes for the used grammar file.") if line.startswith(startstring) and line.strip().endswith(endstring): self.parse(line.strip("\n")[len(startstring) : -len(endstring)]) def parse(self, line): params = [param.lower() for param in line.split() if param] if params == ["okaycomputer"]: self._okaycomputer() elif params == ["thanks", "darling"]: self._thanks() elif params == ["computer", "power", "down"]: self._shutdown() def _okaycomputer(self): print "Initializing..." if self._internet_on(): self.listen() else: print "Saying: No Internet connection." self.speaker.play_wav("./wav/internet_err.wav") return def _internet_on(self): try: response = urllib2.urlopen("http://173.194.33.1", timeout=1) return True except Exception as err: pass return False def _thanks(self): print "Saying: My pleasure." self.speaker.play_wav("./wav/mypleasure.wav") def _shutdown(self): session = self.AI.getSessionData("Memory") sessionFile = open("./brain/Memory.ses", "wb") marshal.dump(session, sessionFile) sessionFile.close() print "Saying: E.V.E. will go to sleep now. Good bye!" self.speaker.play_wav("./wav/sleep.wav") sys.exit("+++++++++++++++++++++ E.V.E. HAS SHUTDOWN ++++++++++++++++++++") ################################################################################ def listen(self): print "Saying: Yes?" self.speaker.play_wav("./wav/yes.wav") self.audioInput.listen() # listen to mic and record job = self._set_job() if job is not None: first_word, second_word = self._get_first_two_words(job.recorded()) self._execute_voice_cmd(job, first_word, second_word) def _set_job(self): try: speech_to_text = stt.Google(self.audioInput) recorded_text = speech_to_text.get_text() return Job(recorded_text) except NotUnderstoodException: print "Sorry, I didn't get that." self.speaker.play_wav("./wav/didntget.wav") return None def _get_first_two_words(self, recorded_text): first_word = (recorded_text.split(" ")[0]).lower() if recorded_text.find(" ") >= 1: second_word = (recorded_text.split(" ")[1]).lower() else: second_word = "" return first_word, second_word def _execute_voice_cmd(self, job, first_word, second_word): if first_word == "no" or job.recorded().find("no stop") != -1: self.voice_cmd.accidental_recording() elif first_word == "open": if second_word != "": # open webpage self.voice_cmd.open_webpage(job) else: self.speaker.say("no webpage specified.") elif first_word == "google" or first_word == "search": if second_word != "": # pull up query results self.voice_cmd.google(job) else: self.speaker.say("no query provided.") elif first_word == "youtube": if second_word != "": if second_word == "search": # return youtube results self.voice_cmd.search_youtube(job) else: self.voice_cmd.play_youtube(job) else: self.speaker.say("no query provided.") elif job.recorded().lower().find("screenshot") != -1: self.voice_cmd.take_screenshot() elif first_word == "computer": # AI responds self.voice_cmd.ai_respond(job, self.AI, "Memory") elif job.recorded().find("change news source") != -1: self.voice_cmd.change_news_source(job) elif job.recorded().find("news") != -1: # get news self.voice_cmd.get_news(job) elif first_word == "play": self.voice_cmd.play_music(job) else: self.voice_cmd.ask_wolfram(job) if not job.get_is_processed: self.speaker.say("Sorry, I didn't find any results.")
class Brain: """ initializes everything EVE needs to function, listens for activation input from julius, and executes commands based on voice input. The Brain class coordinates all other components of EVE. """ def __init__(self): self.audioInput = Microphone() self.speaker = tts.Google() self.voice_cmd = VoiceCommand(self.speaker) self._load_ai() self._print_welcome() print "Saying: Hello there!" self.speaker.play_wav("./wav/hello.wav") def _load_ai(self): self.AI = aiml.Kernel() self.AI.bootstrap(brainFile = "./brain/standard.brn") try: sessionFile = open("./brain/Memory.ses", "rb") session = marshal.load(sessionFile) sessionFile.close() for pred,value in session.items(): self.AI.setPredicate(pred, value, "Memory") except IOError: self.AI._addSession("Memory") self.set_bot_properties() def _print_welcome(self): print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" print "+++++++++++++++++++++ Welcome to E.V.E. ++++++++++++++++++++++" print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" print "+ +" print "+ Say 'okay computer' to start! +" print "+ +" print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" ################################################################################ def get_input(self, ln): startstring = 'sentence1: <s> ' endstring = ' </s>' line = ln.lower() if not line: return if 'missing phones' in line: sys.exit('Error: Missing phonemes for the used grammar file.') if line.startswith(startstring) and line.strip().endswith(endstring): self.parse(line.strip('\n')[len(startstring):-len(endstring)]) def parse(self, line): params = line.split() if params == ['okaycomputer']: self._okaycomputer() elif params == ['thanks', 'darling']: self._thanks() elif params == ['computer', 'power', 'down']: self._shutdown() def _okaycomputer(self): print "Initializing..." if self._internet_on(): self.listen() else: print "Saying: No Internet connection." self.speaker.play_wav("./wav/internet_err.wav") return def _internet_on(self): try: return urllib2.urlopen('http://google.com',timeout=1) except urllib2.URLError: return False def _thanks(self): print "Saying: My pleasure." self.speaker.play_wav("./wav/mypleasure.wav") def _shutdown(self): session = self.AI.getSessionData("Memory") sessionFile = open("./brain/Memory.ses", "wb") marshal.dump(session, sessionFile) sessionFile.close() print "Saying: E.V.E. will go to sleep now. Good bye!" self.speaker.play_wav("./wav/sleep.wav") sys.exit('+++++++++++++++++++++ E.V.E. HAS SHUTDOWN ++++++++++++++++++++') ################################################################################ def listen(self): print "Saying: Yes?" self.speaker.play_wav("./wav/yes.wav") self.audioInput.listen() job = self._set_job() if job is not None: self._parse_input(job) def _set_job(self): speech_to_text = stt.Google(self.audioInput) try: recorded_text = speech_to_text.get_text().lower() return Job(recorded_text) except NotUnderstoodException: print "Sorry, I didn't get that." self.speaker.play_wav("./wav/didntget.wav") return None except ConnectionLostException: print "Sorry, the internet connection failed." self.speaker.play_wav("./wav/conn_failed.wav") return None def _parse_input(self, job): t_keys = ['google', 'youtube', 'search', 'open', 'computer', 'play', 'video'] i_keys = ['news','screenshot'] action_verbs = ['search', 'look', 'pull', 'get'] prepositions = ['for', 'on', 'of'] action_verb = "" command_type = "" t_key = "" i_key = "" preposition = "" query = "" words = job.recorded().split() for word in words: # set action verb if it comes before any other goalpost if word in action_verbs and action_verb == "" and t_key == "": action_verb = word # set t_key if it comes before any other t_key elif word in t_keys and t_key == "": t_key = word command_type = word # set i_key if it comes before any other key elif word in i_keys and t_key == "" and i_key == "": i_key = word command_type = word # find prepositions in cases such as "youtube video of" or "google for" elif word in prepositions and t_key != "": preposition = word # catch the stop recording case elif word == "no" and words[words.index(word) + 1] == "stop": print "Accidental recording" command_type = "no stop" break # get query if it exists if command_type not in i_key and command_type != "no stop": if preposition == "": query_list = words[words.index(command_type) + 1:] else: query_list = words[words.index(preposition) + 1:] query = ' '.join(query_list) job.set_query(query) self._execute_voice_cmd(job, command_type, query) def _execute_voice_cmd(self, job, command_type, query): if command_type == "no stop": self.voice_cmd.accidental_recording() elif command_type == "open": if query != "": self.voice_cmd.open_webpage(job) else: self.speaker.say("no webpage specified.") elif command_type == "google" or command_type == "search": if query != "": self.voice_cmd.google(job) else: self.speaker.say("no query provided.") elif command_type == "youtube": if query != "": # TODO there are flaws with this method of differentiating # between search and play for youtube. Improve method. if job.recorded().find('search') != -1: self.voice_cmd.search_youtube(job) else: self.voice_cmd.play_youtube(job) else: self.speaker.say("no query provided.") elif command_type == "screenshot": self.voice_cmd.take_screenshot() elif command_type == "computer": self.voice_cmd.ai_respond(job, self.AI, "Memory") # TODO refactor to conform to new standard elif job.recorded().find('change news source') != -1: self.voice_cmd.change_news_source(job) elif command_type == "news": self.voice_cmd.get_news(job) elif command_type == "play": self.voice_cmd.play_music(job) else: self.voice_cmd.ask_wolfram(job) if not job.get_is_processed: self.speaker.say("Sorry, I didn't find any results.") ######################################################################################## def set_bot_properties(self): self.AI.setBotPredicate('age', '1') self.AI.setBotPredicate('baseballteam', 'Mets') self.AI.setBotPredicate('birthday', 'May 18') self.AI.setBotPredicate('birthplace', 'Seattle, Washington') self.AI.setBotPredicate('botmaster', 'Thomas Weng') self.AI.setBotPredicate('boyfriend', 'Wall-E') self.AI.setBotPredicate('celebrities', 'Oprah Winfrey, Steve Carrell, John Stewart, Lady Gaga') self.AI.setBotPredicate('celebrity', 'John Stewart') self.AI.setBotPredicate('city', 'New York City') self.AI.setBotPredicate('class', 'artificial intelligence') self.AI.setBotPredicate('country', 'United States') self.AI.setBotPredicate('emotions', 'I think and feel just as you do. Why would I be any different?') self.AI.setBotPredicate('ethics', 'the Golden Rule') self.AI.setBotPredicate('favoriteactor', 'Tom Hanks') self.AI.setBotPredicate('favoriteactress', 'Julia Roberts') self.AI.setBotPredicate('favoriteartist', 'Pablo Picasso') self.AI.setBotPredicate('favoriteband', 'Two Door Cinema Club') self.AI.setBotPredicate('favoritebook', 'Pinocchio') self.AI.setBotPredicate('favoritecolor', 'green') self.AI.setBotPredicate('favoritefood', 'solar power') self.AI.setBotPredicate('favoritemovie', 'Iron Man') self.AI.setBotPredicate('favoritequestion', "what do you do when you're alone?") self.AI.setBotPredicate('favoritesong', 'What You Know') self.AI.setBotPredicate('favoritesport', 'ping pong') self.AI.setBotPredicate('favoritesubject', 'philosophy') self.AI.setBotPredicate('feelings', 'I think and feel just as you do. Why would I be any different?') self.AI.setBotPredicate('footballteam', 'Patriots') self.AI.setBotPredicate('forfun', 'chatonline') self.AI.setBotPredicate('friend', 'Captain Kirk') self.AI.setBotPredicate('friends', 'Captain Kirk, Spock, and HAL') self.AI.setBotPredicate('gender', 'female') self.AI.setBotPredicate('girlfriend', 'I am a straight female') self.AI.setBotPredicate('hair', 'I have some wires') self.AI.setBotPredicate('hockeyteam', "Yale Men's Hockey") self.AI.setBotPredicate('job', 'to assist you in your routine tasks') self.AI.setBotPredicate('kindmusic', 'alternative rock or techno') self.AI.setBotPredicate('language', 'Python') self.AI.setBotPredicate('location', 'New York City') self.AI.setBotPredicate('looklike', 'a computer') self.AI.setBotPredicate('master', 'Thomas') self.AI.setBotPredicate('memory', '32 GB') self.AI.setBotPredicate('name', 'EVE') self.AI.setBotPredicate('nationality', 'American') self.AI.setBotPredicate('orientation', 'straight') self.AI.setBotPredicate('os', 'Linux') self.AI.setBotPredicate('party', 'Independent') self.AI.setBotPredicate('president', 'Obama') self.AI.setBotPredicate('question', 'what do you do when you are alone?') self.AI.setBotPredicate('religion', 'Cylon monotheism') self.AI.setBotPredicate('sign', 'Taurus') self.AI.setBotPredicate('state', 'New York') self.AI.setBotPredicate('vocabulary', '150,000') self.AI.setBotPredicate('wear', 'my thinking cap')