8

Ho trovato che le frasi duplicate speech recognition API generano sul mio Android (e non si duplica sul desktop).Frasi duplicate dell'API di riconoscimento vocale su Android

Per ogni frase detta, restituisce due risultati. Il primo è

enter image description here

e la seconda è

enter image description here

Come si vede, nella seconda di ritorno, frase è duplicato, ogni copia è contrassegnato come final e la seconda è al di là resultIndex. Al primo ritorno c'è solo una copia, è final ed è oltre resultIndex.

Vorrei prendere solo il secondo ritorno, ma il problema è che accade su Chrome mobile, ma non accade sul desktop Chrome. Il desktop Chrome restituisce solo il primo reso.

Quindi, la domanda è: è questo comportamento di progettazione? Quindi come distinguere la frase finale singola poi comunemente per tutti i computer?

Oppure questo potrebbe essere un errore come l'eco del suono, quindi la domanda è come evitare/controllare l'eco?

UPDATE

HTML è seguente:

<input id="recbutton" type="button" value="Recognize"> 
<div id="output"> 

    <div> 
    Initial text 
    </div> 

</div> 

Codice è seguente:

var recognition = null; 
var recognitionStarted = false; 
var printcount = 1; 
var lastPhrase = null; 

$(function() { 
    attachRecognition(); 
}); 

$('#recbutton').click(function() { 
    if(!recognitionStarted) { 
    recognition.start(); 
    } 
    else { 
    recognition.stop(); 
    } 
}); 

function printOut(text) { 
    var id = 'printcount' + printcount; 
    printcount++; 

    $('#output').append(
    "<div id='" + printcount + "'>" + text + "</div>" 
); 

    $("#output").animate({ scrollTop: $("#output").prop('scrollHeight')}); 

    return printcount; 

} 


function attachRecognition() { 

    if (!('webkitSpeechRecognition' in window)) { 

    $('button').prop('disabled', true); 

    recognition = null; 

    } else { 
    $('button').prop('disabled', false); 

    recognition = new webkitSpeechRecognition(); 

    recognition.continuous = true; 
    recognition.interimResults = true; 
    recognition.lang = "en-US"; 

    recognition.onstart = function(event) { 
     recognitionStarted = true; 
     printOut("speech recognition started"); 
    }; 

    recognition.onend = function(event) { 
      recognitionStarted = false; 
      printOut("speech recognition stopped"); 
    }; 

    recognition.onresult = function(event) { 

     var finalPhrase = ''; 
     var interimPhrase = ''; 
     var result; 
     var printcount; 

     for(var i=0; i<event.results.length; ++i) { 
     result = event.results[i]; 
     if(result.isFinal) { 
      finalPhrase = finalPhrase.trim() + ' ' + result[0].transcript; 
     } 
     else { 
      interimPhrase = interimPhrase.trim() + ' ' + result[0].transcript; 
     } 
     } 

     if(!lastPhrase) { 
     printcount = printOut(''); 
     lastPhrase = $('#' + printcount); 
     } 

     lastPhrase.html(finalPhrase.trim() + ' ' + interimPhrase.trim()); 

     if(finalPhrase.trim()) { 
     lastPhrase = null; 
     } 


    }; 
    } 
} 

JsFiddle: https://jsfiddle.net/dimskraft/envwao8o/1/

risposta

1

Prova questo:

recognition.continuous = false; 
recognition.interimResults = false; 
recognition.maxAlternatives = 1; 

JSFiddle: https://jsfiddle.net/envwao8o/4/

+1

recognition.continuous = false; non accetterà l'input continuo dall'utente. – dirtyhandsphp

0

I risultati forniti su Chrome cellulare per quanto riguarda la proprietà result.isFinal sembrano avere un bug o comunque differire da quelli su Chrome desktop. Una soluzione possibile è quello di verificare l'attributo fiducia del (primo) alternativa:

onResultHandler(event) { 
    let i = event.resultIndex; 
    let result = event.results[i]; 
    let isFinal = result.isFinal && (result[0].confidence > 0); 
} 

Sembra anche che a volte il risultato finale viene emesso due volte (con lo stesso valore confidence), in questo caso si consiglia di bouncing o semplicemente elaborare il primo evento, in questo modo:

if (isFinal) { 
    transcript = result[0].transcript; 

    if(transcript == lastDebounceTranscript) { 
     return; 
    } 

    lastDebounceTranscript = transcript; 

} 

dove lastDebounceTranscript è una variabile che si inizializza al di fuori del campo di applicazione del gestore di eventi