Merge pull request #1690 from MycroftAI/feature/ask-yes-no

Add new MycroftSkill.ask_yesno() method
pull/1696/head
Åke 2018-07-19 09:34:32 +02:00 committed by GitHub
commit c140d5b889
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 63 additions and 6 deletions

View File

@ -0,0 +1,4 @@
no
nope
nah
negative

View File

@ -0,0 +1,5 @@
yes
yeah
yep
sure
please

View File

@ -360,6 +360,12 @@ class MycroftSkill(object):
data = data or {}
def get_announcement():
nonlocal announcement
# The dialog param can be either a spoken string or a dialog file
# TODO: 18.08 merge dialog/announcement
if not exists(join(self.root_dir, 'dialog', self.lang,
dialog + '.dialog')) and not announcement:
announcement = dialog
return announcement or self.dialog_renderer.render(dialog, data)
if not get_announcement():
@ -373,13 +379,8 @@ class MycroftSkill(object):
else:
return get_announcement()
# TODO: Load with something like mycroft.dialog.get_all()
cancel_voc = 'text/' + self.lang + '/cancel.voc'
with open(resolve_resource_file(cancel_voc)) as f:
cancel_words = list(filter(bool, f.read().split('\n')))
def is_cancel(utterance):
return utterance in cancel_words
return self.is_match(utterance, 'cancel')
def validator_default(utterance):
# accept anything except 'cancel'
@ -414,6 +415,53 @@ class MycroftSkill(object):
line = on_fail_fn(response)
self.speak(line, expect_response=True)
def ask_yesno(self, prompt, data=None):
"""
Read prompt and wait for a yes/no answer
This automatically deals with translation and common variants,
such as 'yeah', 'sure', etc.
Args:
prompt (str): a dialog id or string to read
Returns:
string: 'yes', 'no' or whatever the user response if not
one of those, including None
"""
resp = self.get_response(dialog=prompt, data=data)
if self.is_match(resp, 'yes'):
return 'yes'
if self.is_match(resp, 'no'):
return 'no'
return resp
def is_match(self, utt, voc_filename, lang=None):
""" Determine if the given utterance contains the vocabular proviced
This checks for vocabulary match in the utternce instead of the other
way around to allow the user to say things like "yes, please" and
still match against voc files with only "yes" in it.
Args:
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
Returns:
bool: True if the utterance has the given vocabulary it
"""
lang = lang or self.lang
voc = join('text', self.lang, voc_filename+".voc")
with open(resolve_resource_file(voc)) as f:
words = list(filter(bool, f.read().split('\n')))
if (utt and any(i.strip() in utt for i in words)):
return True
return False
def report_metric(self, name, data):
"""
Report a skill metric to the Mycroft servers