El API de reconocimiento de voz duplicó frases en Android

He descubierto que el API de reconocimiento de voz duplica frases de resultado en mi Android (y no se duplica en el escritorio).

Para cada frase dicha, devuelve dos resultados. El primero es

Introduzca aquí la descripción de la imagen

Y el segundo es

Introduzca aquí la descripción de la imagen

Como ves, en la segunda vuelta, la frase está duplicada, cada copia está marcada como final y la segunda está más allá de resultIndex . En la primera vuelta hay solamente una copia, es final y está más allá de resultIndex .

Me gustaría tomar sólo segundo regreso, pero el problema es que sucede en Chrome móvil, pero no sucede en Chrome escritorio. Chrome escritorio devuelve sólo la primera devolución.

Por lo tanto, la pregunta es: ¿es esto por comportamiento de diseño? Entonces, ¿cómo distinguir la única frase final, a continuación, comúnmente para todas las computadoras?

O puede ser este es un error como eco de sonido, entonces la pregunta es cómo evitar / echo de verificación?

ACTUALIZAR

Html es el siguiente:

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

El código es el siguiente:

 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/

Prueba esto:

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

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

Los resultados proporcionados en Chrome Mobile con respecto a la propiedad result.isFinal parecen tener un error o en cualquier caso diferir de los del escritorio de Chrome. Una posible solución consiste en comprobar el atributo de confianza de la (primera) alternativa:

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

También parece que a veces el resultado final se emite dos veces (con el mismo valor de confidence ), en ese caso, es posible que desee rebatirlo o simplemente procesar el primer evento, como esto:

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

Donde lastDebounceTranscript es una variable que se inicializa fuera del ámbito del controlador de eventos

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.