首页 > 解决方案 > 用户可以在瀑布步骤中的文本提示上发送附件和消息吗?

问题描述

假设我们在瀑布对话框中有以下步骤:

self.add_dialog(TextPrompt(TextPrompt.__name__))
    self.add_dialog(
        WaterfallDialog(
            WaterfallDialog.__name__,
            [
                self.project_step,
                self.name_step,
                self.confirm_step,
                self.final_step,
            ],
        )
    )

async def project_step(
    self, step_context: WaterfallStepContext
) -> DialogTurnResult:
    """
    If a project name has not been provided, prompt for one.
    :param step_context:
    :return DialogTurnResult:
    """
    confluence_details = step_context.options

    if confluence_details.project is None:
        message_text = key.query_project_confluence_text.value + "?"
        prompt_message = MessageFactory.text(
            message_text, message_text, InputHints.expecting_input
        )
        return await step_context.prompt(
            TextPrompt.__name__, PromptOptions(prompt=prompt_message)
        )
    return await step_context.next(confluence_details.project)

如果用户在提示时向机器人发送附件和文本。是否有可能同时获得step_context.result

on_message_activity我可以使用TurnContext.activity.attachments检查附件,但是如何在后续步骤中使用 Waterfall step_context 和文本消息接收相同的内容?

请求正文如下:

{
    "text":"Hello there",
    "type":"message",
    "from":{
        "id":"xyz"
    },
    "attachments":{
        "contentType":"audio/wav",
        "name":"BabyElephantWalk60.wav",
        "contentUrl":"data:audio/wav;base64,UklGRvAEAgBXQVZFZm10IBAA
    }
}

客户端,即 iOS 应用程序将使用 Directline Api https://directline.botframework.com/v3/directline/conversations/EdWGs8IdmjNIy5j2E93EHW-a/activities发送活动。

iOS 应用程序正在使用语音工具包。

在提示时,无论用户说什么,消息及其音频文件都将通过上述请求正文中的直接线路发送给机器人。并且,这将使用麦克风按钮完成。

有可能这样做吗?

标签: pythonjsonbotframeworkattachmentazure-bot-service

解决方案


您似乎将其视为机器人问题,而​​实际上它更像是客户问题。您的机器人只能响应它收到的活动,因此如果客户端从不发送包含音频和文本的活动,您的机器人将无法处理包含音频和文本的活动。由于您使用的是自己的 Direct Line 客户端,因此由您决定是否允许您的客户端发送此类活动。由于音频文件通常非常大,我建议上传文件而不是在附件中放置数据 URL。

通常,用户会在不同的轮次中将附件和文本作为单独的活动发送。该机器人将通过跟踪对话的状态来处理这些单独回合的数据,它可能是一个瀑布对话。听起来您不想这样做,因为文本和附件在您的情况下实际上是相同的数据。

在机器人端,您可以根据需要在任何对话框之外访问活动的文本和附件。您还可以在任何提示之后直接访问瀑布步骤中的活动,因为步骤上下文包含包含该活动的转弯上下文。

text = step_context.context.activity.text
attachments = step_context.context.activity.attachments

您可以使用文本提示或附件提示来执行此操作。如果您希望能够访问 中的这些内容step_context.result,您可以制作自己的提示,将整个活动放入结果中。您可以将ActivityPrompt其用作基类,因为它是为此目的而制作的。

除了发送单独的活动之外,在同一活动中发送文本和音频的另一种替代方法是仅发送音频并让机器人使用认知语音服务将音频转换为文本。这可能并不理想,因为您的客户端将无法显示文本,因为它最终没有进行转换。我假设您让用户使用麦克风提供音频输入,然后将其转换为文本,而不是让用户输入文本然后将其转换为音频。

Direct Line Speech是一种利用认知语音服务的内置方式,因此您的客户端和机器人都可以访问文本。根据您的需要,您可以考虑查看网络聊天语音


推荐阅读