在机器人中使用 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() 行,并确保提供用于添加 IBotBotFrameworkHttpAdapter 的行:

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);
}

其他信息