Uso de Direct Line Speech en el botUse Direct Line Speech in your bot

se aplica a: SDK V4APPLIES TO: 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.Direct Line Speech uses a new WebSocket based streaming capability of Bot Framework to exchange messages between the Direct Line Speech channel and your bot. Después de habilitar el canal de Direct Line Speech en Azure Portal, deberá actualizar el bot para escuchar y aceptar estas conexiones de WebSocket.After enabling the Direct Line Speech channel in the Azure Portal, you will need to update your bot to listen for and accept these WebSocket connections. Estas instrucciones explican cómo hacerlo.These instructions explain how to do this.

Paso 1: Actualice a la versión más reciente del SDKStep 1: Upgrade to the latest version of the SDK

Para Direct Line Speech, asegúrese de que usa la última versión del SDK Bot Builder.For Direct Line Speech ensure you are using the latest version of Bot Builder SDK.

Paso 2: Actualice el código del bot de .NET Core si el bot usa AddBot y UseBotFramework en lugar de un elemento BotController.Step 2: Update your .NET Core bot code if your bot uses AddBot and UseBotFramework instead of a BotController

Si ha 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.If you have created a bot using v4 of the Bot Builder SDK prior to version 4.3.2, your bot likely does not include a BotController but instead uses the AddBot() and UseBotFramework() methods in the Startup.cs file to expose the POST endpoint where the bot receives messages. Para exponer el nuevo punto de conexión de streaming, deberá agregar un elemento BotController y quitar los métodos AddBot() y UseBotFramework().To expose the new streaming endpoint, you will need to add a BotController and remove the AddBot() and UseBotFramework() methods. Estas instrucciones le guiarán en los cambios que deben realizarse.These instructions walk through the changes that need to be made. Si ya tiene estos cambios, continúe con el paso siguiente.If you already have these changes, continue to the next step.

Agregue un nuevo controlador MVC al proyecto del bot mediante la adición de un archivo llamado BotController.cs.Add a new MVC controller to your bot project by adding a file called BotController.cs. Agregue el código del controlador a este archivo:Add the controller code to this file:


[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.In the Startup.cs file, locate the Configure method. Elimine la línea de UseBotFramework() y asegúrese de que tiene estas líneas para UseWebSockets:Remove the UseBotFramework() line and make sure you have these lines to 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.Also in the Startup.cs file, locate the ConfigureServices method. Elimine la línea de AddBot() y asegúrese de que tiene líneas para agregar el elemento IBot y un elemento BotFrameworkHttpAdapter:Remove the AddBot() line and make sure you have lines for adding your IBot and a 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.The remainder of your bot code stays the same!

Paso 3: Asegurarse de que los WebSockets están habilitadosStep3: Ensure WebSockets are enabled

Cuando se crea un nuevo bot desde Azure Portal mediante una de las plantillas, como EchoBot, obtendrá 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.When you create a new bot from the Azure Portal using one of the templates such as EchoBot, you will get a bot that includes an ASP.NET MVC controller that exposes a GET and POST endpoint and will also use WebSockets. En estas instrucciones se explica cómo agregar estos elementos al bot si lo está actualizando o si no creó el bot a partir de una plantilla.These instructions explain how to add these elements to your bot if you are upgrading or did not make your bot from a template.

Abra BotController.cs en la carpeta Controllers de la solución.Open BotController.cs under the Controllers folder in your solution

Busque el método PostAsync de la clase y actualice su decoración de [HttpPost] a [HttpPost, HttpGet]:Find the PostAsync method in the class and update its decoration from [HttpPost] to [HttpPost, HttpGet]:


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

Guarde y cierre BotController.csSave and close BotController.cs

Abra Startup.cs en la carpeta raíz de la solución.Open Startup.cs in the root of your solution.

En Startup.cs, vaya a la parte inferior del método Configure.In Startup.cs, navigate to the bottom of the Configure method. Antes de la llamada a  app.UseMvc(), agregue una llamada a  app.UseWebSockets().Before the call to app.UseMvc(), add a call to app.UseWebSockets(). Esto es importante, ya que el orden de estas llamadas a use importa.This is important as the order of these use calls matters. El final del método debería parecerse al siguiente:The end of the method should look something like this:

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.The remainder of your bot code stays the same!

Paso 4: Opcionalmente, puede establecer el campo Speak en Activities para personalizar lo que se habla al usuario.Step 4: Optionally set the Speak field on Activities to customize what is spoken to the user

De forma predeterminada, se hablarán todos los mensajes enviados mediante Direct Line Speech al usuario.By default, all messages sent through Direct Line Speech to the user will be spoken.

Opcionalmente, puede personalizar cómo se habla el mensaje estableciendo el campo Speak de cualquier actividad enviada desde el bot:You can optionally customize how the message is spoken by setting the Speak field of any Activity sent from the 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:The following snippet shows how to use the previous Speak function:


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

Información adicionalAdditional information