diff --git a/__init__.py b/__init__.py index 9185730..8baaa43 100644 --- a/__init__.py +++ b/__init__.py @@ -39,7 +39,9 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +from os.path import join, isfile +from ovos_bus_client.util import get_message_lang from ovos_workshop.decorators import fallback_handler from ovos_workshop.skills.fallback import FallbackSkill from neon_utils.message_utils import request_for_neon @@ -71,13 +73,21 @@ def _read_voc_lines(self, name) -> filter: :param name: vocab resource name :returns: filter for specified vocab resource """ - with open(self.find_resource(name + '.voc', 'vocab')) as f: + vocab = self.find_resource(f"{name}.voc", 'vocab', + lang=self.lang) + if self.lang not in vocab: + test_path = join(self.root_dir, "vocab", self.lang, f"{name}.voc") + if isfile(test_path): + LOG.warning(f"Resolved {vocab} but using {test_path}") + vocab = test_path + LOG.debug(f"Reading voc file {vocab} for lang={self.lang}") + with open(vocab) as f: return filter(bool, map(str.strip, f.read().split('\n'))) @fallback_handler(priority=100) def handle_fallback(self, message: Message): - LOG.info("Unknown Fallback Checking for Neon!!!") utterance = message.data['utterance'] + LOG.info(f"Unknown Fallback handling: {utterance}") client = message.context.get('client') ww_state = self.config_core.get("listener", {}).get("wake_word_enabled", True) @@ -110,12 +120,12 @@ def handle_fallback(self, message: Message): })) LOG.debug(f"Checking if neon must respond: {message.data}") - # Determine what kind of question this is to reply appropriately for i in ['question', 'who.is', 'why.is']: for line in self._read_voc_lines(i): + LOG.info(f"Checking for pattern: {line}.*") if utterance.startswith(line): - LOG.info('Fallback type: ' + i) + LOG.info(f'Fallback type: {i} ({utterance})') self.speak_dialog(i, data={'remaining': line.replace(i, '')}) return True diff --git a/test/test_skill.py b/test/test_skill.py index e9e2060..82e613f 100644 --- a/test/test_skill.py +++ b/test/test_skill.py @@ -32,8 +32,7 @@ from os.path import dirname from mock import Mock -from mycroft_bus_client import Message -from neon_utils.skills import NeonFallbackSkill +from ovos_bus_client.message import Message from neon_minerva.tests.skill_unit_test_base import SkillTestCase @@ -67,22 +66,29 @@ def neon_must_respond(msg: Message): self.skill.report_metric = Mock() message_not_for_neon = Message("test", - {"utterance": "this is long enough"}) + {"utterance": "this is long enough", + "lang": "en-us"}) message_too_short = Message("test", {"neon_in_request": True, - "utterance": "short"}) + "utterance": "short", + "lang": "en-us"}) # message_neon_must_respond = Message("test", # {"neon_must_respond": True, # "utterance": "test search"}) message_question = Message("test", {"neon_in_request": True, - "utterance": "what is rain"}) + "utterance": "what is rain", + "lang": "en-us"}) message_who_is = Message("test", {"neon_in_request": True, - "utterance": "who is rain"}) + "utterance": "who is rain", + "lang": "en-us"}) message_why_is = Message("test", {"neon_in_request": True, - "utterance": "why is rain"}) + "utterance": "why is rain", + "lang": "en-us"}) message_unknown = Message("test", {"neon_in_request": True, - "utterance": "is it raining"}) + "utterance": "is it raining", + "lang": "en-us"}) message_transact_client = Message("test", {"neon_in_request": True, - "utterance": "short"}, + "utterance": "short", + "lang": "en-us"}, {"client": "mq_api"}) self.assertTrue(self.skill.handle_fallback(message_not_for_neon)) self.skill.speak_dialog.assert_not_called()