ボットで Direct Line Speech を使用する

この記事の対象: SDK v4

Direct Line Speech では、Direct Line Speech チャネルとボットの間のメッセージ交換に、Bot Framework の新しい WebSocket をベースにしたストリーミング機能が使用されます。 Azure portal で Direct Line Speech チャネルを有効にした後、これらの WebSocket 接続をリッスンし、受け入れるように、ご自身のボットを更新する必要があります。 これらの手順ではその方法を説明します。

最新バージョンの SDK にアップグレードする

Direct Line Speech の場合は、Bot Builder SDK の最新バージョンを使用していることを確認します。

AddBot と UseBotFramework を使用している場合は、.NET Core ボットを更新する

バージョン 4.3.2 よりも前の Bot Builder SDK 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 が有効になっていることを確認する

EchoBot などのテンプレートのいずれかを使用して、Azure portal から新しいボットを作成する場合、GET と POST エンドポイントを公開し、WebSocket も使用する ASP.NET MVC コントローラーが含まれるボットが表示されます。 次の手順では、アップグレードする場合、またはテンプレートを使用しなかった場合に、これらの要素をボットに追加する方法を説明します。

ご自身のソリューションで、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();
    ...
}

ご自身のボット コードの残りの部分は同じままです。

必要に応じて、アクティビティの Speak フィールドを設定する

既定では、ユーザーに Direct Line Speech を介して送信されるすべてのメッセージが読み上げられます。

必要に応じて、ボットから送信されたアクティビティの [読み上げ] フィールドを設定することによって、メッセージの読み上げ方法をカスタマイズできます。

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

追加情報