Использование канала Direct Line Speech в боте

ОБЛАСТЬ ПРИМЕНЕНИЯ: ПАКЕТ SDK версии 4

Direct Line Speech использует новую возможность потоковой передачи на основе WebSocket, которую предоставляет Bot Framework, чтобы организовать обмен сообщениями между каналом Direct Line Speech и ботом. После включения канала "Речь Direct Line" в портал Azure необходимо обновить бота, чтобы прослушивать и принимать эти подключения WebSocket. Здесь мы приводим инструкции, как это сделать.

Обновление пакета SDK до последней версии

Для распознавания речи Direct Line убедитесь, что вы используете последнюю версию пакета SDK Bot Builder.

Обновите бот .NET Core, если он использует AddBot и UseBotFramework

Если вы создали бот с помощью пакета SDK Bot Builder версии 4 до версии 4.3.2, бот, скорее всего, не включает BotController, но вместо этого использует методы AddBot() и UseBotFramework() в файле Startup.cs для предоставления конечной точки POST, в которой бот получает сообщения. Чтобы предоставить новую конечную точку потоковой передачи, необходимо добавить BotController и удалить методы AddBot() и UseBotFramework(). Здесь представлены инструкции по внесению таких изменений. Если вы уже внесли эти изменения, перейдите к следующему шагу.

Добавьте в проект бота новый контроллер MVC, добавив файл с именем BotController.cs. Добавьте в этот файл код контроллера:

[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, вы получите бот, который включает в себя контроллер MVC ASP.NET, предоставляющий конечную точку GET и POST, а также будет использовать WebSockets. В этих инструкциях объясняется, как добавить эти элементы в бот при обновлении или не использовать шаблон.

Откройте BotController.cs в папке Controllers для своего решения.

Найдите в классе метод 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 Speech.

По желанию вы можете настроить режим озвучки сообщений, установив флажок 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);
}

Дополнительные сведения