爱丽丝技能开发的一些功能



您住在莫斯科并开车吗? 如果是这样,您如何支付停车费? 发送短信? 通过莫斯科停车应用程序付款? 在电报中使用漫游器? 我决定说:“这一切都令人不舒服。”并创造了我的技能,让爱丽丝通过语音支付停车费用。 此外,Yandex.Navigator中已经内置了Alice。 现在,您可以告诉导航器,例如“爱丽丝,请莫斯科停车场为 3209 停车场 支付30分钟的 停车 。”

发展技能时我遇到了什么?

会议


为了从第三方开发人员那里开始这项技能,Alice需要说“ Alice,某某人开始这项技能”。 如果您长时间与该技能沟通,这很好且方便-例如,游戏开始。 如果您只想说一个短语,得到一个答案,仅此而已,那么“输入一项技能”就很不方便-使用此输入,当您完成一项技能的工作时,您将需要“退出”该技能。

一句话,Alice开发人员提供了一种解决方案-您需要说:“ Alice要求这样做的技能。” 但是,来自Alice开发人员的python示例不支持这种技能发布:

if req['session']['new']: # -  return 

每次启动一项技能时,包括 并使用“爱丽丝要求技能 ...”命令, session.new的值为True 。 因此,将不会执行所有其他处理代码。 解决方案是检查session.command的文本-它应该为空。

顺便说一句,如果您“输入”了一项技能,则默认情况下,所有技能的爱丽丝都支持退出短语-“爱丽丝,停止它”和“爱丽丝,回来”。 如果您想使用该技能强制结束会话,则需要在响应中传递等于True的 end_session 。 但这仅适用于Yandex.Station-在其他设备上,在这种情况下退出该技能无效。

处理数字


我的技能是使用数字-首先识别用户的电话号码,然后识别停车号码。

在上面的Yandex示例中,使用了

 req['request']['original_utterance'].lower() 

处理用户请求。 首先,我使用了请求中的该字段。 为了识别用户的电话号码,我不得不要求用户分别命名该号码的每个数字,例如“九一六一二三三四有五六七”。 并在代码中-用数字(9)替换文本值(“九”)。 原来,停车代码更有趣-我将代码“ 3209”称为“三十二零九”,该代码具有许多类型的替换

 s.replace(' ', '32').replace(' ', '31').replace('', '0') 

鉴于基于技能代码中的请求文本,我试图了解用户想要什么(技能中未使用状态机),所以我不得不对几乎每个(!)用户请求进行此转换。

事实证明,爱丽丝的服务器已经为您(甚至更多)做所有事情。 只需使用request.command而不是request.original_utterance即可 。 是的,这在文档中有说明。 在答案示​​例的工具提示中。
服务字段:用户请求已转换为Alice的内部处理。 在转换过程中,尤其是清除了文本的标点符号,并将数字转换为数字。
奇怪的是,在Alice开发人员的示例中(上面的链接)使用了原始文本( request.original_utterance )。 实际上,在request.command中还有更多工作要做(在文档中没有描述)。 例如,电话号码被转换为(916)123-45-67格式-现在,根据我的能力,用户可以以任何方便的格式呼叫电话。 同样,删除了“爱丽丝,要求某某技能”,“爱丽丝”消息,纠正了错别字。

在爱丽丝方面,可以将查询的各个部分(数字,名称,地址,日期)转换为命名实体 。 但这很奇怪。 请求79161234567 1234 ,将其转换为两个数字791612345 701234的命名实体。 为什么第一个数字不同,但无法找到-那些。 Yandex.Dialog支持人员仍在考虑答案。

技能反应时间


爱丽丝会在3秒内等待技能的回应(Google对此限制为5/10秒 )。 我的技能是访问第三方服务器以开始和结束停车。 他们回答很慢。 有时在3秒内我的技能没有时间给出答案。 单独地,不可能增加技能反应的时间。 因此,在某些情况下,有必要牺牲便利性-例如,在停车开始时,该技能不要求莫斯科停车应用程序配置文件中指定的实际汽车,而是使用在用户授权期间保留的那辆汽车。

好吧,关于“我是公关”的权利;)-

Source: https://habr.com/ru/post/zh-CN471388/


All Articles