Uso de Direct Line Speech en el bot

SE APLICA A: SDK v4

Direct Line Speech usa una nueva funcionalidad de streaming basada en WebSocket de Bot Framework para intercambiar mensajes entre el canal de Direct Line Speech y el bot. Después de habilitar el canal de Direct Line Speech en Azure Portal, deberás actualizar el bot para escuchar y aceptar estas conexiones de WebSocket. Estas instrucciones explican cómo hacerlo.

Actualice a la versión más reciente del SDK

Para Direct Line Speech, asegúrate de que usas la última versión del SDK Bot Builder.

Actualizar el bot de .NET Core si usa AddBot y UseBotFramework

Si has creado un bot con una versión v4 de Bot Builder SDK anterior a la versión 4.3.2, es probable que el bot no incluya un elemento BotController, sino que use los métodos AddBot() y UseBotFramework() en el archivo Startup.cs para exponer el punto de conexión POST en el que el bot recibe los mensajes. Para exponer el nuevo punto de conexión de streaming, deberás agregar un elemento BotController y quitar los métodos AddBot() y UseBotFramework(). Estas instrucciones le guiarán en los cambios que deben realizarse. Si ya tiene estos cambios, continúe con el paso siguiente.

Agregue un nuevo controlador MVC al proyecto del bot mediante la adición de un archivo llamado BotController.cs. Agregue el código del controlador a este archivo:

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

En el archivo Startup.cs, busque el método Configure. Elimine la línea de UseBotFramework() y asegúrese de que tiene estas líneas para UseWebSockets:

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

También en el archivo Startup.cs, busque el método ConfigureServices. Elimine la línea de AddBot() y asegúrese de que tiene líneas para agregar el elemento IBot y un elemento 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>();
}

El resto del código del bot sigue siendo el mismo.

Asegurarse de que los WebSockets están habilitados

Cuando se crea un nuevo bot desde Azure Portal mediante una de las plantillas, como EchoBot, obtendrás un bot que incluye un controlador MVC de ASP.NET que expone un punto de conexión GET y POST único y que también utilizará WebSockets. En estas instrucciones se explica cómo agregar estos elementos al bot si lo actualizas o no usas una plantilla.

Abra BotController.cs en la carpeta Controllers de la solución.

Busque el método PostAsync de la clase y actualice su decoración de [HttpPost] a [HttpPost, HttpGet]:

[HttpPost, HttpGet]
public async Task PostAsync()
{
    await _adapter.ProcessAsync(Request, Response, _bot);
}

Guarde y cierre BotController.cs

Abra Startup.cs en la carpeta raíz de la solución.

En Startup.cs, vaya a la parte inferior del método Configure. Antes de la llamada a app.UseMvc(), agregue una llamada a app.UseWebSockets(). Esto es importante, ya que el orden de estas llamadas a use importa. El final del método debería parecerse al siguiente:

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

El resto del código del bot sigue siendo el mismo.

Opcionalmente, establece el campo Hablar en las actividades

De forma predeterminada, se hablarán todos los mensajes enviados mediante Direct Line Speech al usuario.

Opcionalmente, puede personalizar cómo se habla el mensaje estableciendo el campo Speak de cualquier actividad enviada desde el 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;
}

En el fragmento de código siguiente se muestra cómo usar la función Speak anterior:

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    await turnContext.SendActivityAsync(Speak($"Echo: {turnContext.Activity.Text}"), cancellationToken);
}

Información adicional