Esempio n. 1
0
 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'
Esempio n. 2
0
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)