봇에서 Direct Line Speech 사용Use Direct Line Speech in your bot

적용 대상: SDK v4APPLIES TO: SDK v4

Direct Line Speech는 Bot Framework의 새로운 WebSocket 기반 스트리밍 기능을 사용하여 Direct Line Speech 채널과 봇 사이에 메시지를 교환합니다.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. Azure Portal에서 Direct Line Speech 채널을 활성화한 후 봇을 수신 대기하고 이 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. 이 지침은 이 작업을 수행하는 방법을 설명합니다.These instructions explain how to do this.

1단계: 최신 버전의 SDK로 업그레이드Step 1: Upgrade to the latest version of the SDK

Direct Line Speech의 경우 최신 버전의 Bot Builder SDK를 사용하고 있는지 확인합니다.For Direct Line Speech ensure you are using the latest version of Bot Builder SDK.

2단계: 봇에서 BotController 대신 AddBot 및 UseBotFramework를 사용하는 경우 .NET Core 봇 코드 업데이트Step 2: Update your .NET Core bot code if your bot uses AddBot and UseBotFramework instead of a BotController

버전 4.3.2 이전의 Bot Builder SDK v4를 사용하여 봇을 만든 경우 해당 봇은 BotController를 포함하지 않는 대신 Startup.cs 파일에 AddBot() 및 UseBotFramework() 메서드를 사용하여 봇이 메시지를 수신하는 POST 엔드포인트를 표시할 가능성이 있습니다.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. 새 스트리밍 엔드포인트를 표시하려면 BotController를 추가하고 AddBot() 및 UseBotFramework() 메서드를 제거해야 합니다.To expose the new streaming endpoint, you will need to add a BotController and remove the AddBot() and UseBotFramework() methods. 이 지침은 수행해야 할 변경을 단계별로 안내합니다.These instructions walk through the changes that need to be made. 이러한 변경이 이미 있는 경우 다음 단계로 계속 진행하세요.If you already have these changes, continue to the next step.

BotController.cs라는 파일을 추가하여 새 MVC 컨트롤러를 봇 프로젝트에 추가합니다.Add a new MVC controller to your bot project by adding a file called BotController.cs. 이 파일에 컨트롤러 코드를 추가합니다.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);
    }
}

Startup.cs 파일에서 Configure 메서드를 찾습니다.In the Startup.cs file, locate the Configure method. UseBotFramework() 줄을 제거하고, 다음 줄이 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();
    ...
}

역시 Startup.cs 파일에서 ConfigureServices 메서드를 찾습니다.Also in the Startup.cs file, locate the ConfigureServices method. AddBot() 줄을 제거하고, IBotBotFrameworkHttpAdapter를 추가할 줄이 있는지 확인합니다.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>();
}

봇 코드의 나머지 부분은 동일하게 유지됩니다!The remainder of your bot code stays the same!

3단계: WebSockets를 사용하도록 설정되어 있는지 확인Step3: Ensure WebSockets are enabled

템플릿(예: EchoBot) 중 하나를 사용하여 Azure Portal에서 새 봇을 만들면 GET 및 POST 엔드포인트를 공개하고 WebSockets도 사용하는 ASP.NET MVC 컨트롤러가 포함된 봇을 얻습니다.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. 다음 지침에서는 업그레이드하고 있거나 템플릿에서 봇을 만들지 않은 경우 이러한 요소를 봇에 추가하는 방법에 대해 설명합니다.These instructions explain how to add these elements to your bot if you are upgrading or did not make your bot from a template.

솔루션의 Controllers 폴더 아래에서 BotController.cs 를 엽니다.Open BotController.cs under the Controllers folder in your solution

클래스에서 PostAsync 메서드를 찾고, 해당 메서드의 장식을 [HttpPost]에서 [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);
}

BotController.cs를 저장한 후 닫습니다.Save and close BotController.cs

솔루션의 루트에서 Startup.cs 를 엽니다.Open Startup.cs in the root of your solution.

Startup.cs에서 Configure 메서드의 아래쪽으로 이동합니다.In Startup.cs, navigate to the bottom of the Configure method. app.UseWebSockets()\에 대한 호출을  app.UseMvc()\에 대한 호출 앞에 추가합니다.Before the call to app.UseMvc(), add a call to app.UseWebSockets(). 이러한 사용 호출의 순서에 따라 문제가 발생할 수 있으므로 이 순서는 중요합니다.This is important as the order of these use calls matters. 메서드의 끝이 다음과 같아야 합니다.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();
    ...
}

봇 코드의 나머지 부분은 동일하게 유지됩니다!The remainder of your bot code stays the same!

4단계: 필요에 따라 활동에서 Speak(말하기) 필드를 설정하여 사용자에게 말하는 항목 사용자 지정Step 4: Optionally set the Speak field on Activities to customize what is spoken to the user

기본적으로 Direct Line Speech를 통해 사용자에게 보낸 모든 메시지가 음성으로 전달됩니다.By default, all messages sent through Direct Line Speech to the user will be spoken.

필요에 따라 봇에서 보낸 Activity(활동)의 Speak 필드를 설정하여 메시지를 음성으로 전달하는 방법을 사용자 지정할 수 있습니다.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;
}

다음 코드 조각에서는 이전 Speak 함수를 사용하는 방법을 보여 줍니다.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);
}

추가 정보Additional information