Bot Framework:启用 PromptDialog.Text 由 cortana 说出

Bot Framework: Enable PromptDialog.Text to be spoken by cortana

我需要让 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 也说出这个提示?

谢谢。

您可以在提示选项中添加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);

请参考doc for the details and the GitHub Sample。 如果您需要其他帮助,请询问 ;)

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

在深入研究之后,我想出了一个无需更改 SDK 即可运行的解决方案,并且我已经确认它已经在开箱即用的节点中运行。我仍会在拉取请求中添加更改,但这暂时对您有帮助。

你可以创建一个继承自 PromptDialog 的 class 并为 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);