Share via


Usare Direct Line Speech nel bot

SI APPLICA A: SDK v4

Direct Line Speech usa una nuova funzionalità di streaming di Bot Framework, basata su WebSocket, per lo scambio dei messaggi tra il canale Direct Line Speech e il bot. Dopo aver abilitato il canale Direct Line Speech nel portale di Azure, è necessario aggiornare il bot per ascoltare e accettare queste connessioni WebSocket. Queste istruzioni illustrano come eseguire questa operazione.

Eseguire l'aggiornamento alla versione più recente dell'SDK

Per Direct Line Speech, assicurarsi di usare la versione più recente di Bot Builder SDK.

Aggiornare il bot .NET Core se usa AddBot e UseBotFramework

Se è stato creato un bot usando la versione 4 di Bot Builder SDK prima della versione 4.3.2, il bot probabilmente non include botController, ma usa invece i metodi AddBot() e UseBotFramework() nel file Startup.cs per esporre l'endpoint POST in cui il bot riceve i messaggi. Per esporre il nuovo endpoint di streaming, è necessario aggiungere un BotController e rimuovere i metodi AddBot() e UseBotFramework(). Queste istruzioni descrivono in dettaglio le modifiche da apportare. Se queste modifiche sono già state apportate, continuare con il passaggio successivo.

Aggiungere un nuovo controller MVC al progetto bot aggiungendo un file denominato BotController.cs. Aggiungere il codice del controller a questo 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);
    }
}

Nel file Startup.cs individuare il metodo Configure. Rimuovere la riga UseBotFramework() e assicurarsi che siano presenti le righe seguenti per UseWebSockets:

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

Sempre nel file Startup.cs individuare il metodo ConfigureServices. Rimuovere la riga AddBot() e assicurarsi che siano presenti le righe per aggiungere IBot e 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>();
}

La parte restante del codice del bot rimane invariata.

Assicurarsi che i WebSocket siano abilitati

Quando si crea un nuovo bot dal portale di Azure usando uno dei modelli, ad esempio EchoBot, si otterrà un bot che include un controller MVC ASP.NET che espone un endpoint GET e POST e userà anche WebSocket. Queste istruzioni illustrano come aggiungere questi elementi al bot quando si esegue l'aggiornamento o non si usa un modello.

Aprire BotController.cs nella cartella Controllers della soluzione

Individuare il metodo PostAsync nella classe e aggiornarne l'elemento decoration da [HttpPost] a [HttpPost, HttpGet]:

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

Salvare e chiudere BotController.cs

Aprire Startup.cs nella radice della soluzione.

In Startup.cs passare alla parte finale del metodo Configure. Prima della chiamata a app.UseMvc(), aggiungere una chiamata a app.UseWebSockets(). Questo è rilevante perché l'ordine di queste chiamate a use è importante. La parte finale del metodo dovrebbe essere simile al codice seguente:

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

La parte restante del codice del bot rimane invariata.

Facoltativamente, impostare il campo Speak sulle attività

Per impostazione predefinita, verranno letti tutti i messaggi inviati all'utente tramite Direct Line Speech.

Facoltativamente, è possibile personalizzare la modalità di lettura del messaggio impostando il campo Leggi di qualsiasi attività inviata dal 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;
}

Il frammento di codice seguente illustra come usare la funzione precedente Speak :

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

Informazioni aggiuntive