Continuaremos na categoria de Fala dos Serviços Cognitivos da Azure, mostrando, agora, como converter fala em texto!
Como funciona a Conversão de Fala em Texto na Azure
Interfaces mais amigáveis, que respondem a fala do usuário, estão ganhando cada vez mais espaço no mundo. Construir seu produto com essa funcionalidade pode ser um diferencial competitivo interessante.
Assim como todos os Serviços Cognitivos, o Serviço para Converter Fala em Texto na Azure, também conta com as mesmas características de facilidade de implementação e uso, bem como deixa de lado a necessidade de conhecer toda a dificuldade por trás da inteligência artificial.
Há a possibilidade de se transcrever, com precisão e rapidez, para mais de 30 idiomas.
Vamos demonstrar como implementar essa funcionalidade ao longo do artigo.
Todo o código está disponível no github.
Então, vamos a mão na massa!
1. Tenha seu projeto
Criamos um projeto do tipo ASP.NET Core Web Application, com o template Web Application para ter o projeto criado voltado para o Razor Pages. Demos a ele o nome de AzureCognitiveServices. Confira no primeiro passo do primeiro artigo técnico da série e crie o seu projeto também.
Com o projeto criado e atualizado, procure a Solution Folder com nome de Speech, que é o nome da categoria que continuamos explorando.
Dentro dessa Solution Folder, crie um novo Projeto do tipo Class Library (.NET Core) e o nomeie como SpeechToText.
Até esse ponto, a estrutura do projeto deve ser a seguinte:
2. Configure a Azure
Crie uma conta gratuita no Azure e, logo após, crie um recurso para converter fala em texto, ou utilize o criado no artigo anterior (acesse a busca de recursos clicando aqui) e obtenha a chave e o endpoint do recurso, como na imagem a seguir.
3. Conecte a Conversão de Fala em Texto ao seu projeto
Voltando ao projeto no Visual Studio, vamos renomear o arquivo Class1.cs para algo mais palatável. Renomeio para TranscricaoDeFala.cs.
Abra o Package Manager Console e execute o seguinte comando para adicionar as bibliotecas do Serviço Cognitivo para Converter Fala em Texto ao projeto que chamamos de SpeechToText.
dotnet add .SpeechToText package Microsoft.CognitiveServices.Speech --version 1.12.1
Não esqueça, também, de conectar o projeto SpeechToText ao projeto AzureCognitiveServices clicando com o botão direito em cima do projeto AzureCognitiveServices e indo a opção Add > Reference…, depois adicionando o projeto SpeechToText. Assim o projeto AzureCognitiveServices conseguirá acessar o projeto SpeechToText consumir o que precisar.
4. Implemente a Conversão de Fala em Texto na classe TranscricaoDeFala.cs
Comece colocando todos os Usings necessários para o funcionamento correto da classe:
using Microsoft.CognitiveServices.Speech; using System; using System.Threading.Tasks;
Depois adicione as variáveis de instância que utilizaremos ao longo da classe:
namespace SpeechToText { public class TranscricaoDeFala { private const string _chave = \"<sua chave>\"; private const string _endpoint = \"<seu endpoint>\"; private readonly SpeechConfig _configuracaoDaTranscricao;
Lembre de substituir \"<sua chave>\"
e \"<seu endpoint>\"
pelos valores obtidos no passo 2. Configure a Azure.
O objeto do tipo SpeechConfig
é, justamente, o objeto que utilizaremos para chamar os métodos que o Serviço Cognitivo para Converter Fala em Texto na Azure nos disponibiliza.
Crie um método construtor para que, sempre que essa classe for instanciada, a variável _configuracaoDaTranscricao
seja instanciada também.
public TranscricaoDeFala() => _configuracaoDaTranscricao = SpeechConfig.FromEndpoint(new Uri(_endpoint), _chave);
Adicione os códigos abaixo e não esqueça de fechar todas as chaves da classe:
public async Task<string> Ouvir(Idioma idioma) { _configuracaoDaTranscricao.SpeechRecognitionLanguage = idioma.Codigo; using var reconhecer = new SpeechRecognizer(_configuracaoDaTranscricao); var resultado = await reconhecer.RecognizeOnceAsync(); if (resultado.Reason == ResultReason.RecognizedSpeech) return $\"Reconhecido: \"{resultado.Text}\" (em {idioma.Nome})\"; var semReconhecimento = \"Não foi possível reconhecer a fala.\"; if (resultado.Reason == ResultReason.Canceled) { var cancelamento = CancellationDetails.FromResult(resultado); semReconhecimento += $\"Cancelado por: \"{cancelamento.Reason}\".\"; if (cancelamento.Reason == CancellationReason.Error) semReconhecimento += $\"Erro: \"{cancelamento.ErrorDetails}\".\"; } return semReconhecimento; } } }
Essa classe contém apenas um método, que chamamos de Ouvir
()
. Tal método é responsável por entender o áudio, a partir da entrada de áudio padrão, que queremos que o Serviço Cognitivo transcreva em texto no idioma que escolhemos que ele entenda.
Dentro dele, o método que efetivamente captura o áudio pela entrada de som padrão é o reconhecer.RecognizeOnceAsync
. Após ele, apenas verificamos se a execução foi concluída com sucesso, ou não, e retornamos uma mensagem de acordo com a situação.
A classe inteira pode ser visualizada no github.
5. Crie a classe Idioma.cs ainda no projeto SpeechToText.
Ainda no projeto chamado de SpeechToText crie uma nova classe e dê o nome de Idioma.cs. Essa classe será responsável por guardar informações sobre o idioma escolhido, bem como listar todos os idiomas que temos disponíveis.
Comece colocando o Using necessário para o funcionamento correto da classe:
using System.Collections.Generic;
Depois adicione o método construtor da classe e as propriedades do mesmo.
namespace SpeechToText { public class Idioma { private Idioma(string nome, string codigo) { Nome = nome; Codigo = codigo; } public string Nome { get; private set; } public string Codigo { get; private set; }
Note que o método construtor da classe é privado, o que indica que ninguém, fora ela mesma, consegue criar instâncias.
Além disso, todas as propriedades possuem sua propriedade set
também privada.
Nessa classe temos as informações necessárias para definir qualquer idioma.
Agora, por fim, coloque o restante do código e não esqueça de fechar as chaves ao final da classe.
public static IEnumerable<Idioma> IdiomasDisponiveis() => new List<Idioma>(10) { new Idioma(\"Português (Brasil)\", \"pt-BR\"), new Idioma(\"Inglês (EUA)\", \"en-US\"), new Idioma(\"Espanhol\", \"es-ES\"), new Idioma(\"Finlandês\", \"fi-FI\"), new Idioma(\"Francês\", \"fr-FR\"), new Idioma(\"Italiano\", \"IT-IT\"), new Idioma(\"Japonês\", \"ja-JP\"), new Idioma(\"Holandês\", \"nl-NL\"), new Idioma(\"Russo\", \"ru-RU\"), new Idioma(\"Chinês\", \"zh-CN\"), }; } }
Esse método, por estar dentro da mesma classe, consegue criar instâncias da mesma. Por isso retorna uma lista contendo diversos idiomas.
Note que todos os idiomas, e seus códigos, estão fixos no código, o que chamamos de hard coded, pois o kit de desenvolvimento para este Serviço Cognitivo ainda não conta com uma forma de listar os idiomas disponíveis. Mas, você pode ver todos acessando aqui. Fique a vontade para adicionar, ou remover, idiomas.
A classe inteira pode ser visualizada no github.
6. Crie o arquivo SpeechToText.cshtml no projeto AzureCognitiveServices
Dentro do projeto AzureCognitiveServices utilize a pasta Speech, dentro da pasta Pages. Nesta pasta adicione uma Razor Page e a chame de SpeechToText.cshtml.
Nela, criaremos o formulário responsável por iniciar a captura de áudio, bem como o idioma da fala que será convertida em texto.
Vamos, primeiro, editar o código do servidor. Para isso, clique com o botão direito no arquivo aberto e vá em Go to PageModel ou aperte o F7.
Esse arquivo é responsável pelo código C# desta página. Comece colocando os usings.
using Microsoft.AspNetCore.Mvc.RazorPages; using SpeechToText; using System.Collections.Generic; using System.Linq;
Adicione agora as variáveis que utilizaremos na classe.
namespace AzureCognitiveServices { public class SpeechToTextModel : PageModel { public string Mensagem { get; private set; } = string.Empty; public readonly IEnumerable<Idioma> Idiomas;
Temos apenas duas variáveis. A primeira, string
Mensagem
, é responsável por armazenar a mensagem de sucesso, ou erro, da conversão de fala em texto e, por padrão, começa como uma string
vazia (string
.Empty
).
Já a outra é uma lista que conterá todos os idiomas disponíveis, a chamamos de IEnumerable
<Idiomas>
.
Crie o método construtor.
public SpeechToTextModel() => Idiomas = Idioma.IdiomasDisponiveis();
O método construtor apenas alimenta a lista de Idiomas que criamos para ser exibida no HTML.
Por último, crie o método post
para capturar os envios do formulário HTML e não esqueça de fechar as chaves da classe.
public void OnPost() { var idioma = Idiomas.FirstOrDefault(n => Request.Form[\"idioma\"].Equals(n.Codigo)); Mensagem = new TranscricaoDeFala().Ouvir(idioma).Result; } } }
O método post dessa classe é bem curto, ele começa verificando qual o idioma foi escolhido e, por fim, chama o método da classe que criamos no passo 4. Implemente a Conversão de Fala em Texto na classe TranscricaoDeFala.cs e armazena o texto resultante na variável Mensagem
.
Isso encerra o código da parte do servidor. Vamos voltar a parte do HTML.
A classe HTML terá o código inicial. O altere para isso:
@page @model AzureCognitiveServices.SpeechToTextModel @{ ViewData[\"Title\"] = \"Fala para Texto\"; var corDoAlert = Model.Mensagem.ToLower().StartsWith(\"não\") ? \"danger\" : \"success\"; } <h1>Fala para Texto</h1>
No início do código HTML verificamos se a variável Mensagem
, do servidor, possui alguma informação e qual é ela. Então modificamos a cor do alerta de acordo com isso.
Coloque o seguinte código HTML no restante do arquivo:
<form method=\"post\"> <div> <div> <div> <label for=\"idioma\">Idioma:</label> <select name=\"idioma\" id=\"idioma\" required> @foreach (var idioma in Model.Idiomas) { <option value=\"@idioma.Codigo\">@idioma.Nome</option> } </select> </div> </div> </div> <br /> <br /> <div> <button type=\"submit\">Ouvir</button> </div> </form> @if (!string.IsNullOrWhiteSpace(Model.Mensagem)) { <div role=\"alert\"> @Model.Mensagem <button type=\"button\" data-dismiss=\"alert\" aria-label=\"Close\"> <span aria-hidden=\"true\">×</span> </button> </div> }
Este código tem apenas o HTML que gerará um formulário contendo o campo para escolha do idioma, obrigatória para Converter Fala em Texto, e um botão para iniciar o processo de captura de áudio pela entrada padrão e transcrição.
Cada opção do campo de idioma é um elemento da lista de Idiomas do servidor, que estamos percorrendo com um foreach
.
Ao final, caso a variável Mensagem possua alguma informação, uma alerta é exibido e sua cor depende do conteúdo da mensagem.
Os arquivos inteiros podem ser visualizados no github, tanto o arquivo de HTML, quando a classe do servidor.
7. Adicione ao menu a página para Converter Fala em Texto criada
Agora que tudo está criado, chegamos ao momento de adicionar ao menu a página criada. Para isso, vá na pasta Shared e abra o arquivo _Layout.cshtml. Esse arquivo tem todo o layout que é compartilhado por todas as páginas, o que se repete em todas, como menu e footer, por exemplo.
No artigo anterior criamos um menu para todos os serviços cognitivos da categoria Fala, então, apenas complemente esse menu com mais uma opção.
Logo abaixo da opção de Texto para Fala, adicione o seguinte código:
<a asp-page=\"/Speech/SpeechToText\">Fala para Texto</a>
Isso fará com que o menu tenha mais uma opção, similar a imagem a seguir.
O arquivo inteiro pode ser visualizado no github.
Conclusão
Com o Serviço para Converter Fala em Texto na Azure conseguimos, de forma rápida, uma aplicação que faz a conversão, rápida, de qualquer fala, em diversos idiomas, para um texto preciso. O que pode ajudar em diversos cenários em um produto.
Com isso, a estrutura atual do seu projeto deve estar se parecendo assim:
Todo o projeto está disponível no github com uma licença que possibilita colaboração. Sinta-se a vontade.