Desenvolvimento

11 abr, 2018

Bot Framework: respondendo por áudio

Publicidade
Bot Framework

Faz algum tempo que eu estou estudando o Bot Framework da Microsoft. Tive a oportunidade de implementar ele na empresa onde eu trabalho e avançar um pouco mais nas noites de insônia. Meu intuito é sair um pouco do chat por respostas de texto.

Para quem ainda não conhece o Bot Framework da Microsoft, eu recomendo que dedique alguns minutos e navegue pelo site Bot Service Documentation – lá você pode encontrar tudo sobre essa ferramenta.

Configuração

O primeiro passo será criar um Bot utilizando o .NET Framework. Para isso, siga os passos abaixo:

  1. Faça Download dos arquivos Bot Application, Bot Controller, e Bot Dialog .zip.
  2. Copie os arquivos para o diretório de templates do seu Visual Studio. Caso não saiba onde eles ficam, segue o  caminho: “seu usuário”\Documents\Visual Studio 2017\Templates\ProjectTemplates\Visual C#\.
  3. Crie um novo projeto Bot Application. Para isso, vá em em file > new  > project > Visual C# e clique em Bot Application. Para esse artigo, chamarei ele de Joaozinho.
Criando um novo projeto Bot Framework

Para testar o nosso bot, será necessário baixar o Bot Framework Emulator, ele foi desenvolvido para testar o Bot Framework. Esse emulador pode ser encontrado neste link. Depois que você finalizar a sua instalação, execute o seu projeto no Visual Studio e adicione a URL do seu projeto no Bot Emulator e clique em connect. Você pode ver esse passo na imagem abaixo:

Bot Emulator

Para validar se tudo está OK, digite uma mensagem para o seu BOT e verifique nos logs da lateral se aparece algum erro. Abaixo você pode ver uma imagem com esse passo:

Implementação

O passo anterior foi simples, nele nós configuramos o ambiente e executamos o projeto. Agora, para que você possa ter um melhor entendimento, vamos implementar um código para que o nosso Bot responda as capitais dos estados brasileiros, e para isso, precisaremos atualizar o nosso código com os passos abaixo:

Crie um diretório chamado models e dentro dele um arquivo chamado Estado.cs, e em seguida atualize ele com o seguinte trecho de código:

Estados.cs (classe com os estados e capitais do Brasil)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Joaozinho.Models
{
    public class Estado
    {

        private string Nome { get; set; }
        private string Capital { get; set; }
        private static IList<Estado> _estados { get; set; }

        public static string VerificarCapital(string estado)
        {
            #region [Estados]          
            _estados = new List<Estado>
            {
                new Estado
                {
                    Nome = "Acre",
                    Capital = "Rio Branco"
                },
                 new Estado
                {
                    Nome = "Alagoas",
                    Capital = "Maceió"
                },
                 new Estado
                {
                    Nome = "Amapá",
                    Capital = "Macapá"
                },
                 new Estado
                {
                    Nome = "Amazonas",
                    Capital = "Manaus"
                },
                 new Estado
                {
                    Nome = "Bahia",
                    Capital = "Salvador"
                },
                 new Estado
                {
                    Nome = "Ceará",
                    Capital = "Fortaleza"
                },
                 new Estado
                {
                    Nome = "Distrito Federal",
                    Capital = "Brasília"
                },
                 new Estado
                {
                    Nome = "Espírito Santo",
                    Capital = "Vitória"
                },
                 new Estado
                {
                    Nome = "Goiás",
                    Capital = "Goiânia"
                },
                 new Estado
                {
                    Nome = "Maranhão",
                    Capital = "São Luís"
                },
                 new Estado
                {
                    Nome = "Mato Grosso",
                    Capital = "Cuiabá"
                },
                 new Estado
                {
                    Nome = "Mato Grosso do Sul",
                    Capital = "Campo Grande"
                },
                 new Estado
                {
                    Nome = "Minas Gerais",
                    Capital = "Belo Horizonte"
                },
                 new Estado
                {
                    Nome = "Pará",
                    Capital = "Belém"
                },
                 new Estado
                {
                    Nome = "Paraíba",
                    Capital = "João Pessoa"
                },
                 new Estado
                {
                    Nome = "Paraná",
                    Capital = "Curitiba"
                },
                 new Estado
                {
                    Nome = "Pernambuco",
                    Capital = "Recife"
                },
                 new Estado
                {
                    Nome = "Piauí",
                    Capital = "Teresina"
                },
                 new Estado
                {
                    Nome = "Rio de Janeiro",
                    Capital = "Rio de Janeiro"
                },
                 new Estado
                {
                    Nome = "Rio Grande do Norte",
                    Capital = "Natal"
                },
                 new Estado
                {
                    Nome = "Rio Grande do Sul",
                    Capital = "Porto Alegre"
                },
                 new Estado
                {
                    Nome = "Rondônia",
                    Capital = "Porto Velho"
                },
                 new Estado
                {
                    Nome = "Roraima",
                    Capital = "Boa Vista"
                },
                 new Estado
                {
                    Nome = "Santa Catarina",
                    Capital = "Florianópolis"
                },
                 new Estado
                {
                    Nome = "São Paulo",
                    Capital = "São Paulo"
                },
                 new Estado
                {
                    Nome = "Sergipe",
                    Capital = "Aracaju"
                },
                 new Estado
                {
                    Nome = "Tocantins",
                    Capital = "Palmas"
                }
            };
            #endregion

            var c = _estados.FirstOrDefault(x => x.Nome == estado);

            return c.Capital;
        }
    }
}

Os dados acima foram retirados do site: Sua Pesquisa. Eu criei a classe acima somente para que possamos ter os dados rápido sem precisar de um banco de dados ou consultar uma API. Em um cenário real, esse não seria uma das melhores soluções, mas para o nosso teste irá funcionar perfeitamente.

Agora abra a sua classe RootDialog e atualize ela com o seguinte trecho de código:

using System;
using System.Threading.Tasks;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using System.Speech.Synthesis;
using System.IO;
using System.Web;
using NAudio.Lame;
using NAudio.Wave;
using System.Diagnostics;
using System.Text.RegularExpressions;
using Joaozinho.Models;

namespace Joaozinho.Dialogs
{
    [Serializable]
    public class RootDialog : IDialog<object>
    {
        public Task StartAsync(IDialogContext context)
        {
            context.Wait(MessageReceivedAsync);

            return Task.CompletedTask;
        }

        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
        {
            var activity = await result as Activity;

            var capital = Estado.VerificarCapital(activity.Text);

            if (!String.IsNullOrEmpty(capital))
            {
                var reply = activity.CreateReply();

                Attachment attachment = new Attachment();
                attachment.ContentType = "audio/mpeg3";
                attachment.ContentUrl = @"http://localhost:3979/audios/" + RemoveSpecialChars(capital) + ".mp3";
                attachment.Name = "A capital de " + activity.Text + " é ";
                reply.Attachments.Add(attachment);
                await context.PostAsync(reply);

            }
            else
            {
                await context.PostAsync("Nenhuma capital encontrada para: " + activity.Text);
            }


            context.Wait(MessageReceivedAsync);


        }

        public static string RemoveSpecialChars(string input)
        {
            return Regex.Replace(input, @"[^0-9a-zA-Z\._]", string.Empty);
        }

    }


}

No trecho de código acima, nós temos: um pesquisa na nossa classe Estado.cs para verificar se o estado existe, depois criamos um Attachment para retornar um texto com link para um arquivo de áudio com a capital do estado pesquisado. Abaixo, você tem um vídeo com o resultado final da nossa implementação:

Caso você tenha interesse em baixar o projeto desenvolvido nesse artigo, segue o seu link no GitHub: Joaozinho.

Bom, o intuito desse artigo foi demonstrar que podemos explorar outras funcionalidades do Bot Framework, espero que tenham gostado e até um próximo artigo!