def __init__(self, username=None, path=os.path.join(get_main_dir(), 'data'), write=False, speak=False): if username is None: if _user is None: self.user = raw_input('Enter a username: '******'generic.chal')) as fp: self.generic = [i.strip() for i in fp.readlines() if i.strip() and i[0] != '#'] self.generic.append("I can't seem to understand.") except IOError: self.generic = ["I have a problem with my brain, I can't think..."] self.macro = HALmacro(self, username, write) self.speak = speak self.advspeak = False self.sphandle = None self.speak_opt = dict(volume=100, speed=175, gender=True, lang='en-us') self.data_folder = path self.debug_write = write self._init_handler_plugin() self._init_autotalk() self._init_repetition() self.semantics = False self.rndname = True self.previn = deque(maxlen=100) self.prevout = deque(maxlen=100) self.lastlang = 'en'
class HAL(object): version = '0.027' def __init__(self, username=None, path=os.path.join(get_main_dir(), 'data'), write=False, speak=False): if username is None: if _user is None: self.user = raw_input('Enter a username: '******'generic.chal')) as fp: self.generic = [i.strip() for i in fp.readlines() if i.strip() and i[0] != '#'] self.generic.append("I can't seem to understand.") except IOError: self.generic = ["I have a problem with my brain, I can't think..."] self.macro = HALmacro(self, username, write) self.speak = speak self.advspeak = False self.sphandle = None self.speak_opt = dict(volume=100, speed=175, gender=True, lang='en-us') self.data_folder = path self.debug_write = write self._init_handler_plugin() self._init_autotalk() self._init_repetition() self.semantics = False self.rndname = True self.previn = deque(maxlen=100) self.prevout = deque(maxlen=100) self.lastlang = 'en' def load(self, file): self.intel.load(file) def _init_handler_plugin(self): # Plugin interface dir = os.path.join(get_main_dir(), 'plugins/handler') #files = os.path.join(dir, '*.py') #files = [os.path.basename(i).replace('.py', '') for i in glob(files)] files = filter(bool, map(module_filter, glob(os.path.join(dir, '*')))) for file in files: try: print 'Loading extension "%s"...'%file data = imp.find_module(file, [dir]) module = imp.load_module(str(uuid.uuid1()), *data) except: print 'Error in handler extension', file traceback.print_exc() else: if not (hasattr(module, 'check') and callable(module.check)): print 'Error in handler extension %s: check() does NOT exist!'%file continue if not (hasattr(module, 'answer') and callable(module.answer)): print 'Error in handler extension %s: check() does NOT exist!'%file continue self.handlers.insert(0, module) def _init_autotalk(self): try: self.autotalkdb = [i.strip() for i in open(os.path.join(self.data_folder, 'auto.chal'))] except IOError: pass def _init_repetition(self): try: self.repetitiondb = [i.strip() for i in open(os.path.join(self.data_folder, 'repeat.chal'))] self.repetitiondb = filter(lambda x: x and x[0] != '#', self.repetitiondb) except IOError: self.repetitiondb = ['Was my answer not clear enough?'] def autotalk(self): return random.choice(self.autotalkdb) def _clean_text(self, text): for regex, replacement in self.readable.iteritems(): text = regex.sub(replacement, text) for regex in self.remove: text = regex.sub('', text) return text def shutdown(self): return 'Goodbye, %s. I enjoyed talking to you.'%self.user def do_speech(self, text): # Note that linux can't do speech for now if os.name == 'nt' and self.speak: engine = HALadvspeak if self.advspeak else HALspeak engine.stop_speaking(self.sphandle) self.sphandle = engine.speak(text, False, **self.speak_opt) def ask(self, question): # Repetition if self.previn and clean_string(question) == clean_string(self.previn[0]): res = random.choice(self.repetitiondb) res = res.replace('----', "'%s'"%' '.join(self.prevout[0])) yield self.macro.subst(res) return answers = [] lang = detect_lang(question, self.lastlang) if lang is None: lang = self.lastlang #print 'Language:', lang #print 'Last Language:', self.lastlang if lang != self.lastlang: tran = translate(question, lang).encode('utf-8') lasttran = translate(question, self.lastlang).encode('utf-8') lang, prob, tran = max([(lang, ratio_correct(tran), tran), (self.lastlang, ratio_correct(lasttran), lasttran)], key=lambda x: x[1]) question = tran #print 'Chosen:', lang, 'prob:', prob #print 'Question:', question is_foreign = lang != 'en' #if is_foreign: # question = language.translate(question, lang).encode('utf-8') if question is None: return #check = check_blank(question) #if check is not None: # return [check] if check_for_end(question): self.running = False return #question = self._clean_text(question) for sentence in sentence_split(question): answer = None for handler in self.handlers: if handler.check(sentence): try: ans = handler.answer(sentence) except HALcannotHandle: continue else: answer = ans break if answer is None: answer = random.choice(self.generic) answer = self.macro.subst(answer) if self.semantics: lang, inter, answer = HALtran.transform(answer) if self.rndname: answer = rndname(answer, self.user) if is_foreign: #print 'Answer:', answer answer = translate(answer, 'en', lang) yield answer answers.append(answer) #answers = [self.macro.subst(answer) for answer in answers] self.do_speech(' '.join(answers)) self.previn.appendleft(question) self.prevout.appendleft(answers)