8

Znalazłem, że speech recognition API duplikuje wyniki fraz na moim Androidzie (i nie powiela się na pulpicie).Rozpoznawanie mowy API powielonych zwrotów na Androida

Dla każdej wyrażonej frazy zwraca dwa wyniki. Pierwszym z nich jest

enter image description here

a drugi jest

enter image description here

Jak widać, w drugim powrocie zdanie jest powielany, każdy egzemplarz jest oznaczony jako final i drugi jest poza resultIndex. Przy pierwszym powrocie jest tylko jedna kopia, to jest final i jest poza resultIndex.

Zrobiłbym tylko drugi zwrot, ale problemem jest to, że dzieje się to w mobilnym Chrome, ale nie dzieje się na komputerze Chrome. Desktop Chrome zwraca tylko pierwszy zwrot.

Pytanie brzmi: czy to zachowanie projektowe? W jaki sposób odróżnić pojedynczą ostatnią frazę, a następnie powszechnie dla wszystkich komputerów?

A może to jakiś błąd, taki jak echo dźwiękowe, wtedy pytanie brzmi: jak uniknąć/sprawdzić echo?

UPDATE

HTML jest następujący:

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

    <div> 
    Initial text 
    </div> 

</div> 

Kod jest następujący:

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/

Odpowiedz

1

Spróbuj tego:

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

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

+1

recognition.continuous = false; nie akceptuje ciągłego wprowadzania danych od użytkownika. – dirtyhandsphp

0

Wyniki przedstawione na Chrome komórkowego dotyczących własności result.isFinal wydają się mieć błąd lub w każdym przypadku różnią się od tych na pulpicie Chrome. Możliwym rozwiązaniem jest sprawdzić atrybut ufności (pierwszego) alternatywa:

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

Wygląda też na to, że czasami efekt końcowy jest emitowany dwukrotnie (z tą samą wartością confidence), w tym przypadku może chcesz ZWLOKA go lub po prostu przetworzyć pierwsze zdarzenie, jak to:

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

    if(transcript == lastDebounceTranscript) { 
     return; 
    } 

    lastDebounceTranscript = transcript; 

} 

gdzie lastDebounceTranscript jest zmienną, która zainicjować poza zakresem obsługi zdarzeń

Powiązane problemy