Nesse post veremos como fazer uma pesquisa de voz utilizando web speech api. Uma API do HTML5 poderosa presente no seu navegador.
Em outro post nos abordamos o funcionamento da web speech api, você pode conferir clicando aqui. Nesse artigo vamos ver mais um caso de uso interessante para diversas aplicações web.
Sobre o projeto desse post.
Antes de por a mão na massa vamos entender antes qual é a ideia desse projeto. Imagine que você tem uma loja virtual e quer melhorar a experiência dos seus usuários. Para isso você inicia uma serie de pesquisas com seus usuários, nela, você percebe que os resultados de busca da sua loja não é tão bom. O nome dos seus produtos é muito longo, ou difícil, e o usuário acaba não digitando corretamente alguns termos. Por exemplo “blusa tshirt feminina vermelha”
Para melhora a busca do seu e-commerce você começa a implementar diversas melhorias e uma delas é a busca por voz. Agora o usuário pode clicar em um botão, falar o termo que deseja buscar e por fim ter um resultado de busca de acordo com o termo buscado/falado.
Começando a implementar a busca por voz.
Antes de começar vamos considerar uma API pronto que receber um termo e retorna uma lista de produtos. Não vamos nos aprofundar na parte de busca dentro do bakck-end. A ideia aqui é mais o trabalho do front-end de captura de voz.
Vamos começar adicionando um botão para ativar a busca por voz no HTML, além disso, vamos colocar também um modal que indica quando a API está ouvindo ou não o usuário.
.... <button id="mic"><i class="fas fa-microphone"></i></button> .... <div class="modal"> <div class="content"> <i class="fas fa-microphone"></i> <h3>Ouvindo...</h3> </div> </div> ...
Agora um pequeno trecho de CSS para estilizar o modal.
.modal { position: fixed; top: 0; left: 0; bottom: 0; right: 0; display: none; align-items: center; justify-content: center; } .modal.ativo { display: flex; padding: 20px; } .modal .content { width: 400px; height: 400px; border-radius: 10px; display: flex; align-items: center; justify-content: center; flex-direction: column; background-color: #ccc; } .modal .content i { font-size: 60px; }
Agora o JavaScript. Vamos começar verificando se API está disponível para o seu navegador, posso fazer isso com um if.
... if (window.SpeechRecognition || window.webkitSpeechRecognition) { ... } else { alert('Seu navegador não suporta API de voz') } ...
A seguir, o código mais completo seguido de alguns comentários descrevendo o que cada linha faz.
if (window.SpeechRecognition || window.webkitSpeechRecognition) { const micButton = document.getElementById("mic"); // Guarda o botão na const const modal = document.querySelector('.modal'); // Guarda o modal na const const modalLabel = document.querySelector('.modal h3'); // Guarda o H3 na const const MySpeech = new webkitSpeechRecognition(); // Instancia a API SpeechRecognition MySpeech.lang = "pt-BR"; // Define a linguágem a ser processada // Função que será executada quando clicar no botão mic const clickOnMicButton = () => { modal.classList.add('ativo'); // Add a classe ativo no modal. Com essa classe ele é mostrado em tela try { MySpeech.start(); // Tenta iniciar o MySpeech } catch (error) { // Caso aconteça algo de errado será exibido um alerta, o modal fechará e um console de erro no terminal. alert('Algo deu errado. Tente novamente'); console.error(error); modal.classList.remove('ativo'); } }; // Função executa quando obtemos um resultado positivo da API. const onMySpeechResult = (event) => { const sentense = event.results[0][0].transcript; // Palavra/sentensa que a API reconheceu modalLabel.innerHTML = `Você disse "${sentense}"`; // Altera o texto do modal // Faz uma requisição para sua API de busca fetch(`/search?q=${sentense}`) .then( resp => resp.json()) .then(data => { /* O parametro DATA contem uma lista de produtos. Aqui você pode fazer a listagem em tela dos produtos fazendo um data.map( item => <Componente>); ou algo do tipo. */ }) .catch(error => console.error(error)); }; MySpeech.addEventListener("result", onMySpeechResult); micButton.addEventListener("click", clickOnMicButton); }
Você pode conferir um exemplo funcional desse código no meu perfil do CodePen.io.
See the Pen
Voice search by Raphael Correa (@RaphaelCorrea)
on CodePen.
Gostou? Então comenta ai o que você achou.