在 Bot 中使用 Direct Line Speech

適用于: SDK v4

Direct Line Speech 使用 Bot Framework 的新 WebSocket 型串流功能,在 Direct Line Speech 通道與 Bot 之間交換訊息。 在Azure 入口網站中啟用 Direct Line Speech 通道之後,您必須更新 Bot 以接聽並接受這些 WebSocket 連線。 這些指示說明如何執行這項操作。

升級至最新版本的 SDK

針對 Direct Line Speech,請確定您使用的是最新版的 Bot Builder SDK。

如果使用 AddBot 和 UseBotFramework,請更新 .NET Core Bot

如果您在 4.3.2 版之前使用 Bot Builder SDK v4 建立 Bot,您的 Bot 可能不包含 BotController,而是使用 Startup.cs 檔案中的 AddBot() 和 UseBotFramework() 方法來公開 Bot 接收訊息的 POST 端點。 若要公開新的串流端點,您必須新增 BotController,並移除 AddBot() 和 UseBotFramework() 方法。 這些指示會逐步解說需要進行的變更。 如果您已經有這些變更,請繼續進行下一個步驟。

藉由新增名為 BotController.cs 的檔案,將新的 MVC 控制器新增至 Bot 專案。 將控制器程式碼新增至此檔案:

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

Bot 程式碼的其餘部分保持不變!

確定已啟用 WebSocket

當您使用 EchoBot 等其中一個範本從Azure 入口網站建立新的 Bot 時,您會收到一個 Bot,其中包含公開 GET 和 POST 端點的 ASP.NET MVC 控制器,也會使用 WebSockets。 這些指示說明當您升級或不使用範本時,如何將這些專案新增至 Bot。

開啟 解決方案中 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() 呼叫。 這很重要,因為這些使用呼叫的順序很重要。 方法的結尾看起來應該像這樣:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    app.UseDefaultFiles();
    app.UseStaticFiles();
    app.UseWebSockets();
    app.UseMvc();
    ...
}

Bot 程式碼的其餘部分保持不變!

選擇性地設定活動的 [說話] 欄位

根據預設,所有透過 Direct Line Speech 傳送給使用者的訊息都會說出。

您可以選擇性地自訂訊息的說話方式,方法是設定 Bot 所傳送任何活動的 [說話] 欄位:

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

其他資訊