Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Como parar o reconhecimento após acertar o valor?

Esse é meu código (parte dele):

// % Web Speech Speech Recognition 
const elemChute = document.querySelector("#chute")

var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const recognition = new SpeechRecognition();
recognition.lang = 'pt-Br'

recognition.start()

recognition.addEventListener('result', onSpeak)

function onSpeak(e) {
    let chute = e.results[0][0].transcript
    chute = parseInt(chute)
    elemChute.style.display = 'block'
    if (!isNaN(chute)) {
        elemChute.innerHTML = `
            <div>Você disse:</div>
            <span id="box-chute" class="box">${chute}</span>
        `

        comparaChute(chute)
    } else {
        elemChute.innerHTML = 'Seu chute não é um número. Tente outra vez'
    }
    validaChute(chute)
}

recognition.addEventListener('end', () => recognition.start())

// % Validação

function validaChute(chute) {
    //console.log(chute)
    if (chute > max || chute < min) {
        elemChute.innerHTML += `<div class="valor-invalido">Valor inválido.</div><div class="mensagem-erro">O número secreto está entre ${min} e ${max}.</div>`
    }
}

function comparaChute(chute) {
    if (chute === numeroSecreto) {
        elemChute.innerHTML += '<div class="mensagem-acerto">Aeee!</div><div class="mensagem-acerto">Você acertou!!</div>'
        recognition.stop()
    } else {
        if (numeroSecreto > chute) {
            elemChute.innerHTML += '<div>O número secreto é maior <i class="fa-solid fa-circle-up"></i></div>'
        } else if ((numeroSecreto < chute)){
            elemChute.innerHTML += '<div>O número secreto é menor <i class="fa-solid fa-circle-down"></i></div>'
        }
    }
}

No if (chute === numeroSecreto) coloquei recognition.stop() como diz na documentação, mas a página continua reconhecendo a voz. O que pode estar errado?

2 respostas
solução!

Olá! Tudo bem?

Você está no caminho certo ao chamar recognition.stop() quando o chute é igual ao número secreto.

No entanto, observe que você tem um evento de 'end' que está reiniciando o reconhecimento de voz sempre que ele termina:

recognition.addEventListener('end', () => recognition.start())

Essa linha de código está dizendo: "Sempre que o reconhecimento de voz terminar, comece-o novamente". Isso significa que mesmo que você pare o reconhecimento de voz quando o usuário acerta o número secreto, esse evento 'end' irá reiniciá-lo imediatamente.

Uma solução possível para o seu problema seria criar uma variável de controle para verificar se o usuário acertou o número secreto. Algo como:

let acertou = false;

function comparaChute(chute) {
    if (chute === numeroSecreto) {
        acertou = true;
        // restante do código
    } else {
        // restante do código
    }
}

E então, no seu evento 'end', você pode verificar se o usuário acertou antes de reiniciar o reconhecimento:

recognition.addEventListener('end', () => {
    if (!acertou) {
        recognition.start();
    }
})

Dessa forma, se o usuário acertou o número secreto, o reconhecimento de voz não será reiniciado.

Espero ter ajudado e bons estudos!

valeu xará!