def voc_match(self, utt, voc_filename, lang=None, exact=False): # TODO: Handles bug to be addressed in: https://github.com/OpenVoiceOS/ovos_utils/issues/73 try: return super().voc_match(utt, voc_filename, lang, exact) except FileNotFoundError: LOG.info(f"`{voc_filename}` not found, checking in neon_core") from mycroft.skills.skill_data import read_vocab_file from neon_utils.packaging_utils import get_core_root from itertools import chain import re lang = lang or self.lang voc = os.path.join(get_core_root(), "neon_core", "res", "text", lang, f"{voc_filename}.voc") if not os.path.exists(voc): raise FileNotFoundError(voc) vocab = read_vocab_file(voc) cache_key = lang + voc_filename self.voc_match_cache[cache_key] = list(chain(*vocab)) if utt: if exact: # Check for exact match return any(i.strip() == utt for i in self.voc_match_cache[cache_key]) else: # Check for matches against complete words return any([re.match(r'.*\b' + i + r'\b.*', utt) for i in self.voc_match_cache[cache_key]]) else: return False
def initialize(self): self.register_fallback(self.handle_fallback, int(self.settings["priority"])) self._converse_keepalive = create_daemon(self.converse_keepalive) say_voc = self.find_resource('and_say.voc', 'vocab') if say_voc: # load vocab and flatten into a simple list # TODO sort by length self.say_vocab = list(chain(*read_vocab_file(say_voc))) self.start_sip() if self.settings["sipxcom_sync"]: self.sipxcom_sync() # Register GUI Events self.handle_gui_state("Clear") self.gui.register_handler("voip.jarbas.acceptCall", self.accept_call) self.gui.register_handler("voip.jarbas.hangCall", self.hang_call) self.gui.register_handler("voip.jarbas.muteCall", self.mute_call) self.gui.register_handler("voip.jarbas.unmuteCall", self.unmute_call) self.gui.register_handler("voip.jarbas.callContact", self.handle_call_contact_from_gui) self.gui.register_handler("voip.jarbas.updateConfig", self.handle_config_from_gui) self.add_event('skill--voip.jarbasskills.home', self.show_homescreen)
def initialize(self): self.register_fallback(self.handle_fallback, int(self.settings["priority"])) self._converse_keepalive = create_daemon(self.converse_keepalive) say_voc = self.find_resource('and_say.voc', 'vocab') if say_voc: # load vocab and flatten into a simple list self.say_vocab = list(chain(*read_vocab_file(say_voc))) self.start_sip()
def get_voc(self, voc_filename): # Check for both skill resources and mycroft-core resources voc = self.find_resource(voc_filename + '.voc', 'vocab') if not voc: # Check for vocab in mycroft core resources voc = resolve_resource_file( join('text', self.lang, voc_filename + '.voc')) if not voc or not exists(voc): raise FileNotFoundError( 'Could not find {}.voc file'.format(voc_filename)) # load vocab and flatten into a simple list vocab = read_vocab_file(voc) return list(chain(*vocab))
def voc_match(self, utt, voc_filename, lang=None, exact=False): """Determine if the given utterance contains the vocabulary provided. Checks for vocabulary match in the utterance instead of the other way around to allow the user to say things like "yes, please" and still match against "Yes.voc" containing only "yes". The method first checks in the current skill's .voc files and secondly the "res/text" folder of mycroft-core. The result is cached to avoid hitting the disk each time the method is called. Arguments: utt (str): Utterance to be tested voc_filename (str): Name of vocabulary file (e.g. 'yes' for 'res/text/en-us/yes.voc') lang (str): Language code, defaults to self.long exact (bool): comparison using "==" instead of "in" Returns: bool: True if the utterance has the given vocabulary it """ lang = lang or self.lang cache_key = lang + voc_filename if cache_key not in self.voc_match_cache: # Check for both skill resources and mycroft-core resources voc = self.find_resource(voc_filename + '.voc', 'vocab') if not voc: # Check for vocab in mycroft core resources voc = resolve_resource_file( join('text', lang, voc_filename + '.voc')) if not voc or not exists(voc): raise FileNotFoundError( 'Could not find {}.voc file'.format(voc_filename)) # load vocab and flatten into a simple list vocab = read_vocab_file(voc) self.voc_match_cache[cache_key] = list(chain(*vocab)) if utt: if exact: # Check for exact match return any(i.strip() == utt for i in self.voc_match_cache[cache_key]) else: # Check for matches against complete words return any([ re.match(r'.*\b' + i + r'\b.*', utt) for i in self.voc_match_cache[cache_key] ]) else: return False
def check_read_vocab_file(self, path, result_list=None): resultlist = result_list or [] self.assertEqual(sorted(read_vocab_file(path)), sorted(result_list))