【问题标题】:Bot Framework: Enable PromptDialog.Text to be spoken by cortanaBot Framework:启用 Cortana 朗读 PromptDialog.Text
【发布时间】:2018-06-04 11:42:21
【问题描述】:

我需要让 Cortana 阅读我的所有提示,到目前为止,我设法让它说出如下示例中的简单短语:

[LuisIntent("Thanks")]
public async Task Thanks(IDialogContext context, IAwaitable<IMessageActivity> activity, LuisResult result)
{

    await context.SayAsync(text: Phrases.YOURE_WELCOME, speak: Phrases.YOURE_WELCOME);
    context.Wait(this.MessageReceived);

}

但我不能在 PromptDialogs.Text 上执行此操作 我有这个代码:

private async Task OnCustomerSet(IDialogContext context, IAwaitable<string> result)
{

    string name = await result;
    PromptDialog.Text(context, OnNIFSet, Phrases.ASK_CUSTOMER_NIF);

}

如何让 Cortana 也说出这个提示?

谢谢。

【问题讨论】:

  • 在浏览完 SDK 之后,必须对 SDK 本身进行更改才能使其正常工作。这一定是设计提示时的疏忽。不会有一个简单的解决方案。您可以尝试覆盖 PromptChoice.text 以使其接受 PromptOptions 但这很快就会变得混乱。您可以在发送提示之前尝试发送context.SayAsync。这是一个完全的黑客,但它可能对你有用。
  • 是的,我试过了,它不起作用,因为该短语显示了两次,如果我离开它“”或 null 它显示一个 0,最后在模拟器上,还没有尝试查看它在 Cortana 中显示的内容。
  • 我在Cortana测试的时候好像只显示过一次,但不是很精细的测试
  • 我一直在尝试在提示之前发送一个 context.SayAsync 但 Cortana 没有阅读它,事实上它似乎只是跳过了 SayAsync,因为它甚至不显示文本。
  • 我设法通过两次使用 context.SayAsync 来做到这一点,Cortana 似乎忽略了提示之前的那个。

标签: c# azure botframework cortana


【解决方案1】:

更新:我已提交pull request 以将其添加到 C# SDK 中,并且在下一个版本中它将成为 bot.builder 包的一部分。当前版本是 3.15.2.2(在撰写本文时),所以任何高于它的版本都应该有它。它将在 SDK 中,因此您不必在此答案中使用该方法。

在对此进行深入研究后,我能够提出一个无需更改 SDK 即可工作的解决方案,并且我已经确认这已经在开箱即用的节点中工作。我仍会在拉取请求中添加更改,但这应该对您有所帮助。

您可以创建一个继承自 PromptDialog 的类,并为 PromptDialog.text 创建一个构造函数,如下所示:

public class PromptDialogTextSpeak:PromptDialog
{
    public static void Text(IDialogContext context, ResumeAfter<string> resume, IPromptOptions<string> promptOptions)
    {
        var child = new PromptString(promptOptions);
        context.Call<string>(child, resume);
    }
}

我可以通过一个简单的提示来完成这项工作,例如:

 var text = "this is a prompt";
PromptOptions<string> qwerty = new PromptOptions<string>(text, speak: text);
PromptDialogTextSpeak.Text(context, AfterPrompt, qwerty);

【讨论】:

    【解决方案2】:

    您可以在提示选项中添加一个 speak 属性,并使用 SSML Helper 读出提示对话框。

    var promptOptions = new PromptOptions<string>(
                    Resources.ChooseSides,
                    choices: choices,
                    descriptions: descriptions,
                    speak: SSMLHelper.Speak(Utils.RandomPick(Resources.ChooseSidesSSML))); // spoken prompt
    
    PromptDialog.Choice(context, this.DiceChoiceReceivedAsync, promptOptions);
    

    详情请参考docGitHub Sample。 如果您需要其他帮助,请询问;)

    【讨论】:

    • 但该解决方案仅适用于 PromptDialog.Choice 和 PromptDialog.Confirm。 PromptDialog.Text 不接受 PromptOptions 作为参数。
    • 对不起,我错过了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2020-07-03
    • 2018-03-06
    • 1970-01-01
    相关资源
    最近更新 更多