Alexa Skill - 如何获取要求 Alexa 的完整声明文本
Posted
技术标签:
【中文标题】Alexa Skill - 如何获取要求 Alexa 的完整声明文本【英文标题】:Alexa Skill - How to get complete text of statement asked to alexa 【发布时间】:2018-10-16 20:29:41 【问题描述】:我正在创建一个 Alexa 技能,我编写了几个自定义和默认意图,它们运行良好。
现在我想编写一个备用意图,其中我想获得询问/发送给 Alexa 技能的确切语句,有没有一种方法可以让我们获得已被询问到 Alexa 技能的整个问题字符串/文本。我知道我们可以获得槽值和意图信息,但我需要将整个文本语句发送到技能。
谢谢
【问题讨论】:
【参考方案1】:嗯,我也遇到过同样的问题。在尝试了几种方法后,我得到了询问 Alexa 的语句的完整文本。
您必须在您的 Alexa 技能中进行以下设置(您可以根据需要选择意图名称、插槽名称和插槽类型)
设置意图
设置自定义槽类型
设置您的 Alexa 技能后,您可以调用您的技能,为启动请求保留一些响应并说出您想要的任何内容,您可以捕获整个文本,如下所示。
"intent":
"name": "sample",
"confirmationStatus": "NONE",
"slots":
"sentence":
"name": "sentence",
"value": "hello, how are you?",
"resolutions":
"resolutionsPerAuthority": [
"authority": "xxxxxxx",
"status":
"code": "xxxxxxx"
]
,
"confirmationStatus": "NONE",
"source": "USER"
注意*:在这种方法中,如果有多个意图,您将需要正确处理话语。
【讨论】:
【参考方案2】:没有办法直接从***意图获得整个话语。现在,您可以获得的最接近的方法是使用类型为 AMAZON.SearchQuery 的自定义插槽(不是另一个答案中建议的自定义类型),但您必须在之前的话语中定义一个锚短语插槽。例如,您可以定义如下语句:
search query
其中查询是 AMAZON.SearchQuery 类型的槽。
话语中的锚点搜索是强制性的(SearchQuery 类型的要求),所以只要用户通过说 search 开始话语,接下来的任何内容将被捕获,这与您想要实现的目标非常接近。
话虽如此,实际上有一种间接方法可以利用 AMAZON.SearchQuery 来近似捕获用户所说的整个话语(由 NLU 过滤),但仅作为使用 Dialog Management 的持续对话的一部分。如果您正在参与此类对话,其中 Alexa 自动使用定义的提示来请求槽信息,您可以定义一个话语,它是一个单独的 AMAZON.SearchQuery 类型的独立槽,没有锚。示例:
Alexa: Ok, I will create a reminder for you. Please tell me the text of the reminder
User: Pick of the kids from school
Alexa: Ok. I will remind you to Pick up the kids from school
在上面的示例中,Alexa 检测到用户想要发送提醒,但没有设置提醒文本,因此它会引发插槽。当您作为开发人员定义 Alexa 需要询问的提示时,还定义了可能的响应。在这种情况下,您可以将响应话语定义为:
query
并捕获用户响应提示所说的全部内容,例如“去学校接孩子”
【讨论】:
【参考方案3】:美国英语语言有一个名为 AMAZON.LITERAL
的插槽类型,可让您准确捕捉所使用的短语或句子(取决于它在您的话语中的使用方式)。但是,此插槽类型在其他地区不可用。
亚马逊也不推荐使用它:
虽然您可以提交新的和更新的英语(美国)技能 AMAZON.LITERAL,自定义槽类型提供比 AMAZON.LITERAL 在大多数情况下。因此,我们建议您 如果可能,请考虑迁移到自定义插槽类型。注意 AMAZON.LITERAL 不支持英语以外的任何语言 (美国)。
见:https://developer.amazon.com/docs/custom-skills/literal-slot-type-reference.html
【讨论】:
AMAZON.LITERAL 也已弃用。【参考方案4】:曾经有一个插槽类型叫做Amazon.LITERAL
,它被允许在特定区域使用。但是,它现在已被弃用(或删除)。
然而,使用自定义插槽可以解决这个问题。
假设我们正在 Alexa 上创建一个食品订购系统。像 Zomato 或 Alexa 的 Yelp 这样的技能。让我们给技能调用名称 robert。
所以首先我们列出将要进行的语句类型。如果你的技能不是这个特定的,你可以跳过这一步。但是,这只是帮助您定义您的技能可能会遇到的语句类型。
Alexa 命令 robert 给我送一份带有土豆泥的鸡排。 Alexa 要求 robert 向我推荐我附近的一些不错的印度餐馆。 Alexa 请告诉 robert 给 XYZ 餐厅最近的外卖打一颗星。在我们创建一个语句列表后,我们将它们存储在一个 csv 文件中。 我们继续点击Slot Types旁边的Add按钮。 为您的自定义插槽类型命名。 现在,一旦你完成了这个,拿出你的技能可以被调用的结构列表。其中一些已在下面给出。
Alexa 要求罗伯特... Alexa 让罗伯特... Alexa 命令 robert... Alexa 告诉罗伯特...三个点 (...) 代表订单/声明的实际部分。这是您有兴趣提取的文本。一个例子是;对于声明,
Alexa 让罗伯特给我送一桶鸡块。
您可能有兴趣仅提取粗体部分。
现在亚马逊根据意图对陈述进行分类。它们有五个默认的预定义意图,用于欢迎、取消、帮助和其他基本功能。我们继续创建一个自定义意图来处理主要用于与我们的技能交互的主流语句。
在新的自定义意图窗口下,页面底部是用于添加将在您的意图中使用的槽的空间。我们添加之前创建的自定义插槽并将其命名为 literal。 (你可以随便命名)
在我们的例子中,自定义插槽 literal 是我们想要从用户语句中提取的文本。
现在我们继续将结构列表中的三个点 (...) 替换为 literal
,并将其添加到示例话语列表中。
对于声明
Alexa 让 robert 给我送一份带有土豆泥的鸡排。
JSON 将包含这样的部分,用于自定义意图并突出显示自定义槽文本。
"request":
"type": "IntentRequest",
"requestId": "",
"timestamp": "2019-01-01T19:37:17Z",
"locale": "en-IN",
"intent":
"name": "InteractionIntent",
"confirmationStatus": "NONE",
"slots":
"literal":
"name": "literal",
"value": "to send me a chicken steak with mashed potatoes.",
"resolutions":
"resolutionsPerAuthority": [
"authority": "",
"status":
"code": ""
]
,
"confirmationStatus": "NONE",
"source": "USER"
在自定义意图下的槽子部分下,我们有我们的文字槽,其值为我们提供了用户语音的文本。
"slots":
"literal":
"name": "literal",
"value": "to send me a chicken steak with mashed potatoes."
【讨论】:
以上是关于Alexa Skill - 如何获取要求 Alexa 的完整声明文本的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Alexa Skill lambda 函数中正确指定 SSML?
Alexa Skill - 如何在 Lambda 函数中检索槽值