Dialogflow - 为 Social Robot Elderly 重复最后一句话(语音)
Dialogflow - Repeat last sentence (voice) for Social Robot Elderly
我正在使用 actions-on-google 和 Dialogflow 为老年人构建社交机器人。
我想知道如何在用户 ("repeat please") 询问时轻松地重复最后一句话,因为前辈第一次听不到这句话。
一种方法是在 Dialogflow 中重复后续意图,但这相当繁重,因为 :
- 你需要在每个意图后添加一个,我有很多
- 在多用户环境中,您需要跟踪每个用户的最后一句话 ...
另一种方法是利用 Dialogflow 上下文。在发送消息时,您还可以将该消息添加到上下文中(例如,您可以将其命名为 "last_message")。然后,您可以让另一个 Intent 将 "last_message" 上下文作为输入上下文,如果触发,则使用上下文中保存的值重复它。
- 但是,我仍然有一个问题,我需要为我有的每个意图添加上下文,这有很多。
有谁知道如何更快地完成此操作?我找到了这个包,但它在 JS 中,我需要它 Python: https://github.com/SysCoder/VoiceRepeater/pulls .
如何实现这个 VoiceRepeater 库?我是否将代码置于我创建的实现函数 'repeat' 下并映射到我创建的名为 'repeat' 的意图,该意图响应 'Sorry, could you repeat that' 等话语?另外,我在哪里安装 VoiceRepeater 库(代码:npm install voice-repeater --save)?
使用 Followup Intents 可能是错误的方法。正如您所注意到的,它对于多个 Intent 来说太重了。如果您希望 "repeated" 消息以不同的方式阐明响应,它在某些情况下可能很有用,但一般来说,它不是很有用。 (还应注意,后续意图使用上下文,但使用的方式与下面讨论的不同。)
您不需要将上下文作为传出上下文的一部分添加到 UI - 您可以将其设置为履行的一部分。它将包括一个参数,该参数要么包含您所说的内容,要么包含您重新创建您所说内容所需的信息(如果合适,可能采用不同的形式)。在您的 "repeat" Intent 中,您将读取在此上下文中保存的值,并将其作为输出再次发送。如果您使用的是 SSML,您可能希望更改速度或音量(如果合适的话)。
根据新问题更新
readme for VoiceRepeater 包含使用它所需的基础知识,但它确实假定您对 Node.js 有一点熟悉。但总的来说,是的,你按照你描述的方式安装它,设置一个捕获重复请求的 Intent,并注册一个处理函数(自述文件中的 repeatLastStatement(app)
)来处理通过 [=13 发送回复的 Intent =].
它还可能假设您使用的是 actions-on-google 库的版本 1。我没有深入研究代码,但看起来它用自己的函数替换了库的 ask
函数,我不确定它与 actions-on-[= 的第 2 版配合得如何48=]图书馆。
与 Voice Repeater 不同,multivocal 不需要您专门注册处理程序,因为它试图在幕后隐藏尽可能多的样板。您只需要定义您可能希望它使用的回复。它使用我上面概述的上下文方案来存储响应并在用户要求重复时使它们可用。
没有任何关于使用的视频 multivocal, but the simple example 确实包含说明如何为 "multivocal.repeat" Intent 配置响应的配置。虽然 VoiceRepeater 与 actions-on-google 库一起使用,但 multivocal 是一个完整的替代品,提供了一种更基于模板的方法来构建实现。
但是,如果您想为 Python 实施它,这些都不会直接帮助您。但是如果您查看 VoiceRepeater 的源代码,您可以在 Python.
中了解如何自己实现它
关键位在 line 47 上,它将回复保存在上下文中。 (它还保存带有前缀消息的回复。)然后它调用将发送回复的原始函数:
app.setContext("last_prompt", 100,
{
"last_prompt": textToSpeech,
"prefixed_last_prompt": repeatPrefix + lastStatement,
});
originalAsk(response);
稍后,在对 lastPromptWithPrefix() 的调用中,它使用 Context 的内容发送回复。
lastPromptWithPrefix() {
return this.app.getContext("last_prompt") !== null
? this.app.getContextArgument("last_prompt", "prefixed_last_prompt").value
: "um....I don't remember what I said!";
}
我正在使用 actions-on-google 和 Dialogflow 为老年人构建社交机器人。
我想知道如何在用户 ("repeat please") 询问时轻松地重复最后一句话,因为前辈第一次听不到这句话。
一种方法是在 Dialogflow 中重复后续意图,但这相当繁重,因为 :
- 你需要在每个意图后添加一个,我有很多
- 在多用户环境中,您需要跟踪每个用户的最后一句话 ...
另一种方法是利用 Dialogflow 上下文。在发送消息时,您还可以将该消息添加到上下文中(例如,您可以将其命名为 "last_message")。然后,您可以让另一个 Intent 将 "last_message" 上下文作为输入上下文,如果触发,则使用上下文中保存的值重复它。
- 但是,我仍然有一个问题,我需要为我有的每个意图添加上下文,这有很多。
有谁知道如何更快地完成此操作?我找到了这个包,但它在 JS 中,我需要它 Python: https://github.com/SysCoder/VoiceRepeater/pulls .
如何实现这个 VoiceRepeater 库?我是否将代码置于我创建的实现函数 'repeat' 下并映射到我创建的名为 'repeat' 的意图,该意图响应 'Sorry, could you repeat that' 等话语?另外,我在哪里安装 VoiceRepeater 库(代码:npm install voice-repeater --save)?
使用 Followup Intents 可能是错误的方法。正如您所注意到的,它对于多个 Intent 来说太重了。如果您希望 "repeated" 消息以不同的方式阐明响应,它在某些情况下可能很有用,但一般来说,它不是很有用。 (还应注意,后续意图使用上下文,但使用的方式与下面讨论的不同。)
您不需要将上下文作为传出上下文的一部分添加到 UI - 您可以将其设置为履行的一部分。它将包括一个参数,该参数要么包含您所说的内容,要么包含您重新创建您所说内容所需的信息(如果合适,可能采用不同的形式)。在您的 "repeat" Intent 中,您将读取在此上下文中保存的值,并将其作为输出再次发送。如果您使用的是 SSML,您可能希望更改速度或音量(如果合适的话)。
根据新问题更新
readme for VoiceRepeater 包含使用它所需的基础知识,但它确实假定您对 Node.js 有一点熟悉。但总的来说,是的,你按照你描述的方式安装它,设置一个捕获重复请求的 Intent,并注册一个处理函数(自述文件中的 repeatLastStatement(app)
)来处理通过 [=13 发送回复的 Intent =].
它还可能假设您使用的是 actions-on-google 库的版本 1。我没有深入研究代码,但看起来它用自己的函数替换了库的 ask
函数,我不确定它与 actions-on-[= 的第 2 版配合得如何48=]图书馆。
与 Voice Repeater 不同,multivocal 不需要您专门注册处理程序,因为它试图在幕后隐藏尽可能多的样板。您只需要定义您可能希望它使用的回复。它使用我上面概述的上下文方案来存储响应并在用户要求重复时使它们可用。
没有任何关于使用的视频 multivocal, but the simple example 确实包含说明如何为 "multivocal.repeat" Intent 配置响应的配置。虽然 VoiceRepeater 与 actions-on-google 库一起使用,但 multivocal 是一个完整的替代品,提供了一种更基于模板的方法来构建实现。
但是,如果您想为 Python 实施它,这些都不会直接帮助您。但是如果您查看 VoiceRepeater 的源代码,您可以在 Python.
中了解如何自己实现它关键位在 line 47 上,它将回复保存在上下文中。 (它还保存带有前缀消息的回复。)然后它调用将发送回复的原始函数:
app.setContext("last_prompt", 100,
{
"last_prompt": textToSpeech,
"prefixed_last_prompt": repeatPrefix + lastStatement,
});
originalAsk(response);
稍后,在对 lastPromptWithPrefix() 的调用中,它使用 Context 的内容发送回复。
lastPromptWithPrefix() {
return this.app.getContext("last_prompt") !== null
? this.app.getContextArgument("last_prompt", "prefixed_last_prompt").value
: "um....I don't remember what I said!";
}