最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢?
我最后选择的方法是用threading.Timer(),rasa这边解析说话意图“提醒我(behavior)”——behavior是任何事情,解析成功后会回复“我会在5分钟后提醒你behavior”。语音助手接收到这条回复后,会判断是否包含“5分钟后提醒”这几个关键字,若是则启动threading.Timer(),定时5分钟后执行提醒。
这里,执行提醒的操作其实就是在满5分钟时自动发一份语义解析请求给rasa。我在rasa的domain.yml中定义了一条EXTERNAL_reminder的用户意图,同时还定义了这条意图对应的action,并写入stories.md中。于是,当rasa收到执行提醒的用户意图后,便自动返回我预先定义好的话术。语音助手收到话术后直接通过TTS播报出来,定时提醒功能完成。
接下来是我写的相关代码,和大家分享。
语音助手demo.py代码中增加一个独立的函数:
def act_remind(text):
print("5分钟提醒触发……")
resp = rasabot.ask(text)
print("提醒内容:"+resp)
tts.text_to_speech(resp)
然后在call_back函数中,在if resp== “有需要再叫我”这个条件后,增加一个else指令:
else:
index0 = resp.find('5分钟后提醒')
if index0 != -1:
text0 = '/EXTERNAL_reminder'
t = threading.Timer(300, act_remind, args=[text0])
t.start()
这条指令就是判断是否要执行提醒计时线程。
关于demo.py的代码, 请参看之前的博文:
https://blog.csdn.net/hydekong/article/details/141354955
Rasa部分的actions.py,就增加两个actions:
class ActionSetReminder(Action):
def name(self) -> Text:
return "action_set_reminder"
def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:
behavior = tracker.get_slot("behavior")
msg1 = '我会在5分钟后提醒你' + behavior
dispatcher.utter_message(text= msg1)
return []
class ActionReactToReminder(Action):
def name(self) -> Text:
return "action_react_to_reminder"
def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:
behavior = tracker.get_slot("behavior")
dispatcher.utter_message(f"主人,到时间 {behavior} 啦!")
return []
domain.yml部分intents增加:
- ask_remind_behavior
- EXTERNAL_reminder
actions增加:
- action_set_reminder
- action_react_to_reminder
entities增加:
- behavior
slots增加:
behavior:
type: text
stories.md增加一个故事:
## set_reminder
* ask_remind_behavior
- action_set_reminder
* EXTERNAL_reminder
- action_react_to_reminder
nlu.md增加一个用户意图ask_remind_behavio
## intent: ask_remind_behavior
- 提醒我[接娃](behavior)
- 提醒我[健身](behavior)
- 提醒我[做饭](behavior)
- 提醒我[睡觉](behavior)
- 提醒我[回电](behavior)
- 提醒我[休息](behavior)
- 提醒我[洗澡](behavior)
- 提醒我[吃饭](behavior)
- 提醒我[开会](behavior)
- 提醒我[叫车](behavior)
最后rasa train把模型生成,rasa run actions把两个新增actions完成注册,再启动rasa run –enable-api,把rasa server跑起来。之后,进入语音助手的项目文件夹,输入python demo.py,就可以实际测试了。