在机器人中使用 Direct Line 语音
适用于:SDK v4
Direct Line 语音使用 Bot Framework 的一项新的基于 WebSocket 的流式处理功能,在 Direct Line 语音通道和机器人之间交换消息。 在 Azure 门户中启用 Direct Line Speech 通道后,需要更新机器人,使之侦听并接受这些 WebSocket 连接。 以下说明介绍如何执行该操作。
升级到最新版本的 SDK
对于 Direct Line Speech,请确保使用最新版本的 Bot Builder SDK。
如果 .NET Core 机器人使用 AddBot 和 UseBotFramework,请对其进行更新
如果在使用 Bot Builder SDK 4.3.2 版本之前使用了 v4 版,则机器人可能不包含 BotController,但会使用 Startup.cs 文件中的 AddBot() 和 UseBotFramework() 方法来公开 POST 终结点(机器人在其中接收消息)。 若要公开新的流式处理终结点,需要添加 BotController 并删除 AddBot() 和 UseBotFramework() 方法。 以下说明详细介绍了需要进行的更改。 如果已做出这些更改,请继续执行下一步。
通过添加名为 BotController.cs 的文件,向机器人项目添加新的 MVC 控制器。 向以下文件添加控制器代码:
[Route("api/messages")]
[ApiController]
public class BotController : ControllerBase
{
private readonly IBotFrameworkHttpAdapter _adapter;
private readonly IBot _bot;
public BotController(IBotFrameworkHttpAdapter adapter, IBot bot)
{
_adapter = adapter;
_bot = bot;
}
[HttpPost, HttpGet]
public async Task ProcessMessageAsync()
{
await _adapter.ProcessAsync(Request, Response, _bot);
}
}
在 Startup.cs 文件中,找到 Configure 方法。 删除 UseBotFramework()
行,并确保将以下行添加到 UseWebSockets
:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseWebSockets();
app.UseMvc();
...
}
另外,也是在 Startup.cs 文件中,找到 ConfigureServices 方法。 删除 AddBot()
行,并确保提供用于添加 IBot
和 BotFrameworkHttpAdapter
的行:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSingleton<ICredentialProvider, ConfigurationCredentialProvider>();
services.AddSingleton<IChannelProvider, ConfigurationChannelProvider>();
// Create the Bot Framework Adapter.
services.AddSingleton<IBotFrameworkHttpAdapter, BotFrameworkHttpAdapter>();
// Create the bot as a transient. In this case the ASP Controller is expecting an IBot.
services.AddTransient<IBot, EchoBot>();
}
机器人代码的余下部分保持不变!
确保启用 WebSocket
在 Azure 门户中使用某个模板(例如 EchoBot)创建新的机器人时,会得到一个包含 ASP.NET MVC 控制器的机器人,该控制器公开单个 GET 和 POST 终结点,并且也会使用 WebSocket。 如果你要升级,或者不使用模板,请参阅以下说明来了解如何将这些元素添加到机器人。
打开解决方案中 Controllers 文件夹下的 BotController.cs。
在类中找到 PostAsync
方法,将其修饰从 [HttpPost] 更新为 [HttpPost, HttpGet]:
[HttpPost, HttpGet]
public async Task PostAsync()
{
await _adapter.ProcessAsync(Request, Response, _bot);
}
保存并关闭 BotController.cs
在解决方案的根目录中打开 Startup.cs。
在 Startup.cs 中,导航到 Configure 方法的底部。 在 app.UseMvc()
调用的前面添加 app.UseWebSockets()
调用。 这非常重要,因为这些 use 调用的顺序很重要。 方法的末尾应如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseWebSockets();
app.UseMvc();
...
}
机器人代码的余下部分保持不变!
可选择在活动上设置朗读字段
默认情况下,将会讲出通过 Direct Line 语音发送给用户的所有消息。
可以选择性地通过设置从机器人发送的任何活动的 Speak 字段,来自定义消息的讲出方式:
public IActivity Speak(string message)
{
var activity = MessageFactory.Text(message);
string body = @"<speak version='1.0' xmlns='https://www.w3.org/2001/10/synthesis' xml:lang='en-US'>
<voice name='Microsoft Server Speech Text to Speech Voice (en-US, JessaRUS)'>" +
$"{message}" + "</voice></speak>";
activity.Speak = body;
return activity;
}
以下代码片段显示如何使用前面的 Speak
函数:
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
await turnContext.SendActivityAsync(Speak($"Echo: {turnContext.Activity.Text}"), cancellationToken);
}
其他信息
有关创建和使用支持语音的机器人的完整示例,请参阅教程:使用语音 SDK 为机器人启用语音。
要详细了解如何使用活动,请参阅机器人工作原理和如何发送和接收文本消息。