Режимы распознавания речи дублированные фразы на Android

Я обнаружил, что API распознавания речи дублирует результирующие фразы на моем Android (и не дублирует на рабочем столе).

Для каждой фразы он возвращает два результата. Первый

Введите описание изображения здесь

А второй –

Введите описание изображения здесь

Как вы видите, во втором возврате фраза дублируется, каждая копия помечена как final а вторая – вне resultIndex . В первом возвращении есть только одна копия, она является final и она выходит за пределы resultIndex .

Я бы взял только второе возвращение, но проблема в том, что это происходит на мобильном Chrome, но этого не происходит на настольном Chrome . Desktop Chrome возвращает только первый возврат.

Итак, вопрос в том, является ли это поведением дизайна? Тогда как отличить одну заключительную фразу, а затем обычно для всех компьютеров?

Или может быть, это некоторая ошибка, например, звуковое эхо, тогда вопрос заключается в том, как избежать / проверить эхо?

ОБНОВИТЬ

Html:

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

Код выглядит следующим образом:

 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/

Попробуй это:

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

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

Результаты, предоставленные на мобильном устройстве Chrome относительно результата result.isFinal похоже, имеют ошибку или в любом случае отличаются от тех, что присутствуют на рабочем столе Chrome. Возможным обходным решением является проверка атрибута доверия (первой) альтернативы:

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

Также похоже, что иногда конечный результат испускается дважды (с тем же confidence значением), в этом случае вы можете захотеть его отбросить или просто обработать первое событие, например:

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

Где lastDebounceTranscript – это переменная, которую вы инициализируете вне области действия обработчика события