Bot Framework: respondendo por áudio
No seguinte artigo, o autor apresenta o Bot Framework e mostra como usar respostas de áudio.

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↳.NET113 conteúdosNovidades do .NET 9 – o tipo genérico OrderedDictionaryDev (Back & Front) · dez 2024Novidades .NET 10: novas formas de uso do .NET CLIDev (Back & Front) · dez 2025Novidades do .NET 5: implementando um proxy reverso com YARP + ASP.NET 5Dev (Back & Front) · nov 2020Ver tudo em Dev (Back & Front) → Framework. Para isso, siga os passos abaixo:
- Faça Download dos arquivos Bot Application, Bot Controller, e Bot Dialog .zip.
- 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#\.
- 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.

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:

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↳Banco de dados134 conteúdosSQL ou NoSQL: eis a questão!!Data · mar 2020Banco de dados: como organizar e dar segurança para milhões de dados de loteriasData · mai 20215 serviços gratuitos na cloud para bancos de dados PostgresData · fev 2025Ver tudo em Data → 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!







