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);
我需要让 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);